2016-12-04 9 views
0

Я читал исходный код RequireJs при загрузке модуля, он находит свои зависимости и загружает их по порядку, записывая тег сценария на <head> и прикрепляя к нему прослушиватели событий onload и onerror. В прослушивателе onload он вызывает метод factory factory вручную.Почему 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 выполнять заводскую функцию. Браузер автоматически не вызывается сам по себе, потому что не существует встроенного стандартного стандарта, который обеспечивает эту функциональность. RequireJS не может просто делать scriptElement.onload = factory. Когда вызывается обработчик onload, это означает, что «файл X успешно загружен». Это не соответствует "модуль X загружен успешно". Чтобы назвать только одну важную причину, два не эквивалентны: один файл может содержать несколько модулей. RequireJS должен определить, какие модули присутствуют в файле. Браузер не делает это автоматически.