前端时间把项目的加载速度进行了统一的优化,主要使用了 CDN 加载框架和静态文件,还有启用了 Gzip 压缩,这里记录总结一下。
CDN使用
修改配置
打开 vue.config.js 配置文件,添加 externals:
1 | const externals = { |
这里需要注意,’:’ 号后面对应的文件名必须和项目里面 import 引入的文件昵称相同,例如: import Vue from 'vue'
就是上面对应的 'vue': 'Vue'
。
这里特别注意一下 element-ui 的昵称必须是: ‘ELEMENT’, 如果使用其它昵称将报错。具体看 element-ui 源码导出方式你就懂了~
然后,再添加 CDN 文件加载路径和不同环境的配置,注意,这里开发环境和生产环节都启用了,正常只有生产环境启用,这里测试是否可用在开发环境也启用了 CDN:
1 | const cdn = { |
导入配置:
1 | module.exports = { |
以上就是 vue.config.js 所需要做的配置了。
修改 index.html 文件
在 head 标签中循环导入 CDN 引入的 CSS 文件:
1 | <!-- 使用CDN加速的CSS文件,配置在vue.config.js下 --> |
然后在 body 中循环导入 CDN 引入的 js 文件:
1 | <!--使用CDN加速的JS文件,配置在vue.config.js下 --> |
以上就是 CDN 的配置了,这里不需要注释掉原来项目里面 import 导入的代码噢,不影响,很方便,可以随时取消 CDN 的引用而不用修改代码,需要注意的就是上面 externals 配置的昵称必须和 import 导入的别名相同。
Gzip 压缩
如果你觉得采用了 CDN 和各种代码优化后,还觉得首页加载太慢,又不想采用 SSR 的话,可以试试启用 Gzip 压缩噢,可以把文件的传输大小减少一半以上,加快文件的传输速度,自然就加快了首页的加载速度了。这里的配置还是基于 vue-cli3.0:
安装压缩文件插件:
npm i -D compression-webpack-plugin
在文件 vue.config.js 里导入 compression-webpack-plugin,并添加压缩文件类型
1 | const CompressionWebpackPlugin = require('compression-webpack-plugin') |
在configureWebpack 里配置如下代码:
1 | configureWebpack: { |
注意,上面的通用模式,可以只在生产环境使用:
1 | configureWebpack: config => { |
或者:
1 | if (process.env.NODE_ENV === 'production') { |
配置参数解释:
- asset: 目标资源名称。 [file] 会被替换成原始资源。[path] 会被替换成原始资源的路径, [query] 会被替换成查询字符串。默认值是 “[path].gz[query]”。
- algorithm: 可以是 function(buf, callback) 或者字符串。对于字符串来说依照 zlib 的算法(或者 zopfli 的算法)。默认值是 “gzip”。
- test: 所有匹配该正则的资源都会被处理。默认值是全部资源。
- threshold: 只有大小大于该值的资源会被处理。单位是 bytes。默认值是 0。
- minRatio: 只有压缩率小于这个值的资源才会被处理。默认值是 0.8。
- deleteOriginalAssets: false // 不删除源文件
打包后会同时保留原文件和压缩后的文件,存储等条件允许的情况下,原文件也建议发布到服务器以支持不兼容gzip的浏览器。
以上就是配置 Gzip 压缩前端需要完成的工作了,接下来还需要后端在 Nginx 上开启 Gzip 压缩:
Nginx 配置:
在 http {} 包裹的配置中配置参数。
1 | # 开启gzip |
注意:不是压缩级别越高越好,其实gzip_comp_level 1的压缩能力已经够用了,后面级别越高,压缩的比例其实增长不大,反而很吃处理性能。
这里启用了 gzip_static on
,如果服务器存在 .gz 文件则不压缩直接传输 .gz 文件,节省服务器带宽,需要注意的是 gzip_static
命令默认是没有的,参考nginx文档,需要在安装 nginx 的时候检查模块支持中是否含有 --with-http_gzip_static_module
模块,没有此模块的话,配置会报错不存在该指令。
另一方面,压缩一定要和静态资源缓存相结合,缓存压缩后的版本,否则每次都压缩高负载下服务器肯定吃不住。
开启 nginx 缓存
配置:
1 | location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ { |
其中的缓存时间可以自己根据需要修改。
关于字体
为静态资源开启缓存能够较少服务器带宽的消耗,特别是在css中使用字体时,同时配合gzip压缩能够大大减少下载字体造成的带宽影响。
设置字体缓存:
需要注意的是,字体有很多格式,为所有字体格式设置缓存是很有必要的:
1 | location ~* ^.+\.(eot|ttf|otf|woff|svg)$ { |
启用字体 gzip:
只需要为 ttf、otf 和 svg 字体启用 gzip,对其他字体格式进行 gzip 压缩时效果不明显。
1 | gzip_types font/ttf font/otf image/svg+xml |
测试命令:
curl -I -H "Accept-Encoding: gzip, deflate" "http://39.108.73.162:8082/vendor.js"
测试结果(需要出现Content-Encoding: gzip):
1 | HTTP/1.1 200 OK |
注意最后面这句: Content-Encoding: gzip 就OK~
nginx 参数说明请参考nginx文档