是RequireJSasynchronous加载文件?

注意:requirejs([],function(){})将在RequireJS 2.1+中asynchronous调用函数callback(对于早期版本,它被同步调用)。 但是,在Node中运行时,将使用同步IO调用加载模块加载,并且加载器插件应同步parsing对其加载方法的调用。 这允许节点中的requirejs模块同步使用requirejs('stringValue')调用:

这是什么意思? 这是否意味着节点中的requirejs不是真正的asynchronous加载文件? 因为它使用同步IO调用?

这句话告诉你:

  1. RequireJS在Node中运行时,可以在调用requirejs(module_name)时以真正的同步方式加载模块。 请注意,当RequireJS在浏览器中运行时,这没有任何等价物。 是的,您可以在浏览器端执行requirejs(module_name) ,但是如果模块已经被加载并且这个加载asynchronous发生,这只会无误地工作。 这不是真正的同步。 然而,在Node中运行RequireJS的同一种调用是真正同步的。

  2. 但是,当您通过传递一个依赖关系列表和一个callback来调用它时,该callback将被asynchronous调用。 表单requirejs([], function() {})的调用在浏览器和Node中都是asynchronous的。

在一个评论中你问:

我有点困惑,如果它正在同步加载,为什么不使用requirejs('foo')

如果此调用仅用于在Node中运行,那么您不必费心使用调用的asynchronousforms。 但是,如果您编写应该在Node中运行的代码, 并且在浏览器中必须注意如何使用此类调用。 例如一个main.js文件:

 requirejs.config({...}) var foo = requirejs('foo'); foo.whatever(); 

最多只会在浏览器中间歇性失败。 至less有一次,它会提出“模块尚未加载上下文”的错误 。 如果你想要代码运行没有错误,你必须这样做:

 requirejs.config({...}) requirejs('foo', function (foo) { foo.whatever(); });