Webpack 为什么要费心处理CommonJS require.sure()中的依赖项列表?

Webpack 为什么要费心处理CommonJS require.sure()中的依赖项列表?,webpack,commonjs,Webpack,Commonjs,从网页包文档()中: 根据需要下载其他依赖项。dependencies数组列出了应该可用的模块。当它们被调用时,调用callback。如果回调是函数表达式,则会提取源部件中的依赖项,并根据需要加载。向服务器触发一个请求,除非所有模块都已可用 如果源部件中的依赖项也被提取并按需加载,那么为什么还要麻烦地将任何内容放入依赖项列表中呢 我见过这样的例子,非常令人困惑(): “b”和“d”不在依赖项列表中,但会像“a”一样按需加载。那么有什么区别呢?答案在文档中: 根据需要下载其他依赖项。depende

从网页包文档()中:

根据需要下载其他依赖项。dependencies数组列出了应该可用的模块。当它们被调用时,调用callback。如果回调是函数表达式,则会提取源部件中的依赖项,并根据需要加载。向服务器触发一个请求,除非所有模块都已可用

如果源部件中的依赖项也被提取并按需加载,那么为什么还要麻烦地将任何内容放入依赖项列表中呢

我见过这样的例子,非常令人困惑():


“b”和“d”不在依赖项列表中,但会像“a”一样按需加载。那么有什么区别呢?

答案在文档中:

根据需要下载其他依赖项。dependencies数组列出了应该可用的模块。当它们被调用时,调用callback。如果回调是函数表达式,则会提取源部件中的依赖项,并根据需要加载。向服务器触发一个请求,除非所有模块都已可用


因此,如果数组中的某些依赖项不存在,那么webpack将停止,甚至不调用回调。但是我从来没有遇到过这样有用的用例,通常每次只传递空数组

您链接到的文档中的示例显示了行为不同的一种方式。指定依赖项时,它会显式创建一个新块,将依赖项放入其中,并添加回调中引用的任何其他依赖项。当您不指定依赖项时,回调中的任何依赖项都会添加到“当前”(最后一个?)块中,不会创建新块。

简而言之:您不必费心

问题的根源 网页包的作者Tobias Koppers被问到一个类似的问题:

劳尔·费拉斯:这两种形式之间有什么优势吗

require.确保(['jquery'、'Backbone'、'下划线'],函数(require){
var jQuery=require('jQuery'),
主干=需要(“主干”),
_=要求('下划线');
};
还有这个

require.确保(['jquery'],函数(require){
var jQuery=require('jQuery'),
主干=需要(“主干”),
_=要求('下划线');
};
Tobias Koppers:没有区别……即使生成的源也是相等的。但是规范说依赖项应该在数组中

网页包的
要求。确保根据CommonJS模块/Async/A实现了
,其中说明:

“require.sure”接受模块标识符数组作为第一个参数,接受回调函数作为第二个参数

规范没有指定回调中所需的未列出模块是否将异步加载,但有一个示例代码,其中只需要数组中列出的模块:

require.确保(['increment'],函数(require){
var inc=要求(“增量”).inc;
var a=1;
inc(a);//2
});
因此,在我看来,
require
d但未列出的模块的异步加载是Webpack的一个特性,与规范有偏差。这种特性使得第一个参数在大多数情况下毫无意义,并引发了问题

用例 1.符合规范要求 第一个参数的一个用例可以是为了清晰和符合规范而指定所有依赖项,但这是完全可选的

2.将模块拉入特定块中 假设应用程序的不同部分有两个拆分点。第一个拆分点取决于模块
a
,第二个拆分点取决于模块
a
b
。 为了消除两次下载
a
的风险,您可以决定将两个模块放在一个块中:

//第一个拆分点
require.确保(['b'],(require)=>{
要求(a);
});

这个答案并没有解释文档所说的内容。我知道在满足依赖项之前回调不会运行。这不是问题。问题是将依赖项放入数组和将依赖项放入回调但不放入数组之间的区别。好的,所以将依赖项放入数组会创建一个也将包含在回调中导入的模块的块。因此,在本例中,将创建该块,因为“a”在数组中。该块还将包含“b”和“d”,因为这些模块是在回调中导入的。问题是为什么数组
[“/a”]
而不是
[“/a”、“/b”、“/d”]
?我觉得这完全是任意的。数组可能是
[“/b”]
,结果可能完全相同。接下来的问题是:为什么要在数组中放置依赖项,然后在回调中根本不导入它?在示例“A”中在数组中,但未在回调中导入。在什么情况下,您需要不使用的东西?对于您的第一个问题,这对我来说是有意义的:您希望“a”仅以异步方式加载。但一旦加载,您还需要“b”和“d”-但是,它们可能已经绑定到其他位置;这对您来说无关紧要这些模块在哪里。对于你的第二个问题,不确定——你想加载一些异步的东西,但还没有执行它。我想这是有用例的,但我真的想不出任何东西。这一定是文档的意思。如果正确的话,那么这些文档写得很糟糕。而且,作者应该考虑whet似乎完全没有意义她会根据模块的位置选择是否异步加载模块,因为像Webpack这样的构建工具的目的是自动化这些事情。如果模块可用,就应该使用它。如果模块不可用,就应该根据需要加载它。如果模块可用,则只应使用它。如果不可用,则应根据需要加载它
require.ensure(["./a"], function(require) {
    require("./b");
    require("./d");
});