js模块化方案

Posted zhao.bo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<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模块化方案的主要内容,如果未能解决你的问题,请参考以下文章

angularJS使用ocLazyLoad实现js延迟加载

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

模块和组件模块化和组件化的理解

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程