AMD(特别是RequireJs)如何处理跨多个模块的依赖关系?

9
我有一个主要的初始化脚本,调用 require() 方法,其中一个依赖项是工具框架。但我通过 require() 指定的其他一些模块也将此框架定义为其依赖项。
例如(init.js):
require(['module-a', 'module-b', 'module-c'], function(a, b, c){
    // where module-c is the framework
});

接着在'module-a'中我有:

define(['module-c'], function(c){
    // utilize module-c framework
});

那么AMD/RequireJs如何处理这种情况呢?它会加载两次相同的框架吗?
感谢您的帮助。
此致 敬礼, 马克
2个回答

6

它只会被加载一次,上述两个模块将获得相同的'module-c'模块值。


非常感谢确认!这正是我所希望的,因为在我的想法中,在每个模块中指定依赖关系更有意义,因为这意味着我可以将该模块带到完全不同的另一个项目中并进行重复使用。 - Integralist
1
在内部,AMD加载器会跟踪(即缓存)所有模块。当模块被优化/连接在一起时,这不是很重要。然而,如果任何模块是按需加载的,重要的是要注意,AMD加载器会跟踪“请求”,以防止两个几乎同时的请求多次尝试下载同一个模块。 - unscriptable

2
如果对其他人有用的话 - 这是我遇到过的一个情况,其中一个模块被加载了两次:
对于以下项目结构:
~/prj/js/app/fileA.js
~/prj/js/app/util/fileB.js
~/prj/js/ext/publisher.js

RequireJs的baseurl~/prj/js/app fileA.js将外部依赖项publisher.js称为"ext":
//fileA:
define(['../ext/publisher'], function(){});

但是,fileB.js使用不同的路径引用了相同的依赖关系:
//fileB:
define(['../../ext/publisher'], function(){});

简而言之,对于这两个文件,尽管依赖项位于相同的位置,但依赖路径不同。在这种情况下,publisher.js会被加载两次。

使用Firebug的Net选项卡查看它加载两次:

dependency.js being loaded twice (firebug)

这可以通过使用路径来配置外部文件夹路径轻松解决(如require_js文档中所述):
requirejs.config({
    paths: {ext: '../ext'}
});

设置了paths之后,依赖项只会加载一次,fileA.jsfileB.js都使用相同的依赖路径,如下所示:
//fileA:
define(['ext/publisher'], function(){});

并且

//fileB:
define(['ext/publisher'], function(){});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接