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()
    }
相關文章
相關標籤/搜索