我有一个看似相当直接的Webpack代码拆分设置,我无法迁移到Webpack 4.我有两个条目,名为main
和preview
。我想在vendor
中为供应商模块分割成main
块的初始代码,但我想将preview
保留为一个块。
Webpack 3中工作配置的相关部分:
{
entry: {
main: './src/application.js',
preview: './src/preview.js',
},
plugins: [{
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
chunks: ['main'],
minChunks({context}) {
if (!context) {
return false;
}
const isNodeModule = context.indexOf('node_modules') !== -1;
return isNodeModule;
},
}),
}]
}
具体来说,使用chunks
选项中的CommonsChunkPlugin
属性可以让我轻松完成我需要做的事情。 Webpack 4的optimization.splitChunks
配置中是否存在等效项?
答案 0 :(得分:6)
以下Webpack 4配置仅将main
模块供应商依赖项拆分为单独的块。 preview
的其他依赖关系仍在该块中。
{
entry: {
main: './test/application.js',
preview: './test/preview.js'
},
optimization: {
splitChunks: {
cacheGroups: {
vendors: {
name: 'vendors',
chunks: 'all',
enforce: true,
priority: 1,
test(module, chunks) {
const name = module.nameForCondition && module.nameForCondition();
return chunks.some(chunk => chunk.name === 'main' && /node_modules/.test(name));
}
}
}
}
}
}
供应商包中包含共享依赖项,除非我们将preview
cacheGroup配置为具有更高优先级,以强制执行此处包含的所有依赖项应保留在此块中。
有关更多与Webpack 4相关的信息/配置,您可以查看此webpack-demo项目。
为了强制从main
拆分所有供应商依赖项并从main
和preview
块重用它们,您必须将preview
cacheGroup配置为:
preview: {
name: 'preview',
chunks: 'all',
enforce: true,
priority: 0,
test(module, chunks) {
return chunks.some(chunk => chunk.name === 'preview');
}
}
请注意,preview
chunk的cacheGroup优先级低于vendors
,以确保main
中依赖于preview
的所有preview
依赖项也从<script>
$(document).ready(function () {
$('#example').DataTable({
"paging": true,
"ordering": true,
"info": false
});
});
</script>
捆绑。
答案 1 :(得分:2)
或者:
splitChunks: {
cacheGroups: {
// We want all vendor (node_modules) to go into a chunk.
vendors: {
test: /[\\/]node_modules[\\/]/,
name: "vendors",
// Exclude preview dependencies going into vendors.
// Currently undocument feature: https://github.com/webpack/webpack/pull/6791
chunks: chunk => chunk.name !== "preview"
}
}
}