【问题标题】:requirejs module containing modulesrequirejs 包含模块的模块
【发布时间】:2015-05-01 09:05:50
【问题描述】:

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

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

【问题讨论】:

  • 为什么需要在模块中定义模块?你能把那些分开吗?我认为requirejs 不应该那样做
  • 这个库非常大,将它分成模块意味着它更容易处理。
  • 你可以用不同的方式做到这一点。检查我的答案:)

标签: javascript requirejs


【解决方案1】:

您不能嵌套您的模块定义。试试这个:

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){
});

【讨论】:

  • 我不想将每个模块都暴露给外部范围。在这种情况下,模块 b 将包含其本身没有任何意义的方法,并且我可能希望在内部进行更改而不用担心人们会使用它们
【解决方案2】:
// 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){
});

你可以这样做

【讨论】:

    【解决方案3】:

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

    我不知道有一种简单的方法可以向 RequireJS 声明一个模块,同时防止该模块被任何可以调用 RequireJS 的require 的代码使用。假设您显示的代码可以工作。然后,一旦模块 a 被加载,任何代码都可以访问模块 b。 (此处“已加载”表示工厂函数已执行。)因此,访问b 将依赖于先加载ab 不会被隐藏。

    您的代码不起作用的原因是 RequireJS 的“同步”require 是伪同步的......或者更好的说法是它是一个伪require确实 em> 同步操作,但如果您想要的模块没有加载,则会立即退出。同样,这里的“加载”意味着不仅对模块的 define 调用已经执行,而且模块自身的依赖项已经加载并且模块的工厂函数已经执行。在您的代码中,模块b 的依赖项尚未加载,b 的工厂函数尚未执行,因此您的require 调用失败。

    您可以使用require(['b']) 加载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
        };
    });
    

    【讨论】:

      【解决方案4】:

      我们最终将项目更改为使用 es6 模块、bable 和 browserify。这使得一切都是同步的,而不是异步的。

      【讨论】:

        猜你喜欢
        • 2013-10-26
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 2016-02-24
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        相关资源
        最近更新 更多