프로필에 따라 js 의존 모듈 불러오기

7087 단어
요구 사항:
아래 프로필에 따라
 
  
module=[
{'name':'jquery','src':'/js/lib/jquery-1.8.3.js'},
{'name':'swfobject','src':'/js/utils/swfobject.js'},
{'name':'fancybox','src':'/js/jquery/jquery.fancybox.js','require':['jquery']},
{'name':'uploadify','src':'/js/utils/uploadify.js','require':['swfobject']},
{'name':'jqform','src':'/js/jquery/jquery.form.js','require':['jquery']},
{'name':'register','src':'/js/page/reg.js','require':['jqform']},
{'name':'login','src':'/js/page/login.js','require':['fancybox','jqform']},
{'name':'upload','src':'/js/page/upload.js','require':['fancybox','jqform','uploadify']}
]

함수를 쓰다
def getfiles(name)
모name에서 지정한 페이지를 불러옵니다. 불러올 js 파일 목록을 불러옵니다. 의존할 것이 있으면 먼저 불러옵니다.
간단한 해법
이 문제는 보기에는 매우 간단해 보이지만 실제로는 그렇지 않다.
어려운 점은 모듈의 적재 시기에 의존하는 데 있다.만약에 이런 의존 관계가 있다면 A-B&C, B-C, A모듈은 B모듈과 C모듈에 의존한다. 이 동시에 B모듈은 C모듈에 의존한다. C를 두 번 불러올 수 없잖아!
반찬이 제시한 이 해법은 단지 하나의 사고방식일 뿐이다. 이보다 더 좋은 알고리즘이 있을 것이다. 반찬은 두 갈래 나무 같은 알고리즘으로 해결할 수 있다고 생각하지만 반찬은 그럴 수 없다.
이 알고리즘은 순환 의존의 상황을 고려하지 않았다.
코드는 다음과 같습니다.
 
  
 /**
  *
  * @type {Function}
  */
 var loadModule = (function(){
     /**
      *
      * @type {{chainHead: {}, chainCurrent: {}, srcCache: {}, main: main, load: load, findModule: findModule}}
      */
     var logics = {
         chainHead: {},     //
         chainCurrent: {},  //
         srcCache: {},      //module src
         /**
          *
          * @param modules 
          * @param name 
          * @returns {Array} ,
          */
         main: function(modules, name){
             var nameArray = [],  //
                 srcArray = [],   //
                 nameStr = "",    //
                 repeatRegex = /(^| )([\w]+ ).*\2/,  //
                 i = 0;
             //
             this.load(modules, name)
             //
             this.chainCurrent = this.chainHead;
             while(this.chainCurrent.next){
                 nameArray.push(this.chainCurrent.name);
                 this.chainCurrent = this.chainCurrent.next;
             }
             nameStr = nameArray.join(" ") + " ";  // ,
             //
             while(repeatRegex.exec(nameStr)){
                 nameStr = nameStr.replace(repeatRegex, function(g0, g1, g2){
                     return g0.substring(0, (g0.length - g2.length));
                 });
             }
             nameStr = nameStr.substring(0, (nameStr.length - 1));  //
             //
             nameArray = nameStr.split(" ");
             for(i = 0; i < nameArray.length; i++){
                 srcArray.push(this.srcCache[nameArray[i]]);
             }
             return srcArray;
         },
         /**
          *
          * @param modules 
          * @param name 
          */
         load: function(modules, name){
             var node = {},
                 module = this.findModule.call(modules, "name", name),
                 i = 0;
             //
             if(!module){
                 throw Error(" " + name +" ");
             }
             //
             node.name = name;
 //            node.src = module.src;
             this.srcCache[name] = module.src;
             node.next = this.chainHead;
             this.chainHead = node;
             //
             if(module.require && module.require.length){
                 for(i = 0;i < module.require.length; i++){
                     this.load(modules, module.require[i]);
                 }
             }
         },
         /**
          *
          * @param name 
          * @param value 
          * @returns {*}
          */
         findModule: function(name, value){
             var array = this,
                 item = {},
                 i = 0;
             //
             for(i = 0; i < array.length; i++){
                 item = array[i];
                 //
                 if(item && item[name] === value){
                     return item;
                 }
             }
             // null
             return null;
         }
     };
     //
     return function(){
         return logics.main.apply(logics, arguments);
     };
 }());
 /**
  * Test Usecase
  * @type {*[]}
  */
 var modules=[
     {'name':'jquery','src':'/js/lib/jquery-1.8.3.js'},
     {'name':'swfobject','src':'/js/utils/swfobject.js'},
     {'name':'fancybox','src':'/js/jquery/jquery.fancybox.js','require':['jquery']},
     {'name':'uploadify','src':'/js/utils/uploadify.js','require':['swfobject']},
     {'name':'jqform','src':'/js/jquery/jquery.form.js','require':['jquery']},
     {'name':'register','src':'/js/page/reg.js','require':['jqform']},
     {'name':'login','src':'/js/page/login.js','require':['fancybox','jqform']},
     {'name':'upload','src':'/js/page/upload.js','require':['fancybox','jqform','login','uploadify']}
 ];
 console.log(loadModule(modules, "upload"));

좋은 웹페이지 즐겨찾기