(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
使用简单的依赖预处理(无法辨别是否在注释或者字符串中)
转载自:http://www.cnblogs.com/ss0102113/p/6114485.html
时间: 2024-11-04 21:51:20