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){
            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

你可能感兴趣的:(js模块化方案)