Class.registerPreprocessor('loader')


ext/src/class/Loader.jsファイル:
 Class.registerPreprocessor('loader', function(cls, data, hooks, continueFn) {

        
        var me = this,
            dependencies = [],
            dependency,
            className = Manager.getName(cls),
            i, j, ln, subLn, value, propertyName, propertyValue,
            requiredMap, requiredDep;


        /**
        *  
        */
        for (i = 0,ln = dependencyProperties.length; i < ln; i++) { //  1
            propertyName = dependencyProperties[i];

            if (data.hasOwnProperty(propertyName)) {
                propertyValue = data[propertyName];

                if (typeof propertyValue == 'string') {
                    dependencies.push(propertyValue);
                }
                else if (propertyValue instanceof Array) {
                    for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
                        value = propertyValue[j];

                        if (typeof value == 'string') {
                            dependencies.push(value);
                        }
                    }
                }
                else if (typeof propertyValue != 'function') {
                    for (j in propertyValue) {
                        if (propertyValue.hasOwnProperty(j)) {
                            value = propertyValue[j];

                            if (typeof value == 'string') {
                                dependencies.push(value);
                            }
                        }
                    }
                }
            }
        }

        if (dependencies.length === 0) {
            return;
        }

        //<feature classSystem.loader>
        //<debug error>
        var deadlockPath = [],
            detectDeadlock;


        if (className) {
            requiresMap[className] = dependencies; //  2
            //<debug>
            requiredMap = Loader.requiredByMap || (Loader.requiredByMap = {});

            for (i = 0,ln = dependencies.length; i < ln; i++) {
                dependency = dependencies[i];
                (requiredMap[dependency] || (requiredMap[dependency] = [])).push(className); //  3
            }
            //</debug>
            
            /**
            *  
            */
            detectDeadlock = function(cls) {
                deadlockPath.push(cls);

                if (requiresMap[cls]) {
                    if (Ext.Array.contains(requiresMap[cls], className)) {
                        throw new Error("Deadlock detected while loading dependencies! '" + className + "' and '" +
                                deadlockPath[1] + "' " + "mutually require each other. Path: " +
                                deadlockPath.join(' -> ') + " -> " + deadlockPath[0]);
                    }

                    for (i = 0,ln = requiresMap[cls].length; i < ln; i++) {
                        detectDeadlock(requiresMap[cls][i]);
                    }
                }
            };

            detectDeadlock(className);
        }

        //</debug>
        //</feature>
        /**
        *  Loader.require()   wangyuelucky.blog.51cto.com/1011508/1594617
        */
        Loader.require(dependencies, function() {  
            for (i = 0,ln = dependencyProperties.length; i < ln; i++) {
                propertyName = dependencyProperties[i];

                if (data.hasOwnProperty(propertyName)) {
                    propertyValue = data[propertyName];

                    if (typeof propertyValue == 'string') {
                        data[propertyName] = Manager.get(propertyValue);
                    }
                    else if (propertyValue instanceof Array) {
                        for (j = 0, subLn = propertyValue.length; j < subLn; j++) {
                            value = propertyValue[j];

                            if (typeof value == 'string') {
                                data[propertyName][j] = Manager.get(value);
                            }
                        }
                    }
                    else if (typeof propertyValue != 'function') {
                        for (var k in propertyValue) {
                            if (propertyValue.hasOwnProperty(k)) {
                                value = propertyValue[k];

                                if (typeof value == 'string') {
                                    data[propertyName][k] = Manager.get(value);
                                }
                            }
                        }
                    }
                }
            }

            continueFn.call(me, cls, data, hooks);
        });

        return false;
    }, true, 'after', 'className');
  • は依存関係のキーワードを表し、コードは以下の通りである:
  • dependencyProperties = ['extend', 'mixins', 'requires']

    2.requiresMapはグローバルであり、依存関係名のキャッシュ、すなわち、ロードされたすべてのクラス名は、ここで登録され、重複ロードを防止し、依存ループがあります.
    3.TODO:即時実行文ですか?
    requiredMap[dependency] || requiredMap[dependency] = [] //  ,  true = [];
    obj[url] || obj[url] = []
    obj[url] || obj[url] = [] sd

    だから、まず後者を文に変えます.
    requiredMap[dependency] || (requiredMap[dependency] = []) //  

    に相当
    if(!requiredMap[dependency]) requiredMap[dependency] =[]; //  

    今すぐ実行する方法で
    requiredMap[dependency] = (function(){
        if(!requiredMap[dependency]) requiredMap[dependency] =[];
    })();