[英]Webpack Async Loading with Dynamic Require
我对 webpack 很陌生(几个小时)。
我想将非常棒的异步加载与动态需求结合起来。 假设我想异步地需要两个文件之一,“./DIRECTORY/FOO”或“./DIRECTORY/BAR”。 这是一个非动态版本,我认为它按我的预期工作:
if (condition_holds) {
require.ensure([], function()
{
require('./DIRECTORY/FOO');
});
}
else {
require.ensure([], function()
{
require('./DIRECTORY/BAR');
});
}
这是我尝试使这种动态:
var file_name = condition_holds ? "FOO" : "BAR";
require.ensure([], function()
{
require('./DIRECTORY/' + file_name);
});
但是,当我使用 webpack 编译这些代码时,我得到了非常不同的结果。 对于第一个(非静态),生成两个不同的文件,一个用于 FOO,一个用于 BAR,并且仅异步加载该文件。 对于第二个,只生成一个文件,其中包含 FOO 和 BAR。 这不是我所期待或想要的。 我希望生成单独的文件,每个模块一个,并且只异步下载该模块。
这是预期的行为吗? 如果是这样,为什么以及如何使用动态需要但仍然获得单独的模块,每个模块单独加载?
这是我的 webpack.config.js:
module.exports =
{
entry: {
bundle: './main.js'
},
output: {
path: './public/js/',
filename: '[name].js',
publicPath: "/js/"
}
};
问题是 webpack静态分析你的源代码。 当它看到这个:
require('./DIRECTORY/' + file_name);
...它创建了一个上下文,它是一个在运行时可以解析为捆绑模块的映射。 因为根据静态分析, file_name
可以是任何东西(webpack 实际上不会运行你的代码来知道什么是可用的),它确定了所有可能在./DIRECTORY/
下的./DIRECTORY/
并将它们包含在你的包中,这不是你想要的.
确实有两个问题需要解决:
看起来有人创建了一个可以解决这两个问题的bundle-loader
。
var file_name = condition_holds ? "FOO" : "BAR";
var dynamicLoad = require('bundle!./DIRECTORY/' + file_name);
dynamicLoad(function (loadedModule) {
// Use the module
});
根据这篇文章,这应该将上下文中的每个潜在文件拆分为自己的包,并为您提供一种在运行时异步加载这些包的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.