Alm*_*bay 6 javascript webpack code-splitting html-webpack-plugin splitchunksplugin
假设我有 3 个由动态导入创建的异步块:
const Notes = lazy(() => import(/* webpackChunkName: "notes" */ 'pages/Notes'))
const Lists = lazy(() => import(/* webpackChunkName: "lists" */ 'pages/Lists'))
const Files = lazy(() => import(/* webpackChunkName: "files" */ 'pages/Files'))
Run Code Online (Sandbox Code Playgroud)
将生成:
notes.g3g43g.js
lists.534535.js
files.234f8t.js
Run Code Online (Sandbox Code Playgroud)
每个块都包含它自己的供应商依赖项。
所以在notes.g3g43g.js里面我们有react-big-calendar和lodash。
但是,当使用 SplitChunksPlugin 时,我们可以将chunks选项设置为all:
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: ({ context }) => (context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
从这一点来看,react-big-calendar和lodash可能会被分成自己单独的供应商块(因此它们也可以被其他异步块使用),有时块名称将与包名称相同,但其他时候它可以只是入口点的 id(如466)。
我的问题是:我如何知道notes.g3g43g.js的异步供应商块是什么?
我一直在研究发送到HtmlWebpackPlugin的编译对象,但找不到任何可以指出note chunk 所依赖的内容:
new HtmlPlugin({
filename: `${name}.html`,
scriptLoading: 'module',
templateContent: ({ compilation }) => {
console.log(compilation)
}
})
Run Code Online (Sandbox Code Playgroud)
我有什么想法可以找到答案吗?
免责声明:我尝试做的是生成多个 html 文档(每个路由一个),然后在文档中内联所有相关脚本的预加载。
笔记.html:
<head>
<script type="module" src="js/runtime.dc0c50.js"></script>
<script type="module" src="js/%40emotion.16b5a2.js"></script>
<script type="module" src="js/react-dom.db73d8.js"></script>
<script type="module" src="js/main.f337ee.js"></script>
</head>
<body>
<link rel="preload" href="js/notes.g3g43g.js" as="script">
<link rel="preload" href="js/react-big-calendar.35994c.js" as="script">
<link rel="preload" href="js/466.f9ej43.js" as="script">
<div id="root"></div>
</body>
Run Code Online (Sandbox Code Playgroud)
这将防止到 CDN 的额外往返,因为每个块已经拥有其所有依赖项。
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |