webpack - 根据入口点生成 splitChunks 名称
问题描述
我有以下(缩短的)webpack 配置:
module.exports = {
entry: {
app: "./app/index.ts",
admin: "./app/index-admin.ts"
},
...,
optimization: {
splitChunks: {
cacheGroups: {
commons: {
test: /[\\/]node_modules[\\/]/,
name: "vendors",
chunks: "all"
}
}
}
}
}
结果是生成了 3 个文件:
- app.min.js
- admin.min.js
- vendor.min.js
我的问题是“vendors.min.js”为两个入口点生成一次。此配置背后的想法是两个入口点将完全相同,但在“index-admin.ts”中,我将引用其他库,例如 tinyMce 或其他东西。
因此,我想生成 4 个文件:
- app.min.js
- admin.min.js
- app.vendors.min.js
- admin.vendors.min.js
可能吗 ?
解决方案
假设我们有两个文件:
index.js
import 'jquery';
index-admin.js
import 'jquery';
import 'lodash';
例如,我们只想将 lodash 用于管理部分并将其从主应用程序中拆分出来。这是可能的解决方案:
module.exports = {
entry: {
app: "./app/index.js",
admin: "./app/index-admin.js",
},
optimization: {
splitChunks: {
chunks: 'all', // enable default cache groups, also this value will be inherited by the child groups
cacheGroups: {
// vendors is a default group, here we're overriding its configuration
vendors: {
test: /[\\/]node_modules[\\/]/,
name: "vendors.common",
// when you define your own group, its priority is 0, so you need to reset it to the default (or simply a negative) value for vendors
priority: -10
},
vendorsAdmin: {
// could be replaced with a function for the more complex scenario `function (module, chunk)`
test: /[\\/]lodash[\\/]/,
name: "vendors.admin",
// disable minSize/maxSize/minChunks/maxAsyncRequests/maxInitialRequests policies for this group
enforce: true,
}
}
}
}
};
结果,我们得到以下文件结构:
- 应用程序.js
- 管理员.js
- vendor.admin.js(仅限lodash)
- vendor.common.js(仅限jquery )
就如此容易。但是这种解决方案可能会导致以后出现奇怪的行为。例如,您团队中的某个人从lodash
应用程序包中引用。包结构在构建后不会改变,但现在app.js
依赖于vendors.admin.js
. 因此,当 webpack manifest 将尝试引导您的应用程序时,它将开始等待vendors.admin.js
被加载,但这永远不会发生。
最强大和最简单的解决方案是动态导入,我强烈建议考虑它,而不是这个解决方案。您将获得对依赖项的更多控制,并且能够更细化地拆分代码。
如果你不想自己控制捆绑过程,看起来你可以依赖默认的拆分策略。对于我的示例,它将输出与之前配置相同的结果。
optimization: {
splitChunks: {
chunks: 'all'
}
}
推荐阅读
- mysql - 使用聚合时子查询返回多于 1 行
- python - 如何在字典中添加键?(来自现有数据)
- c# - UWP NavigationView:一个 NavigationViewItem 下的两个 View
- .net - Git Clone 不会下载所有文件夹
- android - ListView 不在 NestedScrollView 中滚动(片段)
- excel - 在一个数据透视表中加入多个 excel 定义的名称范围(包括数据透视表)
- html - 使用 OpenCV Python Flask 流式传输多个视频
- bash - 您如何为来自 shell 脚本的问题提示提供具体答案?
- excel - 具有外部数据连接的另存为模板
- c - 为什么当我更改指针=&数字的行时我的代码不起作用?