多入口: entry、output、plugins中多个HtmlWebpackPluginentries = function() {
var entryFiles = glob.sync(PAGE_PATH + "/*/*.js");
var map = {};
entryFiles.forEach(filePath => {
var filename = filePath.substring(
filePath.lastIndexOf("/") + 1,
filePath.lastIndexOf(".")
);
map[filename] = filePath;
});
return map;
};
entry: entries(),
output: {
path: config.build.assetsRoot,
// filename: '[name].[contentHash:8].js',
filename: utils.assetsPath('[name].[hash:7].js'),
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
plugins: [].concat(htmlPlugins) // 同样借助glob.sync(PAGE_PATH + "/*/*.js");
2. 抽离压缩css文件。 仅在webpack.prod.jsplugins: [
new MiniCssExtractPlugin({ 抽离css文件
filename: 'css/main.[contentHash:8].css'
})
],
optimization: { // 压缩css
minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
}
3. 抽离公共代码和第三方代码。 webpack.prod.js
initial 入口 chunk,对于异步导入的文件不处理; async 异步 chunk,只对异步导入的文件处理; all 全部 chunksplitChunks: {
chunks: 'all', // initial|async|all
cacheGroups: { // 缓存分组
vendor: { // 第三方模块
name: 'vendor', // chunk 名称
priority: 1, // 权限更高,优先抽离,重要!!!
test: /node_modules/,
minSize: 0, // 大小限制
minChunks: 1 // 最少复用过几次
},
common: { // 公共的模块
name: 'common', // chunk 名称
priority: 0, // 优先级
minSize: 0, // 公共模块的大小限制
minChunks: 2 // 公共模块最少复用过几次
}
}
}
4. 懒加载。 如何实现异步加载JSsetTimeout(() => {
import('./xx.js').then(res => {})
}, 0)
5. 处理JSX。 .babelrc.js"presets": ["@babel/preset-react"]
6. 处理Vuetest: /\.vue$/,
loader: ['vue-loader'],
include: srcPath
module、chunk、bundle 的区别?