为什么要优化
一次打包一个用了vuetify的项目,打包结果如下
一看这chunk-vendors足足1000K+;要是放到小水管上果断扛不住。
开始优化
思路:1 使用公用cdn 2 拆分vendors里node_modules的依赖文件
使用cdn配置如下
1 2 3 4 5 6 7 8 9 10 11 12
| module.exports = { configureWebpack: config => { if (isProduction) { config.externals = { vue: "Vue", "vue-router": "VueRouter", moment: "moment" }; } } };
|
1 2 3 4 5
|
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.runtime.min.js"></script> <script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
|
拆分文件配置:
具体配置文档optimization,
split-chunks-plugin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| module.exports = { configureWebpack: config => { if (isProduction) { config.optimization = { runtimeChunk: "single", splitChunks: { chunks: "all", maxInitialRequests: Infinity, minSize: 20000, cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name(module) { const packageName = module.context.match( /[\\/]node_modules[\\/](.*?)([\\/]|$)/ )[1]; return `npm.${packageName.replace("@", "")}`; } } } } }; } } };
|
至此,打包结果如下(未使用CDN的情况)
nginx有两种gzip方案,gzip和gzip_static,推荐使用后者,gzip是针对于请求实时进行压缩,cpu开销大。gzip_static 可以在编译后使用压缩工具搞出来。
配置如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| module.exports={ configureWebpack: config => { if (isProduction) { config.plugins.push( new CompressionWebpackPlugin({ algorithm: "gzip", test: new RegExp("\\.(css|js)$"), threshold: 10240, minRatio: 0.8 }) ); } } }
|
打包结果如下
nginx开启gzip_static 配置
1 2 3 4 5 6 7 8 9 10 11 12 13
| server { # 省略 gzip off; gzip_static on; #静态压缩 gzip_min_length 10k; gzip_buffers 4 16k; gzip_comp_level 6; gzip_types *; gzip_disable "MSIE [1-6]\."; gzip_vary on;
# 省略 }
|
1 2 3 4
| FROM nginx ADD dist /usr/share/nginx/html ADD nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80
|
最终结果
优化后:
对比未优化前:
1 2 3
| # nginx config limit_rate 100k; #限制速度50K
|
未优化:
优化后
用技术文章的标题来说就是:网站打开速度提升了90%!
后记
拆分的js文件有点多,会影响加载速度,后期可以根据实际需求合并一些node_modules里的依赖文件,
比如 vue&vue-router&vuex可以合并为一份vue-all 的commonChunk文件,具体做法在split-chunks-plugin文档
webpack-bundle-analyzer 替我们提供了一个可视化的 dashboard,可以很直观的发现哪些第三方包或者代码文件占用的大小。