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

 

posted @ 2015-07-10 11:00  rookieDeng  阅读(704)  评论(0编辑  收藏  举报