avalon中require的实现
var plugins = { loader: function(builtin) { window.define = builtin ? innerRequire.define : otherDefine window.require = builtin ? innerRequire : otherRequire },//判断使用那个require 和define
innerRequire = avalon.require = function(array, factory, parentUrl) { if (!Array.isArray(array)) { avalon.error("require的第一个参数必须是依赖列数,类型为数组 " + array) } var deps = {} // args的另一种表现形式,为的是方便去重 var id = parentUrl || "callback" + setTimeout("1") /* setTimeout("1") * * setTimeout() 方法的返回值是一个唯一的数值,这个数值有什么用呢?如果你想要终止 setTimeout() 方法的执行,那就必须使用 clearTimeout() 方法来终止, * 而使用这个方法的时候,系统必须知道你到底要终止的是哪一个 setTimeout() 方法 * (因为你可能同时调用了好几个 setTimeout() 方法),这样 clearTimeout() 方法就需要一个参数, * 这个参数就是 setTimeout() 方法的返回值 (数值),用这个数值来唯一确定结束哪一个 setTimeout() 方法。 * 在系统中每次调用一次,就会递增一次 * */ parentUrl = getBaseUrl(parentUrl)//获取模块加载的根目录 /* * function getBaseUrl(parentUrl) { return kernel.baseUrl ? kernel.baseUrl : parentUrl ? parentUrl.substr(0, parentUrl.lastIndexOf("/")) : kernel.loaderUrl } kernel在配置系统模块可以找到,该对象主要是处理我们自己配置的条件。 */ //加载每个依赖的文件 array.forEach(function(el) { var url = loadResources(el, parentUrl) //加载资源,并返回能加载资源的完整路径 if (url) { if (!deps[url]) {//去重:如果deps中存在url,那就不用加入到依赖项数组中 args.push(url) deps[url] = "司徒正美" //去重: } } }) if (!modules[id]) { //如果此模块是定义在另一个JS文件中, 那必须等该文件加载完毕 //才能放到检测列队中 loadings.push(id) } if (!modules[id] || modules[id].state !== 2) { modules[id] = makeModule(id, 1, factory, deps, args)//更新此模块信息 } checkDeps() }
just do myself