前言
这些优化方案适用于
Vue CLI 2
和Vue CLI 3
,文章主要基于Vue CLI 2
进行介绍,关于如何在Vue CLI 3
中进行相关的webpack
调整,我已经放在了 vue-cli3-optimization 这个仓库下,并配有详细的注释,且额外添加方便Sass
使用的loader
,使用Sass
时无需再在每个需要引入变量和mixin
的地方,每次都很麻烦的@import
。下面将详细介绍这些优化方案的实践方式和效果:
和很多小伙伴一样,我在开发Vue
项目时也是基于官方vue-cli@2
的webpack
模版,但随着项目越做越大,依赖的第三方npm
包越来越多,构建之后的文件也会越来越大,尤其是vendor.js
,甚至会达到2M
左右。再加上又是单页应用,这就会导致在网速较慢或者服务器带宽有限的情况出现长时间的白屏。为了解决这个问题,我做了一些探索,在几乎不需要改动业务代码的情况下,找到了三种有明显效果的优化方案 —— CDN
+ Gzip
+ Prerender
。我把这些方法整理了一下,放在了 Github仓库 上,意图通过不同的分支来展示不同的优化方式,对Vue
项目性能的影响。你可以直接克隆下来试一试,也得益于有git
历史,你也可以很方便的查看具体的改动细节。下面我将通过一个简单的项目来展示这三种优化方案的效果。
一、首先准备一个简单的项目
通过vue-cli@2
的webpack
模版生成,只包含最基础的Vue
三件套 ———— vue
、vue-router
、vuex
以及常用的element-ui
和axios
。拆分两个路由——“首页”和“通讯录”,通过axios
异步获取一个通讯录名单,并利用element-ui
的表格展示。直接build
,不做任何优化处理,以作参照。
1.1 构建后文件说明:
app.css
: 压缩合并后的样式文件。app.js
:主要包含项目中的App.vue
、main.js
、router
、store
等业务代码。vendor.js
:主要包含项目依赖的诸如vuex
,axios
等第三方库的源码,这也是为什么这个文件如此之大的原因,下一步将探索如何优化这一块,毕竟随着项目的开发,依赖的库也能会越来越多。数字.js
:以0、1、2、3等数字开头的js
文件,这些文件是各个路由切分出的代码块,因为我拆分了两个路由,并做了路由懒加载,所以出现了0和1两个js
文件。mainfest.js
:mainfest
的英文有清单、名单的意思,该文件包含了加载和处理路由模块的逻辑
1.2 禁用浏览器缓存,网速限定为Fast 3G
下的Network
图(运行在本地的nginx
服务器上
可以看到未经优化的base
版本在Fast 3G
的网络下大概需要7秒多的时间才加载完毕
二、CDN 优化
为了更好的开发体验,报错捕获,目前已经针对
dev
和build
进行了区分,具体查看git
记录,下面仅供参考。
- 将依赖的
vue
、vue-router
、vuex
、element-ui
和axios
这五个库,全部改为通过CDN
链接获取。借助HtmlWebpackPlugin
,可以方便的使用循环语法在index.html
里插入js
和css
的CDN
链接。这里的CDN
大部分使用的 jsDelivr 提供的。
<!-- CDN文件,配置在config/index.js下 -->
<% for (var i in htmlWebpackPlugin.options.css) { %>
<link href="<%= htmlWebpackPlugin.options.css[i] %>" rel="stylesheet">
<% } %>
<% for (var i in htmlWebpackPlugin.options.js) { %>
<script src="<%= htmlWebpackPlugin.options.js[i] %>"></script>
<% } %>
- 在
build/webpack.base.conf.js
中添加如下代码,这使得在使用CDN
引入外部文件的情况下,依然可以在项目中使用import
的语法来引入这些第三方库,也就意味着你不需要改动项目的代码,这里的键名是import
的npm
包名,键值是该库暴露的全局变量。 webpack文档参考链接。
externals: {
'vue': 'Vue',
'vue-router'