2016-12-04 66 views
0

我在讀取RequireJs源代碼時,在加載模塊時,它找到它的依賴關係並按順序加載它們,將腳本標記寫入<head>並將onload和onerror事件監聽器附加到它。在onload監聽器中,它手動調用定義工廠方法。爲什麼RequireJs在加載腳本時調用定義工廠方法?

completeLoad: function (moduleName) { 
     var found, args, mod, 
      shim = getOwn(config.shim, moduleName) || {}, 
      shExports = shim.exports; 

     takeGlobalQueue(); 

     while (defQueue.length) { 
      args = defQueue.shift(); 
      if (args[0] === null) { 
       args[0] = moduleName; 
       //If already found an anonymous module and bound it 
       //to this name, then this is some other anon module 
       //waiting for its completeLoad to fire. 
       if (found) { 
        break; 
       } 
       found = true; 
      } else if (args[0] === moduleName) { 
       //Found matching define call for this script! 
       found = true; 
      } 

      callGetModule(args); 
     } 
     context.defQueueMap = {}; 

     //Do this after the cycle of callGetModule in case the result 
     //of those calls/init calls changes the registry. 
     mod = getOwn(registry, moduleName); 

     if (!found && !hasProp(defined, moduleName) && mod && !mod.inited) { 
      if (config.enforceDefine && (!shExports || !getGlobal(shExports))) { 
       if (hasPathFallback(moduleName)) { 
        return; 
       } else { 
        return onError(makeError('nodefine', 
            'No define call for ' + moduleName, 
            null, 
            [moduleName])); 
       } 
      } else { 
       //A script that does not call define(), so just simulate 
       //the call for it. 
       callGetModule([moduleName, (shim.deps || []), shim.exportsFn]); 
      } 
     } 

     checkLoaded(); 
    }, 

這是混淆我的地方,不應該在加載腳本時自動執行工廠方法嗎?爲什麼需要手動執行?

回答

0

這是讓我迷惑的地方,不應該在加載腳本時自動執行工廠方法嗎?

要求工作人員執行工廠功能。瀏覽器不會自動調用它,因爲沒有提供此功能的本機實現的建立標準。 RequireJS不能僅僅執行scriptElement.onload = factory。當調用onload處理程序時,這意味着「文件X已成功加載」。這是而不是對應於「模塊X已成功加載」。僅列出一個重要的原因,這兩者並不等價:單個文件可能包含多個模塊。 RequireJS必須確定文件中存在哪些模塊。瀏覽器不會自動執行此操作。

相關問題