如何拥有多个块但加载它们的单个js文件
How to have multiple chunks but a single js file that loads them
我正在尝试设置 Webpack,目前未使用开发服务器,我的应用程序由 python 后端提供服务,该后端具有 index.html.
我正在尝试使用 SplitChunksPlugin,这样我就可以拥有多个块(应用程序、供应商、运行时等)。然而,为了简化它从 python 后端加载的方式,我想知道是否有一种方法可以告诉 Webpack 创建一个额外的文件,比如 main.js 它将动态加载其他块正确的顺序。是这样吗?
您可以使用dynamic import
import(/* webpackChunkName: "chunkName" */ 'chunkPath')
创建自定义块并在需要时导入它,您的文件 chunkPath
可能包含您要拆分的其他块,并且不会立即加载。
来自 webpack docs:
import('path/to/module') -> Promise
Dynamically load modules. Calls to import() are treated as split points, meaning the requested module and its children are split out into a separate chunk.
您可以使用html插件生成加载所有初始脚本的js文件:
// Generate js entrypoint for the app to be loaded using a script tag
new HtmlWebpackPlugin({
alwaysWriteToDisk: true,
inject: false,
// If you have multiple entry points and only some should be loaded
// this way, list those entry points in the chunks config
// chunks: ['sdk'],
filename: '[name].js',
minify: false,
templateContent: ({ htmlWebpackPlugin }) => {
return (
dedent`
"use strict";
(function(m) {
var baseUrl = new URL(m.publicPath, document.currentScript.src);
m.js.forEach(src => {
document.head.appendChild(Object.assign(document.createElement('script'), { src: new URL(src, baseUrl).toString() }));
});
m.css.forEach(href => {
document.head.appendChild(Object.assign(document.createElement('link'), { rel: 'stylesheet', href: new URL(href, baseUrl).toString() }));
});
))(
` +
JSON.stringify(htmlWebpackPlugin.files, null, 2) +
');'
);
},
}),
我正在尝试设置 Webpack,目前未使用开发服务器,我的应用程序由 python 后端提供服务,该后端具有 index.html.
我正在尝试使用 SplitChunksPlugin,这样我就可以拥有多个块(应用程序、供应商、运行时等)。然而,为了简化它从 python 后端加载的方式,我想知道是否有一种方法可以告诉 Webpack 创建一个额外的文件,比如 main.js 它将动态加载其他块正确的顺序。是这样吗?
您可以使用dynamic import
import(/* webpackChunkName: "chunkName" */ 'chunkPath')
创建自定义块并在需要时导入它,您的文件 chunkPath
可能包含您要拆分的其他块,并且不会立即加载。
来自 webpack docs:
import('path/to/module') -> Promise
Dynamically load modules. Calls to import() are treated as split points, meaning the requested module and its children are split out into a separate chunk.
您可以使用html插件生成加载所有初始脚本的js文件:
// Generate js entrypoint for the app to be loaded using a script tag
new HtmlWebpackPlugin({
alwaysWriteToDisk: true,
inject: false,
// If you have multiple entry points and only some should be loaded
// this way, list those entry points in the chunks config
// chunks: ['sdk'],
filename: '[name].js',
minify: false,
templateContent: ({ htmlWebpackPlugin }) => {
return (
dedent`
"use strict";
(function(m) {
var baseUrl = new URL(m.publicPath, document.currentScript.src);
m.js.forEach(src => {
document.head.appendChild(Object.assign(document.createElement('script'), { src: new URL(src, baseUrl).toString() }));
});
m.css.forEach(href => {
document.head.appendChild(Object.assign(document.createElement('link'), { rel: 'stylesheet', href: new URL(href, baseUrl).toString() }));
});
))(
` +
JSON.stringify(htmlWebpackPlugin.files, null, 2) +
');'
);
},
}),