码迷,mamicode.com
首页 > Web开发 > 详细

js模块化方案【转】

时间:2016-11-29 22:37:29      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:doc   list   lis   .exe   tostring   require   images   als   ima   

(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

js模块化方案【转】

标签:doc   list   lis   .exe   tostring   require   images   als   ima   

原文地址:http://www.cnblogs.com/zhao-bo/p/6115325.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!