我们在开发过程中非常喜欢使用RequireJS和AMD。我们可以编辑一个模块,点击浏览器的刷新按钮,立即看到结果。但是当我们需要将模块连接成一个单独的文件进行生产部署时,显然仍然需要存在一个AMD加载器,无论是RequireJS本身还是它的较小伙伴“almond”,如此解释:
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或Almond都需要它们:
我想象了一个连接器,它将生成以下内容(我使用尖括号引用符号«,»来显示上述两个模块的片段已被插入的位置):
(function() {
var ModA = «function() {
return {a: 1};
}»();
var ModB = «function(A) {
return {b : 2};
}»(ModA);
return ModB;
})();
就我所知,这样做可以正确地重现AMD的语义,同时最大限度地减少不必要的胶水JavaScript。是否有这样的连接器可用?如果没有,那么我认为写一个是否太蠢了——真的很少有代码库仅由使用define()
编写的简单和清晰的模块组成,并且永远不需要在内部进行require()
调用,以启动后续异步获取代码的过程吗?