Webpack异步加载与动态需求
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/
下的文件,并将它们包含在你的包中,这不是你想要的。
有两个问题需要解决:
- 让webpack把你的文件分成独立的块
- 动态加载这些块
似乎有人创造了一个可以解决这两个问题的bundle-loader
。
var file_name = condition_holds ? "FOO" : "BAR";
var dynamicLoad = require('bundle!./DIRECTORY/' + file_name);
dynamicLoad(function (loadedModule) {
// Use the module
});
根据这篇文章,这应该将上下文中的每个潜在文件拆分为自己的bundle,并为您提供在运行时异步加载这些bundle的方法。
相关文章:
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 动态分配GA增强型电子商务跟踪器
- onkeyup无法动态创建多个文本区域
- 使用javascript将动态表从一个html页面打印到另一个html页
- 如何使Javascript动态html表及其上的事件
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 如何使用javascript从主svg对象动态创建svg视图框
- 试图在引导模式内动态生成图表,得到offsetWidth错误
- 通过在Dojo mobile ViewController.openExternalView中动态更改打开同一外部视图的
- 如何在Google柱状图中动态添加行/列
- 困在逻辑中试图定位动态的东西
- 在动态创建的元素上获取对特定选择器的引用
- 如何动态插入jquery代码
- 使用Google Visualization动态调用构造函数
- 使用jQuery动态添加表并在其中动态添加行
- 需求和主干 - 动态加载 jQuery 移动
- Webpack异步加载与动态需求
- Webpack -动态需求和路径