为什么级联RequireJS AMD模块需要装载?(Why do concatenated Requ

2019-07-29 20:47发布

我们的发展,我们可以编辑我们的浏览器的模块,打重装,并立即看到结果时爱RequireJS和AMD。 但是,当谈到时间来连接我们的模块到生产部署单个文件,也显然必须是一个AMD装载机仍然存在,即加载器是否RequireJS本身或其小伙伴“杏仁”,如下解释:

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

我的困惑是:为什么是装载机必要呢? 除非你有非常特殊的情况下,使必要的它,你做require()你的模块里面调用,它会出现一系列的AMD模块可以在不存在的装载机都被串联。 最简单的可能的例子是一对像以下模块。

ModA.js:

define([], function() {
    return {a: 1};
});

ModB.js;

define(['ModA'], function(A) {
    return {b : 2};
});

鉴于这两个模块,似乎一个连接符可以简单地产生下面的文本,而不是负担生产服务器或浏览器与任何RequireJS或杏仁需要额外的带宽或计算。

我想,产生一个连接符(和我使用的字形报价«»显示上述地方已插入来自两个模块的代码片段):

(function() {
    var ModA = «function() {
        return {a: 1};
    }»();
    var ModB = «function(A) {
        return {b : 2};
    }»(ModA);
    return ModB;
})();

这一点,到目前为止,我所看到的,会正确地再现AMD的语义,用最少的多余胶水的JavaScript。 有这样一个连接符可用? 如果不是这样,我将是认为我应该写一个傻瓜-是那里,包括书面简洁明快模块真的很少的代码库define()并且永远不需要进一步的require()内调用打完折以后异步代码获取?

Answer 1:

AMD的优化器具有优化多于要下载的文件的数量的范围内,还可以优化在存储器加载的模块的数量。

例如,如果你有10个模块,并可以将它们优化到1个文件,然后你救了自己9个下载。

如果第1页使用所有10个模块,然后这是伟大的。 但是,如果第2页只使用1? 直到一个模块是一个AMD装载机能延缓“工厂函数”的执行require “d。 因此,第2页只触发一个“工厂函数”来执行。

如果每个模块在被占用的内存100KB require “d,那么AMD的框架,具有运行时优化也将节省我们的内存900KB Page2上。

这方面的例子可能是“关于框”风格的对话框。 当它的非常的执行被延迟,直到最后一秒钟,因为它不会在案件99%访问。 例如,(在松散的jQuery语法):

aboutBoxBtn.click(function () {
    require(['aboutBox'], function (aboutBox) {
        aboutBox.show();
    }
});

您保存创建JS对象和DOM相关的与“关于框”的费用,直到你确信这是必要的。

欲了解更多信息,请参阅延迟执行定义,直到首先需要对requirejs的需要这一点。



Answer 2:

唯一的真正的好处是,如果你使用的模块跨节所以有到高速缓存模块的好处独立。



Answer 3:

我有同样的需要,所以我创建了一个简单的AMD“编译”为此目的可以做到了这一点。 你可以把它https://github.com/amitayh/amd-compiler

请注意,它有许多功能缺失,但它的工作(至少对我来说)。 随意作出贡献的代码库。



Answer 4:

如果你编译你require.js代码到生产单个大容量文件时,可以使用almond.js完全替代要求。

杏仁只处理模块引用管理不加载其本身不再需要。

小心的限制杏仁强加为了工作



Answer 5:

没有理由为什么不能成为一个构建工具,如您提出一个。

上一次*我看着优化的输出,它转换为明确指定模块的模块,然后再连接到一起的那些。 它依靠自身需要,以确保工厂函数被调用以正确的顺序,以及适当的模块对象被传来传去。 要建立像你想的工具,你必须明确地线性模块 - 不是不可能,但很多工作。 这可能是为什么它没有这样做。

我相信**优化器有一个功能,包括自动要求本身(或杏仁)进建文件,这样你只需要拥有一个下载。 这将是比你想构建工具的输出较大,但在其他方面是相同的。

如果有一个构建工具所产生的那种你要求输出的,它必须要多加小心,在同步的情况下require ,使用的exports ,而不是回报,以及其他任何CommonJS的兼容性功能。

*这是几年前。 2010年,我想。

**,但似乎无法马上找到它。



文章来源: Why do concatenated RequireJS AMD modules need a loader?