/* //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 baseModels={} var baseLoaded={} var baseCache={} function define(name,args,base){ if(base){ baseLoaded[name]=true baseCache[name]=args }else{ baseModels[name]=args } } function require(name,callback){ var models=Object.create(baseModels) var curCache=Object.create(baseCache) var curLoaded=Object.create(baseLoaded) var self={ version:"m3m4-v1.1" } 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() } if(--len==0){ func.apply(self,dataArr) return; } } if(len==0){ curCache[name]=func.apply(self,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(self,dataArr) }else{ curCache[name]=func.apply(self,dataArr) curLoaded[name]=true next() } } }) })(i,args[i]) } } } //Api兼容写法 if(Object.prototype.toString.call(name)!="[object Array]"){ models["app"]=Array.prototype.slice.call(arguments) }else{ models["app"]=name } curRequire("app",function(){}) } $.m3m4=function(func){ func(define,require) }; $.define=define; $.require=require; })(typeof window!="undefined"?window:global)
demo
m3m4(function(define,require){ //定义模块 define("user1",["req",function(req){ return req }]) //路由1 define("req",["$callback",function($callback){ setTimeout(function(){ $callback({ url:"user1.html" }) },1000) }]) //执行 require("user1",function(user1){ console.log(user1) }) //路由2 define("req",["$callback",function($callback){ setTimeout(function(){ $callback({ url:"user2.html" }) },100) }]) //执行 require("user1",function(user1){ console.log(user1) }) })
时间: 2024-11-23 08:19:05