Vue 打包 chunk-vendors.js 文件过大导致页面加载缓慢解决方案
前言
顾名思义,chunk-vendors.js
是捆绑所有不是自己的模块,而是来自其他方的模块的捆绑包,它们称为第三方模块或供应商模块。
通常,它意味着(仅和)来自项目 /node_modules
目录的所有模块,会将所有 /node_modules
中的第三方包打包到 chunk-vendors.js
中。
将所有的第三方包集中到一个文件,自然也会出现文件过大的问题。
解决方案
方案一 compression-webpack-plugin 插件解决方案
- 安装
npm install compression-webpack-plugin --save
// 引入compression-webpack-plugin
const CompressionPlugin = require('compression-webpack-plugin')
// 当前环境是vue.config.js 文件下的配置
chainWebpack: (config) => {
config.plugin('compressionPlugin').use(new CompressionPlugin({
test: /.(js|css|less)$/, // 匹配文件名
threshold: 1024, // 对超过10k的数据压缩
deleteOriginalAssets: false, // 不删除源文件
minRatio: 0.3, // 压缩比
}))
}
方案二 使用webpack optimization 进行对大文件分包打包
// 当前环境是vue.config.js 文件下的配置
configureWebpack: config => {
return {
// 开启分离 js
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all',
maxInitialRequests: Infinity,
minSize: 20000,
cacheGroups: {
vendor: {
test: /[\/]node_modules[\/]/,
name(module) {
// get the name. E.g. node_modules/packageName/not/this/part.js
// or node_modules/packageName
const packageName = module.context.match(/[\/]node_modules[\/](.*?)([\/]|$)/)[1]
// npm package names are URL-safe, but some servers don't like @ symbols
return `npm.${packageName.replace('@', '')}`
}
}
}
}
}
}
}