const isProd = process.env.NODE_ENV === 'production';
const externals = {
vue: 'Vue',
'vue-router': 'VueRouter',
'axios': 'axios',
'vuex': 'Vuex',
'lottie-web':'lottie',
'better-scroll': 'BetterScroll',
'swiper/swiper-bundle.min.js':'Swiper'
}
const cdn = {
dev: {
css: [],
js: []
},
build: {
css: [],
js: [
'https://aaa/vue2/vue.min.js',
'https://aaa/vuerouter/vue-router.min.js',
'https://aaa/axios/axios.min.js',
'https://aaa/vuex/vuex.min.js',
"https://aaa/lottie/lottie.min.js",
'https://aaa/bScroll/better-scroll.min.js',
'https://aaa/swiper/swiper-bundle.min.js',
]
}
}
module.exports = {
publicPath: "./",
lintOnSave: false,
productionSourceMap: false,
css: {
loaderOptions: {
postcss: {
plugins: [postcss],
},
},
},
configureWebpack: config => {
if (isProd) {
config.externals = externals
config.optimization.usedExports = true,
config.plugins.push(
new ImageminWebpWebpackPlugin({ //将图片转换为webp格式文件 结合v-webp指令使用
config: [
{
test: /\.(jpe?g|png)/,
options: {
quality: 95
}
}
],
overrideExtension: false
})
)
config.plugins.push(
// Webpack完成捆绑过程后要执行的命令:删除dist目录下ignore目录,prod-md5-zip目录
new FileManagerPlugin({
onEnd: [{
delete: [
`./dist/ignore`,
'./prod-md5-zip'
]
}]
})
)
}
config.plugins.push(
new CompressionWebpackPlugin({
algorithm: 'gzip',
test: new RegExp('\\.(' + ['js', 'css'].join('|') + ')$'),
threshold: 10240,
minRatio: 0.8
})
)
config.performance = {
maxAssetSize: 1024 * 400
}
},
chainWebpack: config => {
config.plugins.delete('prefetch')
config.plugins.delete('preload');
if (process.env.IS_ANALYZ) {
config.plugin('webpack-report').use(BundleAnalyzerPlugin, [
{
analyzerMode: 'static'
}
])
}
const svgRule = config.module.rule('svg')
svgRule.uses.clear()
svgRule.exclude.add(/node_modules/)
svgRule
.test(/\.svg$/)
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
config
.plugin('html')
.tap(args => {
args[0].title = projectConfig.title
if (isProd) {
args[0].cdn = cdn.build
}
return args
})
config.optimization.splitChunks({ //分割代码块
chunks: "all", //webapck的splitChunks默认只对按需加载的模块起作用,可通过改变该属性修改默认行为,可选的值:'async': 异步,即按需加载的模块。'all': 所有的模块,包括同步和异步。'initial': 初始加载的模块即同步模块。
minSize: 20000, // 文件最小大小,单位bite;即超过minSize有可能被分割;
minChunks: 2, //module至少被多少chunk引用才会生成新chunk。
maxAsyncRequests: 30, //限制异步模块内部的并行最大请求数的
maxInitialRequests: 30, //允许入口并行加载的最大请求数
enforceSizeThreshold: 50000,
maxSize: 0,
cacheGroups: { 默认为vendors和default。可以设置权重值priority。
vendor一般放置node_modules里面的文件, default放置公共组件
// 单独抽离antv为一个打包文件
antv: {
name: 'chunk-antv',
priority: 20,
test: /[\\/]node_modules[\\/]_?@antv(.*)/,
},
//第三方依赖
vendor: {
priority: 1, //优先级,一个module可能被多个chunk引用,会被打包到优先级高的chunk里。
name: 'vendor',
test: /node_modules/,
chunks: 'initial',
minSize: 0,
minChunks: 1 //module至少被多少chunk引用才会生成新chunk。
},
//缓存组
common: {
//公共模块
chunks: 'initial',
name: 'common',
minSize: 100, //大小超过100个字节
minChunks: 3, //最少引入了3次
enforce: true //强制分包
},
// monaco库
monaco: {
chunks: "all",
name: "chunk-monaco",
priority: 4,
test: /monaco-editor/,
enforce: true,
reuseExistingChunk: true,
},
}
});
},
devServer: {
disableHostCheck: true,
proxy: {
"/h5": {
target: "http://bbbn.com.cn",
ws: true,
secure: true,
changeOrigin: true,
},
},
},
}
`