我正在阅读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();
},
这是让我感到困惑的地方,加载脚本时是不是应该自动执行工厂方法?为什么需要手动执行?
答案 0 :(得分:0)
这是让我困惑的地方,不应该在加载脚本时自动执行工厂方法吗?
执行工厂功能是RequireJS的工作。浏览器不会自动调用它,因为没有本机实现的既定标准提供此功能。 RequireJS不能只做scriptElement.onload = factory
。调用onload
处理程序时,这意味着“文件X已成功加载”。 不对应于“模块X已成功加载”。仅列举一个突出的原因,两者不等同:单个文件可能包含多个模块。 RequireJS必须确定文件中存在哪些模块。浏览器不会自动执行此操作。