你的位置:首页 > Java教程

[Java教程]js模块化方案


(function(){  var CENTER = new EvtCenter();  var Loaded={};  var Modules={};  function loadScript(name,url){    if(!(name in Loaded)){      Loaded[name]=!0;      var js=document.createElement("script");      js.src=url;      document.head.appendChild(js);    }  }  function require(name){return Modules[name]}  function exports(obj){    var name=this.name;    this.exports=obj;    if(name in Modules){      for(var key in obj){        Modules[name]=obj[key];      }    }else{      Modules[name]=obj;    }    this.trigger(CENTER,"load");  }  function Module(name,factory){    var self = this;    if(!(self instanceof Module)) return new Module(name,factory);    if(factory===undefined){factory=name;name=factory.name}    self.name = name||"anonymous";    self.factory=factory;    self.inited=false;    Loaded[self.name]=!0;    self.process();    if(self.depends){      self.on(CENTER,"load",function(e){        if((!self.inited)&&(self.depends[e.sender.name])){          self.check()&&self.init();        }      });    }else{      setTimeout(function(){        self.init();      },0)    }  }  Eventable(Module);  Module.prototype.init=function(){    this.inited=true;    this.factory(require.bind(this),exports.bind(this));    if(!/exports\(/.test(this.txt)){      Modules[this.name]=null;      this.trigger(CENTER,"load");    }    delete this.txt;  }  Module.prototype.check=function(){    var k,flag=true;    for(k in this.depends){      if(!(k in Modules)){        flag=false;        break;      }    }    return flag;  }  Module.prototype.process=function(){    var txt,url,name,i,list,tmp,reg = /require\(([^\)]+)\)/;    this.txt=this.factory.toString();    list=this.txt.split(/\r?\n/);    for(i=0,l=list.length;i<l;i++){      txt=list[i];      if(reg.test(txt)){        tmp = reg.exec(txt)[1].replace(/^\s*|\s*$/g,'').split(/\s*,\s*/);        url = tmp[1]&&(tmp[1].replace(/'|"/g,''));        name= tmp[0].replace(/'|"/g,'');        if(url&&!/\.js$/.test(url))url=url+'.js';        if(!(name in Loaded) && url) setTimeout(function(){loadScript(name,url)},0);        if(!this.depends) this.depends={};        this.depends[name]=!0;      }    }  }  window.Module=Module;})();//module

使用简单的依赖预处理(无法辨别是否在注释或者字符串中)

事件采用上一篇文章中的Eventable