我们的发展,我们可以编辑我们的浏览器的模块,打重装,并立即看到结果时爱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()
内调用打完折以后异步代码获取?
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的需要这一点。
唯一的真正的好处是,如果你使用的模块跨节所以有到高速缓存模块的好处独立。
我有同样的需要,所以我创建了一个简单的AMD“编译”为此目的可以做到了这一点。 你可以把它https://github.com/amitayh/amd-compiler
请注意,它有许多功能缺失,但它的工作(至少对我来说)。 随意作出贡献的代码库。
如果你编译你require.js代码到生产单个大容量文件时,可以使用almond.js完全替代要求。
杏仁只处理模块引用管理不加载其本身不再需要。
小心的限制杏仁强加为了工作
没有理由为什么不能成为一个构建工具,如您提出一个。
上一次*我看着优化的输出,它转换为明确指定模块的模块,然后再连接到一起的那些。 它依靠自身需要,以确保工厂函数被调用以正确的顺序,以及适当的模块对象被传来传去。 要建立像你想的工具,你必须明确地线性模块 - 不是不可能,但很多工作。 这可能是为什么它没有这样做。
我相信**优化器有一个功能,包括自动要求本身(或杏仁)进建文件,这样你只需要拥有一个下载。 这将是比你想构建工具的输出较大,但在其他方面是相同的。
如果有一个构建工具所产生的那种你要求输出的,它必须要多加小心,在同步的情况下require
,使用的exports
,而不是回报,以及其他任何CommonJS的兼容性功能。
*这是几年前。 2010年,我想。
**,但似乎无法马上找到它。