zoukankan      html  css  js  c++  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(/
    ?
    /);
            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

  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/zhao-bo/p/6115325.html
Copyright © 2011-2022 走看看