我有一个内部使用AMD模块(requirejs)的库。我想从这些模块中返回一些方法作为公共API。目前我正在使用同步需求调用来执行此操作。
例如:
// library
define("a", function(){
define("b", ['somedep','anotherdep'], function(dep, dep2){
return { something: "x"};
});
return {
b: require('b').something
};
});
// then to use it.
require(['a'], function(a){
});
然而,这会给出错误。 错误:尚未为上下文加载模块名称“b”:_。使用require([])
我不想在外部公开内部定义调用(通过展平所有定义),因为我不希望库消费者能够使用这些内部模块。
答案 0 :(得分:0)
您无法嵌套模块定义。试试这个:
define("b", ['somedep','anotherdep'], function(dep, dep2){
return { something: "x"};
});
define("a", ['b'], function(b){
return {
b: b.something
};
});
// then to use it.
require(['a'], function(a){
});
答案 1 :(得分:0)
// Defined module "b"
define("b", ['somedep','anotherdep'], function(dep, dep2){
return { something: "x"};
});
// Defined module "a"
define("a", ["b"], function(b){
return {
b: b.something
};
});
// then to use it.
require(['a'], function(a){
});
你可以做这样的事情
答案 2 :(得分:0)
我不想在外部公开内部定义调用(通过展平所有定义),因为我不希望库消费者能够使用这些内部模块。
我不知道向RequireJS声明一个模块的简单方法,同时阻止该模块可以被任何可以调用RequireJS require
的代码使用。让我们假设您展示的代码可以正常工作。然后,只要加载了模块b
,模块a
就可以被任何代码访问。 ("已加载"这里表示工厂函数已执行。)因此,访问b
时首先取决于加载a
,b
不会被隐藏。< / p>
你的代码不起作用的原因是&#34;同步&#34; RequireJS的require
是伪同步的...或者更好的术语是它是一个伪的require
同步操作但是如果模块会立即保释你想要的是没有加载。再次,&#34;加载&#34;这意味着不仅已经执行了对模块的define
调用,而且模块自身的依赖关系已经加载而且模块&# 39;工厂功能已经执行。在您的代码中,模块b
的依赖项尚未加载,b
的工厂函数尚未执行,因此您的require
调用失败。
您可以使用b
加载require(['b'])
但是您必须从a
返回某种承诺。
您可以通过使用作用域而不是将b
作为模块来隐藏模块b
中的内容:
define("a", ['somedep', 'anotherdep'], function(dep, dep2){
var b = (function (foo, bar) {
return { something: "x" };
})(dep, dep2);
return {
b: b.something
};
});