/* //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) }) })
时间: 2024-10-12 19:51:22