2021-05-06-vue优化
背景
项目越做越大,页面越来越多,导致项目也越来越卡顿。
解决思路
- 1、首屏优化
- 2、技术债务编码优化
- 3、打包优化,cdn
首屏优化
在Vue项目中,引入到工程中的所有js、css文件,编译时都会被打包进vendor.js,浏览器在加载该文件之后才能开始显示首屏。若是引入的库众多,那么vendor.js文件体积将会相当的大,影响首屏的体验。利用webpack的externals配置。防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖(external dependencies)。
- 首先安装webpack的可视化资源分析工具,命令行执行:
1 | |
2.1 然后在webpack的dev开发模式配置中,引入插件,代码如下:const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer')
1 | |
2.2 vue-cli3中vue.config.js中加入配置
1 | |
最后命令行执行npm run build –report , 浏览器会自动打开分析结果
app.xxx.js 文件过大
解决方案:
- 代码分割 CommonsChunkPlugin;
- 提取第三方库 vendor
- 外部引入第三方库 external
- 设置缓存
- 代码压缩 uglifyJsPlugin
引入CommonChunkPlugin,并在router/index.js中使用require.ensure()进行组件的引入:
一、对于第三方js库的优化,分离打包
生产环境是内网的话,就把资源放内网,通过静态文件引入,会比node_modules和外网CDN的打包加载快很多。如果有外网的话,可以通过CDN方式引入,因为不用占用访问外网的带宽,不仅可以为您节省流量,还能通过CDN加速,获得更快的访问速度。但是要注意下,如果你引用的CDN 资源存在于第三方服务器,在安全性上并不完全可控。
目前采用引入依赖包生产环境的js文件方式加载,直接通过window可以访问暴露出的全局变量,不必通过import引入,Vue.use去注册
在webpack的dev开发配置文件中, 加入如下参数,可以分离打包第三方资源包,key为依赖包名称,value是源码抛出来的全局变量。如下图所示,可以看到打包后vue相关资源包已经排除在外了。对于一些其他的工具库,尽量采用按需引入的方式。
1 | |
四、开启gizp压缩
gizp压缩是一种http请求优化方式,通过减少文件体积来提高加载速度。html、js、css文件甚至json数据都可以用它压缩,可以减小60%以上的体积。前端配置gzip压缩,并且服务端使用nginx开启gzip,用来减小网络传输的流量大小。
命令行执行:npm i compression-webpack-plugin -D在webpack的dev开发配置文件中加入如下代码:const CompressionWebpackPlugin = require(‘compression-webpack-plugin’)
1 | |
前端项目配置Gzip的两种方式
1、静态压缩:前端工程打包成Gzip,然后nginx开启Gzip模块
- vue-cli生成的项目,安装 compression-webpack-plugin 插件
- nginx配置gizp
1 | |
2、直接采用nginx进行Gzip化
2.1 nginx配置gizp
1 | |
2.2 开启gzip
1 | |
前后端gzip压缩区别;
nginx开启gzip 压缩会耗费cpu资源;会降低
双端Gzip区别及其意义
不同之处在于:
- 1、Webpack压缩会在构建运行期间一次压缩文件,然后将这些压缩版本保存到磁盘。
- 2、nginx在请求时压缩文件时,某些包可能内置了缓存,因此性能损失只发生一次(或不经常),但通常不同之处在于,这将在响应 HTTP请求时发生。
- 3、对于实时压缩,让上游代理(例如 Nginx)处理 gzip和缓存通常更高效,因为它们是专门为此而构建的,并且不会遭受服务端程序运行时的开销(许多都是用C语言编写的) 。
- 4、使用 Webpack的好处是, Nginx每次请求服务端都要压缩很久才回返回信息回来,不仅服务器开销会增大很多,请求方也会等的不耐烦。我们在 Webpack打包时就直接生成高压缩等级的文件,作为静态资源放在服务器上,这时将 Nginx作为二重保障就会高效很多。
- 5、注:具体是在请求时实时压缩,或在构建时去生成压缩文件,就要看项目业务情况。
原则:
1、小文件无需压缩,浪费资源
2、图片/mp3这样的二进制文件,不必压缩 因为压缩率比较小, 比如100->80字节