Javascript requirejs定义:嵌套依赖项
我想定义A,但A应该需要B,B需要C(为了r.js) 这两者中有一个是正确的吗Javascript requirejs定义:嵌套依赖项,javascript,requirejs,Javascript,Requirejs,我想定义A,但A应该需要B,B需要C(为了r.js) 这两者中有一个是正确的吗 define([ 'module' ], function(module) { require(['C'], function() { require(['B'], function() { var A; return A; }); }); }); require(['C'], function() {
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;
});
});
});
只需将deps放在define块中,如下所示:
define(["module", "B", "C"], function(module){
var A;
return A;
});
如果模块B
依赖于C
,则应在require.config
中对其进行如下配置
shim: {
"B": ["C"] // shorthand of "B": {deps: ["C"]}
}
你的两个选择都不对 第一选择尝试使用
return
从异步回调返回值。这通常是不可能的,RequireJS也不例外。请参阅及其答案,了解为什么会这样
您的第二个选择将define
放在传递给require
的回调中。这可能在一些玩具箱中起作用,但一般来说,这是行不通的。(我所说的“玩具箱”是指在所有条件都受到严格控制的情况下进行概念验证。这种情况不能反映实际应用的现实。)
这是你的选择:
define(["module", "B", "C"], function(module){
var A;
return A;
});
如果B
依赖于C
且不是AMD库,则为其添加垫片。在一篇评论中,你反对说如果你这样做,你必须有“数百”个垫片。您有几个选项可以避免使用这些垫片:
C
。在页面上加载RequireJS之前,使用脚本元素加载它
C
:
require(['C'], function () {
require(['main']);
});
main
将是启动应用程序的模块。这种方法的缺点是,如果你像我一样,最终你会忘记在你需要main
之前需要C
那是个好主意。不幸的是我不能用它。C就像一个库模块,如果我使用它,我应该添加数百个shim配置。你的意思是
C
将被全局使用,并且所有的模块都依赖于它吗?C不是全局的,但它是如此多的模块所需要的,所以我不会尝试在shim配置中列出它们。或者简单地使用deps:[“C”,“main”]
在require.config
中(注意:deps
与shim
处于同一级别,path
或baseUrl
等),我认为这应该简短而清晰。@LinhPhamdeps:[“C”
是异步的。没有时间点可以保证加载C
。因此,如果您将我的上一个示例改编为使用deps:[“C”]
而不是require(['C']),那么,…
很可能在加载C
之前执行require(['main'])
。这是非常有用的信息,因此为了使用deps:[“C”,“main”]
我需要为main
模块配置shim
,比如:shim:{“main”:[“C”}
对吗?是的,如果main
恰好是一个非AMD模块。我在回答中没有明确说明它,但main
应该是一个AMD模块,因为它是为OP开发的应用程序创建的。您的第二个选项是我改编的。