[英]requirejs module containing modules
我有一个内部使用AMD模块的库(requirejs)。 我想从这些模块中返回一些方法作为公共API。 目前,我正在使用同步的require调用来执行此操作。
例如:
// 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([])
我不想在外部公开内部定义调用(通过展平所有定义),因为我不希望库使用者能够使用这些内部模块。
您不能嵌套模块定义。 尝试以下方法:
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){
});
// 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){
});
你可以做这样的事情
我不想在外部公开内部定义调用(通过展平所有定义),因为我不希望库使用者能够使用这些内部模块。
我不知道一种简单的方法来向RequireJS声明一个模块,同时阻止该模块被任何可以调用RequireJS的require
代码使用。 假设您显示的代码可以正常工作。 然后,一旦模块a
被加载,模块b
就可以被任何代码访问。 (“装”在这里表示,该工厂函数执行。)所以,在访问b
将取决于加载a
第一, b
也不会被隐藏。
您的代码不起作用的原因是RequireJS的“同步” require
是伪同步的……或者更好的说法是它是一个伪require
, 它可以同步运行,但是如果您要使用的模块会立即保释未加载。 再次,“已加载”在这里不仅意味着已经执行了对模块的define
调用,而且还意味着已经加载了模块自身的依赖项,并且已经 执行了模块的工厂功能。 在您的代码中,模块b
的依赖项尚未加载,并且b
的工厂函数尚未执行,因此您的require
调用失败。
您可以使用require(['b'])
加载b
,但是随后您必须从a
返回某种形式的promise。
您基本上可以通过使用作用域来隐藏模块b
,而不是将b
设为模块:
define("a", ['somedep', 'anotherdep'], function(dep, dep2){
var b = (function (foo, bar) {
return { something: "x" };
})(dep, dep2);
return {
b: b.something
};
});
我们最终将项目更改为使用es6模块,bable和browserify。 这使所有内容同步,而不是异步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.