标签:过滤 模块名 cache cookie cal 返回 san 表示 set
m3m4加载器的优化版m3m4-v1.1
/*
//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)
})
})
标签:过滤 模块名 cache cookie cal 返回 san 表示 set
原文地址:http://www.cnblogs.com/caoke/p/6012129.html