为什么RequireJs调用脚本加载定义工厂方法?

时间:2016-12-04 02:34:45

标签: javascript requirejs amd

我正在阅读RequireJs源代码,在加载模块时,它会找到它的依赖关系并按顺序加载它们,将脚本标记写入<head>并附加onload和onerror事件监听器。在onload侦听器中,它手动调用define factory方法。

 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();
    },

这是让我感到困惑的地方,加载脚本时是不是应该自动执行工厂方法?为什么需要手动执行?

1 个答案:

答案 0 :(得分:0)

  

这是让我困惑的地方,不应该在加载脚本时自动执行工厂方法吗?

执行工厂功能是RequireJS的工作。浏览器不会自动调用它,因为没有本机实现的既定标准提供此功能。 RequireJS不能只做scriptElement.onload = factory。调用onload处理程序时,这意味着“文件X已成功加载”。 对应于“模块X已成功加载”。仅列举一个突出的原因,两者不等同:单个文件可能包含多个模块。 RequireJS必须确定文件中存在哪些模块。浏览器不会自动执行此操作。