为什么连接的RequireJS AMD模块需要加载器?

Bra*_*des 37 javascript amd web-deployment requirejs almond

我们在开发过程中喜欢RequireJS和AMD,我们可以编辑模块,在浏览器中点击重新加载,然后立即看到结果.但是,当需要将我们的模块连接到单个文件进行生产部署时,显然必须有一个AMD加载器仍然存在,无论该加载器是RequireJS本身还是其较小的合作伙伴"杏仁",如下所述:

http://requirejs.org/docs/faq-optimization.html#wrap

我的困惑是:为什么装载机是必需的?除非你有非常特殊的情况使你有必要require()在你的模块内部进行调用,否则似乎可以连接一系列AMD模块而不需要加载器.最简单的例子是一对模块,如下所示.

ModA.js:

define([], function() {
    return {a: 1};
});
Run Code Online (Sandbox Code Playgroud)

ModB.js:

define(['ModA'], function(A) {
    return {b : 2};
});
Run Code Online (Sandbox Code Playgroud)

鉴于这两个模块,似乎连接器可以简单地生成以下文本,而不会使生产服务器或浏览器承受RequireJS或Almond所需的额外带宽或计算.

我想象一个产生的连接器(我使用V形符号«,»来显示上面两个模块的片段插入位置):

(function() {
    var ModA = «function() {
        return {a: 1};
    }»();
    var ModB = «function(A) {
        return {b : 2};
    }»(ModA);
    return ModB;
})();
Run Code Online (Sandbox Code Playgroud)

据我所知,这可以正确地重现AMD的语义,只需要少量的外来胶水JavaScript.有这样的连接器吗?如果没有,我会因为认为我应该写一个而变得愚蠢 - 是否真的很少有代码库由简单而干净的模块组成,define()并且永远不需要进一步的require()调用来启动以后的异步代码提取?

Pau*_*ime 14

AMD优化器的优化范围可以超过要下载的文件数量,它还可以优化内存中加载的模块数量.

例如,如果您有10个模块并且可以将它们优化为1个文件,那么您已经节省了9个下载.

如果Page1使用所有10个模块,那就太棒了.但是如果Page2只使用1呢?AMD加载程序可以延迟执行"工厂功能",直到模块为require"d".因此,Page2只触发一个"工厂函数"来执行.

如果每个模块在使用时消耗100kb的内存require,那么具有运行时优化的AMD框架也将在Page2上节省900kb的内存.

这方面的一个例子可能是'About Box'样式对话框.它的执行被推迟到最后一秒,因为在99%的情况下它不会被访问.例如(在松散的jQuery语法中):

aboutBoxBtn.click(function () {
    require(['aboutBox'], function (aboutBox) {
        aboutBox.show();
    }
});
Run Code Online (Sandbox Code Playgroud)

您可以节省创建与"关于框"关联的JS对象和DOM的费用,直到您确定它是必要的.

有关详细信息,请参阅延迟执行定义,直到第一次要求 requirejs对此进行处理.