多入口
- 通过entry字段配置入口,例如
{
page1: './src/page1.js',
page2: './src/page2.js'
}
多出口,使用html-webpack-plugin
,有多少的出口就配置实例化多少个,同时通过chunks字段表示将那些chunk引入
new HtmlWebpackPlugin({
filename: 'page1.html',
template: 'page1.html',
inject: true,
title: 'page1',
chunks: ['page1','ventor'],
templateParameters: {
BASE_URL: config.build.assetsPublicPath + config.build.assetsSubDirectory,
},
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
}
}),
new HtmlWebpackPlugin({
filename: 'page2.html',
template: 'page2.html',
inject: true,
title: 'page2',
chunks: ['page2','ventor'],
templateParameters: {
BASE_URL: config.build.assetsPublicPath + config.build.assetsSubDirectory,
},
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
}
})
多出口的分包,主要借助optimization.splitChunks
- 首先这两页面使用公共包有vue和vuex,所以这要拆分成公共包
- page1使用了echart,page2没有使用,所以page2不要引入不相关的包
- 同时要结合
html-webpack-plugin
的chunks或者excludeChunks来表示包含或者排除那些chunk - 最后就是要对runtime的js拆分,不同的出口引入不同runtime运行代码,此处通过runtimeChunk设置为true或则multiple,详情可见webpack官网文档
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
ventor: {
name: 'ventor',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // 只打包初始时依赖的第三方
},
echart: {
name: 'chunk-echart',
test: /[\\/]node_modules[\\/]echart[\\/]/,
priority: 20, // 权重要ventor的权重高,优先级要更高,不然就打到ventor里面了
}
}
},
runtimeChunk: true,
minimizer: [
new UglifyJsPlugin({
uglifyOptions: {
mangle: {
safari10: true
}
},
sourceMap: config.build.productionSourceMap,
cache: true,
parallel: true
})
]
}
开发环境,config.dev.js
配置
- 开发环境,只开放一个入口一个出口,通过入口配置文件来控制,例如:
module.exports = {
page1: './src/page1.js',
page2: './src/page2.js'
}
- 通过入口配置文件来控制出口,即控制实例化多少个
html-webpack-plugin
, 由于出口的html名字不同,所以要根据入口动态配置下devServer的首页html, 即devServer.index = 'index.html' // 默认
借鉴的文档: