RequireJS是异步加载文件吗?

时间:2015-07-22 09:15:29

标签: javascript node.js requirejs

  

注意:requirejs([],function(){})将在RequireJS 2.1+中异步调用函数回调(对于同步调用的早期版本)。但是,在Node中运行时,将使用同步IO调用加载模块加载,加载器插件应同步解析对其加载方法的调用。这允许节点中requirejs模块的同步使用通过requirejs('stringValue')调用来工作:

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

1 个答案:

答案 0 :(得分:2)

这句话告诉你:

  1. 当RequireJS在Node中运行时,它可以在被称为requirejs(module_name)时以真正同步的方式加载模块。 请注意,当在浏览器中运行RequireJS时,这没有等效。是的,您可以在浏览器端执行requirejs(module_name)但是只有在模块已经<时,这才会正常运行/ em>已加载,此加载异步发生。它不是真正的同步。然而,当它在Node中运行时,通过RequireJS完成的同一种调用是真正同步的。

  2. 但是,当您通过传递依赖项列表和回调来调用它时,将异步调用回调。 requirejs([], function() {})形式的调用在浏览器和节点中都是异步的。

  3. 在评论中你问:

      

    我有点困惑,如果它同步加载,为什么不使用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(); 
    });