随着公司项目不断增大,项目打包编译的时长也不断增加,尤其是在公司使用 jenkins 自动化部署以后更甚。由此我想到此问题可能是引入依赖过多而造成。通过 google 查看分析,终于找到相关问题并初步实践,方法如下:

1. 使用 webpack-bundle-analyzer 分析项目外部依赖大小

1
2
3
4
# NPM
npm install --save-dev webpack-bundle-analyzer
# Yarn
yarn add -D webpack-bundle-analyzer

官网显示的使用方法,需要在 webpack.config.js 内配置:

1
2
3
4
5
6
7
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = {
plugins: [
new BundleAnalyzerPlugin()
]
}

而我们的项目是使用 vue-cli3 搭建,其内置 webpack (也就是没有 webpack.config.js),因此我们找到 vue.config.js 使用如下代码引入插件:

1
2
3
4
5
6
7
8
9
10
// vue.config.js
module.exports = {

chainWebpack: config => {
//*//
config
.plugin('webpack-bundle-analyzer')
.use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
},
}

此时运行 yarn serve 会执行 webpack-bundle-analyzer 插件 BundleAnalyzerPlugin 的默认功能

serve 完成,会在浏览器自动生成依赖大小分析的可视化网站,如下图所示

2. 使用 webpack 外部扩展(externals)

防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖

使用前打包时间

使用 externals 过滤我们希望通过 cdn 引入的依赖,同样在 vue.config.js 配置:
(注意所需依赖的别名)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// vue.config.js
module.exports = {

chainWebpack: config => {
//*//
config.externals({
'axios': 'axios',
'vue': 'Vue',
'vue-router': 'VueRouter',
'vuex': 'Vuex',
'element-ui': 'ELEMENT' // 注意此处要全大写且 Vue.use(ELEMENT)
})
},
}

而后在项目 index.html 文件内引入对应 cdn

1
2
3
4
5
6
<!-- public/index.html -->
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js"></script>
<script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script>
<script src="https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js">
<script src="https://cdn.bootcss.com/element-ui/2.3.3/index.js"></script>

需要将原来的引用注释,我们的过滤才能生效

1
2
// import Vue from "vue"
// import Element from "element-ui"

再次使用 webpack-bundle-analyzer,可以看到依赖的体积减少了近 10 M

使用后打包时间

再次打包,打包时间缩短了近一倍

未完待续。。。


参考
vue-cli3 使用 webpack-bundle-analyzer 插件;
解决 vue 打包 wendor 过大的问题