首页 > 代码库 > m3m4加载器的优化版1.0,能满足基本需求了

m3m4加载器的优化版1.0,能满足基本需求了

 

 m3m4加载器的优化版1.0,能满足基本需求了

/*
//1、以$开头的模块名,表示服务,服务只会执行一次,它可以有自己的方法。比如cookie就是一个服务
 //例如:console.log("root");只会执行一次
 define("$root",[function(){
    console.log("root");
    return "root"
 }])
 //2、非$开头的表示普通模块,普通模块每次调用的时候都会执行
 //例如:console.log("userList");每次都会执行
 define("userList",["$root",function($root){
    console.log($root);
    console.log("userList");
    return "userList"
 }])
 //3、存在 $callback 表示异步回调模块,$callback将返回异步的数据
 define("sync1",["$root","$callback",function(a,callback){
    console.log(22)
    setTimeout(function(){
         callback("1 sync")
    },1000)
 }])
 require("sync1",function(sync1){
    console.log(sync1);//将输出结果:1 sync
 })
* */
(function($){
    var models={}
    var baseLoaded={}
    var baseCache={}

    function define(name,args){
        models[name]=args
    }
    function require(name,callback){
        var curCache=Object.create(baseCache)
        var curLoaded=Object.create(baseLoaded)
        function curRequire(name,callback){
            //从全局中返回
            if(/^\$/.test(name)&&baseLoaded[name]){
                callback(baseCache[name])
                return
            }
            //返回结果
            if(curLoaded[name]){
                callback(curCache[name])
                //设置全局
                if(/^\$/.test(name)){
                    baseCache[name]=curCache[name]
                    baseLoaded[name]=curLoaded[name]
                }
                return
            }
            var next=function(){
                curRequire(name,callback)
            }
            //获取模块长度

            var args=models[name]
            var func=args[args.length-1]
            var len=args.length-1
            var dataArr=[]
            //过滤 $callback
            var sync=args.indexOf("$callback")
            if(sync!=-1){
                dataArr[sync]=function(back){
                    curCache[name]=back
                    curLoaded[name]=true
                    next()
                }
                --len
            }
            if(len==0){
                curCache[name]= func.apply(null,dataArr)
                curLoaded[name]=true
                next()
            }else{
                for(var i=0;i<args.length-1;i++){
                    if(i==sync)continue;
                    (function(n,model){
                        curRequire(model,function(data){
                            dataArr[n]=data
                            if(--len==0){
                                if(sync!=-1){
                                    func.apply(null,dataArr)
                                }else{
                                    curCache[name]=func.apply(null,dataArr)
                                    curLoaded[name]=true
                                    next()
                                }
                            }
                        })

                    })(i,args[i])
                }
            }
        }
        curRequire(name,callback)
    }
    $.m3m4=function(func){
        func(define,require)
    };
    $.define=define;
    $.require=require;
})(typeof window!="undefined"?window:global)

  

 demo 

m3m4(function(define,require){
    //服务
    define("$root",[function(){
        console.log("只会执行一次")
        return "$root"
    }])
    //根据$root配置,异步加载用户1的数据
    define("user1",["$root","$callback",function($root,callback){
        setTimeout(function(){
            callback("user1"+$root)
        },1000)

    }])
    //同步加载用户user2的数据
    define("user2",["$root",function($root){
        return "user2"

    }])
    //整理成用户列表
    define("userList",["user1","user2",function(user1,user2){
        console.log(user1)
        console.log(user2)
        return {
            user1:user1,
            user2:user2
        }
    }])

    //获取用户列表中的数据
    require("userList",function(userList){
        console.log(userList)
    })
    require("userList",function(userList){
        console.log(userList)
    })
})

  

m3m4加载器的优化版1.0,能满足基本需求了