我想定义A,但A应该要求B和B需要C(为了r.js)
这两个中的任何一个都是正确的吗?
define([
'module'
], function(module) {
require(['C'], function() {
require(['B'], function() {
var A;
return A;
});
});
});
require(['C'], function() {
require(['B'], function() {
define([
'module'
], function(module) {
var A;
return A;
});
});
});
答案 0 :(得分:4)
您的选择都不正确。
您首选尝试使用return
从异步回调中返回值。这通常是不可能的,而且RequireJS也不例外。请参阅this question及其答案,了解其原因。
您的第二个选择是将define
放入传递给require
的回调中。这可能适用于一些玩具箱,但总的来说这不会起作用。 (通过"玩具箱"我的意思是概念验证所有条件都受到严格控制。这种情况并不反映实际应用的现实。)
Linh Pham's suggestion真的是你的选择:
define(["module", "B", "C"], function(module){
var A;
return A;
});
如果B
取决于C
并且不是AMD库,请为其填充垫片。在评论中,你反对说你必须拥有数百个"垫片如果你这样做的话。您有几个选项可以避免这些垫片:
请勿使用RequireJS加载C
。在页面上加载RequireJS之前,使用script
元素加载它。
将您的应用程序设计为仅使用一个模块启动,并要求先启动您的应用程序,然后再加载C
:
require(['C'], function () {
require(['main']);
});
main
将成为启动应用程序的模块。这种方法的缺点是,如果你像我一样,最终在需要C
之前忘记要求main
。
答案 1 :(得分:1)
将deps放在define块中,如下所示:
define(["module", "B", "C"], function(module){
var A;
return A;
});
如果您的模块B
依赖于C
,那么您应该在require.config
中配置它,如下所示
shim: {
"B": ["C"] // shorthand of "B": {deps: ["C"]}
}