繁体   English   中英

包含模块的requirejs模块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM