(原文在这里,若是对你有帮助的话,动动你的小手手给个星星呀)css
最近在作一个项目,技术栈为vue全家桶 + element-ui + echarts,打包后发现有1.44M,首屏体验不好。这能忍?果断开始优化。下面说说我是如何将一个打包后1.44MB的项目变成打包后只有0.42MB,性能提高70% 的。html
准备:vue
vue-cli
提供了一个很方便的查看代码打包后体积的命令,只需在正常的打包命令后加一个--report
便可,这样打包完成后会自动开启一个页面,展现各个依赖包的大小。webpack
npm run build --report
复制代码
优化前:git
先看看优化前的大小吧github
app.js
(3.2MB
)(注意是本地,未打包,未压缩)
1.44MB
,打包时间为72s
第一次优化:路由懒加载web
说到优化,第一个确定考虑的是懒加载啦,立刻在vue和vue-router的官方文档里找到了解决方案vue-router
结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载vue-cli
具体作法的话以下:npm
首先要安装一个插件Syntax Dynamic Import使项目支持动态import
cnpm install -S babel-plugin-syntax-dynamic-import
复制代码
而后修改.babelrc
文件
// .babelrc 中的plugins数组中多加一个"syntax-dynamic-import" { "plugins": ["syntax-dynamic-import"] } 复制代码
最后修改router.js
,将全部路由都改成动态加载
//router.js //原来的写法:import Home from '@/components/PC/Home' //改为下面这种形式(其余路由同理) const Home = () => import('@/components/PC/Home') 复制代码
OK,第一次优化完成。让咱们打包看看结果如何吧。
上面两张图分别是本地打包前首屏加载的js资源(经计算大约为3.1MB
)的截图和打包后的截图(1.44MB
),打包时间为 55s
。注意我红色框出来的部分,和优化前相比较打包的结果多了几个以0
1
等数字开头的js文件,这其实就是咱们的路由文件被分离了出来,首屏只加载了须要的0.js
和3.js
文件,等到咱们切换到其余路由的时候才会加载其余的2.js
或者4.js
,而不是像之前那样所有包含在了app.js
中一次性全加载出来。
和优化前相比,打包后大小没变,可是打包时间减小了,首屏加载的js资源也少了0.1MB
(坑爹么不是!!)。
打包体积没变,首屏才少了0.1MB?效果这么差,你特么在逗我?
别着急打我,听我解释。打包体积没变是由于无论路由怎么懒加载,实质上须要的路由文件仍是那么多,大小是不变的,因此体积没变。而首屏才少了0.1MB
,是由于这个项目原本就是个很小的项目,只有4个页面,并且这个项目的首页引入了echarts
原本就相对来讲比较大。
因此说这一步路由懒加载的优化是彻底ok的,效果很差是由于是我项目的缘由,少了的那0.1MB
是剩余未加载的路由文件大小。
若是你的项目有不少个页面,那么路由懒加载的效果应该会不差。
咱们再次看看这个图
echarts
和右边蓝色的框element-ui
体积占了大头,咱们先看element-ui
占了556KB
,如今开始针对element-ui
进行第二次优化 第二次优化:element-ui组件按需加载
针对element-ui
的优化,没啥好说的,具体作法,直接看文档里面的按需引入吧。 照着文档优化了之后,再次打包查看结果:
此次优化后,打包用了45s
,总大小由1.44MB
变成了1.16MB
element-ui
模块所占的大小也由556kb
变成了267kb
,效果还行。可是这点提高怎么知足的了我?解决了element-ui
,咱们看看另一个模块echarts
:
element-ui
还要过度!!足足占了606kb
,立刻针对最大的boss----echarts
进行优化。 第三次优化:使用 CDN 外部加载资源
此次优化主要是针对echarts
,在其文档里也有提到按需加载,可是此次咱们不用按需加载了,我想把echarts
完全干掉!咱们此次要使用webpack
的externals,参考这里
防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖(external dependencies)。具备外部依赖(external dependency)的 bundle 能够在各类模块上下文(module context)中使用,例如 CommonJS, AMD, 全局变量和 ES2015 模块。
具体作法:
首先在index.html
中引入echarts
的外部CDN(若是须要地图组件,也须要一并引入)
//index.html <script src="https://cdn.bootcss.com/echarts/4.1.0/echarts.min.js"></script> 复制代码
而后在webpack.base.config.js
中,作以下改动
//webpack.base.config.js module.exports中增长externals对象 module.exports = { externals: { "echarts": "echarts" //默认是配置引用的库(这里是echarts)暴露出的全局变量 }, } 复制代码
查看优化结果:
1.31MB
(没有算上echarts.min.js
,由于那是CDN资源),相对于第一次优化后的3.1MB
已经少了不少了。 打包后的截图以下
434.7KB
,并且此次打包只花了34s
,最重要的是echarts
也真的被干掉了!! 惊不惊喜!!意不意外!!
懒得看图的同窗能够直接看下面这张表格
# | 打包后体积 | 压缩后体积 | 首屏js资源 | 打包耗时 |
---|---|---|---|---|
优化前 | 1.44M | 425K | 3.2M | 72s |
第一次优化(路由懒加载) | 1.44M | 434K | 3.11M | 55s |
第二次优化(element-ui按需加载) | 1.16M | 381K | 1.3M | 45s |
第三次优化(引入外部CDN) | 434K | 121K | 1.3M | 34s |
能够看出,咱们的优化仍是颇有成效的,各类体积和打包耗时差很少减小了70% 左右。
这部分必定要看啊啊啊
npm run build --report
分析一波,而后根据分析结果来作相应的优化,谁占体积大就干谁externals
能够配合外部资源CDN轻松大幅度减小打包体积,适用于echarts
、jQuery
、lodash
这种暴露了一个全局变量的库webpack
层面的优化,性能优化不仅这些,还有其余方面的优化,好比页面渲染优化(减小重排)、网络加载优化等。