requirejs模块包含模块

时间:2015-04-24 09:07:43

标签: javascript requirejs

我有一个内部使用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([])

我不想在外部公开内部定义调用(通过展平所有定义),因为我不希望库消费者能够使用这些内部模块。

3 个答案:

答案 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就可以被任何代码访问。 (&#34;已加载&#34;这里表示工厂函数已执行。)因此,访问b时首先取决于加载ab不会被隐藏。< / 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
    };
});