【发布时间】:2020-03-13 00:51:16
【问题描述】:
我正在开发一个 Web 应用程序,其中包含应该使用 dynamic imports 延迟加载的小部件。 每个小部件都应接收其单独的捆绑包及其依赖项,只有在用户请求时才由浏览器获取。有一个例外:流行的小部件应该包含在主包以及它们使用或扩展的库类中。下面你会看到我打算实现的文件夹结构和我想要的输出:
File Structure Desired chunk
src/
├── widgets/
│ ├── popular-widget/index.ts main
│ ├── edge-case-widget/index.ts edge-case-widget
│ └── interesting-widget/index.ts interesting-widget
├── library/
│ ├── Widget.ts main
│ └── WidgetFactory.ts main
└── index.ts main (incl. entry point)
dist/
├── edge-case-widget.app.js edge-case-widget
├── interesting-widget.app.js interesting-widget
└── main.app.js main (incl. entry point)
为了延迟加载小部件,我在WidgetFactory 的create 方法中使用了以下表达式。这很好用,小部件模块会被 Webpack 神奇地拾取。
const Widget = await import(`../widgets/${name}/index`)
我试图通过在 Webpack 中配置 optimization.splitChunks.cacheGroups 来解决代码拆分挑战。提供test 函数我将模块分配到library 或widgets 缓存组中。
module.exports = {
entry: './src/index.ts',
[...]
optimization: {
splitChunks: {
cacheGroups: {
library: {
test: module => isInLibrary(module.identifier()),
name: 'library',
chunks: 'all',
minSize: 0
},
widgets: {
test: module => isWidgetBundle(module.identifier()),
name: module => widgetNameFromModuleId(module.identifier()),
chunks: 'async',
minSize: 0
}
}
}
}
}
我被困住了!
- 如何在小部件包中包含小部件依赖项?
- 在
library缓存组上使用chunks: 'async'使一些库类进入main块,而其他库类留在library块中。为什么? - 当我在
library缓存组上使用chunks: 'all'时,所有模块都正确组合在其中,但我丢失了main块上的入口点并得到一个空白页。怎么样? - 当我将
library缓存组重命名为main时,我丢失了入口点as documented here。我不太明白为什么会这样,以及我如何设法将main入口点与library组合成一个包。
希望您能对我使用 Webpack 的陡峭学习曲线有所了解。
【问题讨论】:
标签: javascript webpack webpack-4