2015-04-24 177 views
0

我有一个内部使用AMD模块(requirejs)的库。我想从这些模块中返回一些方法作为公共API。目前我正在使用一个同步请求调用来做到这一点。requirejs模块包含模块

如:

// 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

为什么你需要在模块内部定义一个模块?你可以分开这些吗?我认为'requirejs'并不意味着要这样做 –

+0

这个库很大,将它分成模块意味着它更容易处理。 –

+0

你可以用不同的方式做到这一点。检查我的答案:) –

回答

-1

我们最终改变项目使用ES6模块,巴布尔和browserify。这使得一切都是同步的,而不是异步。

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

我不想暴露每个模块到外部的范围。在这种情况下,模块b将包含自己没有任何意义的方法,并且我可能希望在内部修改而不用担心人们会使用它们 –

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

你可以做这样的事情

0

I don't want to expose the internal define calls externally (by flattening out all the defines) since i don't want library consumers to be able to use those internal modules.

我不知道一个简单的方法来申报RequireJS一个模块,并在同一时间阻止模块从能够被任何可以调用RequireJS的require的代码使用。假设您显示的代码会起作用。然后,只要模块a已被加载,模块b就可以被任何代码访问。 (这里的“加载”意味着工厂功能已经执行。)因此,在访问b时首先依赖于加载ab不会被隐藏。

您的代码不工作的原因是,“同步” RequireJS的require是伪同步......或许更好的说法是,它是一个伪require确实同步运行,但将保释权如果你想要的模块没有加载,请离开。再次,“装”在这里是指不仅一个define呼吁模块已经执行,但该模块本身的依赖性已经加载和模块的工厂函数已经执行。在您的代码中,模块b的依赖关系尚未加载,并且b的工厂功能尚未执行,因此您的require调用失败。

您将能够加载brequire(['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 
    }; 
});