在Vue项目中,引入到工程中的全部js、css文件,编译时都会被打包进vendor.js,浏览器在加载该文件以后才能开始显示首屏。如果引入的库众多,那么vendor.js文件体积将会至关的大,影响首屏的体验。能够看个例子:
这是优化前的页面加载状态:执行npm run build
打包项目,出来的vendeor.js文件,基本都是1M以上的的巨大文件,没有用户能忍受5s以上的loading而不关闭页面的,如图所示:css
npm i webpack-bundle-analyzer -D复制代码
2. 而后在webpack的dev开发模式配置中,引入插件,代码以下:html
const BundleAnalyzerPlugin = require('webpack-bundle-plugin').BundleAnalyzerPlugin
plugins: [
new BundleAnalyzerPlugin()
]复制代码
3. 最后命令行执行npm run build --report
, 浏览器会自动打开分析结果,以下所示:前端
1、对于第三方js库的优化,分离打包vue
生产环境是内网的话,就把资源放内网,经过静态文件引入,会比node_modules和外网CDN的打包加载快不少。若是有外网的话,能够经过CDN方式引入,由于不用占用访问外网的带宽,不只能够为您节省流量,还能经过CDN加速,得到更快的访问速度。可是要注意下,若是你引用的CDN 资源存在于第三方服务器,在安全性上并不彻底可控。node
目前采用引入依赖包生产环境的js文件方式加载,直接经过window能够访问暴露出的全局变量,没必要经过import引入,Vue.use去注册webpack
在webpack的dev开发配置文件中, 加入以下参数,能够分离打包第三方资源包,key为依赖包名称,value是源码抛出来的全局变量。以下图所示,能够看到打包后vue相关资源包已经排除在外了。对于一些其余的工具库,尽可能采用按需引入的方式。ios
externals: {
vue: 'Vue',
vuex: 'Vuex',
'vue-router': 'VueRouter',
axios: 'axios',
'element-ui': 'ELEMENT'
}复制代码
在访问到当前页面才会加载相关的资源,异步方式分模块加载文件,默认的文件名是随机的id。若是在output中配置了chunkFilename,能够在component中添加WebpackChunkName,是为了方便调试,在页面加载时候,会显示加载的对应文件名+hash值,以下图:nginx
{
path: '/Login',
name: 'Login',
component: () = >import( /* webpackChunkName: "Login" */ '@/view/Login')
}复制代码
3、图片资源的压缩,icon资源使用雪碧图
web
gizp压缩是一种http请求优化方式,经过减小文件体积来提升加载速度。html、js、css文件甚至json数据均可以用它压缩,能够减少60%以上的体积。前端配置gzip压缩,而且服务端使用nginx开启gzip,用来减少网络传输的流量大小。vue-router
命令行执行:npm i compression-webpack-plugin -D
在webpack的dev开发配置文件中加入以下代码:
const CompressionWebpackPlugin = require('compression-webpack-plugin')
plugins: [
new CompressionWebpackPlugin()
]复制代码
启用gzip压缩打包以后,会变成下面这样,自动生成gz包。目前大部分主流浏览器客户端都是支持gzip的,就算小部分非主流浏览器不支持也不用担忧,不支持gzip格式文件的会默认访问源文件的,因此不要配置清除源文件。
5、webpack相关配置优化
(1)使用uglifyjs-webpack-plugin插件代替webpack自带UglifyJsPlugin插件来压缩JS文件;生产环境关闭源码映射,一方面能减小代码包的大小,另外一方面也有利于系统代码安全;清除打印日志和debugger信息;配置SplitChunks 抽取公有代码,提高你的应用的性能
(2)使用mini-xss-extract-plugin提取CSS 到单独的文件, 并使用optimize-css-assets-webpack-plugin来压缩CSS文件 。
注:具体相关webpack配置请点击 juejin.im/post/5d2070…查看第一篇webpack文章,注释很详细哟。
6、前端页面代码层面的优化
(1)合理使用v-if和v-show
(2)合理使用watch和computed
(3)使用v-for必须添加key, 最好为惟一id, 避免使用index, 且在同一个标签上,v-for不要和v-if同时使用
(4)定时器的销毁。能够在beforeDestroy()生命周期内执行销毁事件;也可使用$once这个事件侦听器,在定义定时器事件的位置来清除定时器。详细见vue官网
结语:前端性能优化相当重要,之后有遇到更好的其余方案会继续补充进来。你也能够在评论区留言探讨,有错误不足的地方欢迎大佬指出。