js 모듈화 방안

7998 단어
(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?
/); for(i=0,l=list.length;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 을 사용합니다.
 
다음으로 전송:https://www.cnblogs.com/ss0102113/p/6114485.html

좋은 웹페이지 즐겨찾기