注意:requirejs([],function(){})将在RequireJS 2.1+中异步调用函数回调(对于同步调用的早期版本)。但是,在Node中运行时,将使用同步IO调用加载模块加载,加载器插件应同步解析对其加载方法的调用。这允许节点中requirejs模块的同步使用通过requirejs('stringValue')调用来工作:
这是什么意思?这是否意味着节点中的requirejs不是真正异步加载文件?因为它正在使用同步IO调用?
答案 0 :(得分:2)
这句话告诉你:
当RequireJS在Node中运行时,它可以在被称为requirejs(module_name)
时以真正同步的方式加载模块。 请注意,当在浏览器中运行RequireJS时,这没有等效。是的,您可以在浏览器端执行requirejs(module_name)
但是只有在模块已经<时,这才会正常运行/ em>已加载,此加载异步发生。它不是真正的同步。然而,当它在Node中运行时,通过RequireJS完成的同一种调用是真正同步的。
但是,当您通过传递依赖项列表和回调来调用它时,将异步调用回调。 requirejs([], function() {})
形式的调用在浏览器和节点中都是异步的。
在评论中你问:
我有点困惑,如果它同步加载,为什么不使用
requirejs('foo')
?
如果此呼叫仅在Node中运行,那么您不必费心使用异步形式的呼叫。但是,如果您编写应该在Node中运行的代码,和,则必须注意如何使用此类调用。例如,main.js
文件执行:
requirejs.config({...})
var foo = requirejs('foo');
foo.whatever();
最多会在浏览器中间歇性地失败。至少偶尔一次,它会提升"module not yet loaded for context" error。如果您希望代码无误地运行,则必须执行以下操作:
requirejs.config({...})
requirejs('foo', function (foo) {
foo.whatever();
});