这里问题的答案是“视情况而定”。我是作为一个在大型应用程序中使用过 RequireJS 的人来发言的not仔细阅读RequireJS的代码。 (只是指出,了解 RequireJS 内部结构的人可能会做出与我不同的解释。)require
可以分为3种成本场景:
如果模块从未被加载过,require
从服务器加载文件,执行该文件,执行模块的工厂函数并返回对该模块的引用。 (从网络加载文件的成本通常使其他成本相形见绌。)
如果模块已被加载但从未被需要,require
执行模块的工厂函数并返回对该模块的引用。 (这通常会发生在优化应用。)
如果模块已经被加载并且需要,require
返回对模块的引用。
成本场景 1 > 成本场景 2 > 成本场景 3。
首先,我们考虑每个文件有一个模块的情况。该应用程序未优化。我有一个名为module1
这是千载难逢的需要。它在主应用程序中的用法可以建模如下:
define(["module1", <bunch of other required modules>],
function (module1, <bunch of other modules variables>) {
[...]
if (rare_condition_happening_once_in_a_blue_moon)
module1.use();
[...]
});
Here I always即使我不使用该模块,也要支付成本场景 1 的价格。最好这样做:
define([<bunch of required modules>],
function (<bunch of module variables>) {
[...]
if (rare_condition_happening_once_in_a_blue_moon)
require(["module1"], function (module1) {
module1.use();
});
[...]
});
这样,我就需要付出加载模块的代价only千载难逢。
现在,如果我需要使用怎么办module
反复?这可以建模为:
define(["module1", <bunch of other required modules>],
function (module1, <bunch of other modules variables>) {
[...]
for(iterate a gazillion times)
module1.use();
[...]
});
在这种情况下,成本方案 1 只支付一次,仅此而已。如果我使用require
像这样:
define([<bunch of required modules>],
function (<bunch of module variables>) {
[...]
for(iterate a gazillion times)
require(["module1"], function (module1) {
module1.use();
});
[...]
});
我支付了一次成本方案 1anda(亿万次 - 1)成本场景编号 3. 在一天结束时,是否module1
应包含在要求中define
调用或单独调用require
调用取决于您的应用程序的具体情况。
如果应用程序已通过使用进行优化,则分析会发生变化r.js
或自制优化。如果应用程序经过优化,所有模块都在一个文件中,则每次您在上述情况下支付成本方案 1 时,您都需要支付成本方案 2。
为了完整起见,我将补充一点,如果您提前不知道您可能想要加载的模块,请使用require
是必要的。
define([<bunch of other required modules>],
function (<bunch of other modules variables>) {
[...]
require(<requirements unknown ahead of time>, function(m1, m2, ...) {
m1.foo();
m2.foo();
[...]
});
[...]
});