m3m4加载器的优化版m3m4-v1.1
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)
})
})
m3m4加载器的优化版m3m4-v1.1的更多相关文章
- js前端模块化之加载器原理解析(一)
先来说一下前端模块化的价值:引用模块此处有详细的介绍,可以自行前往观看. 一.总结如下优点: (1)解决命名冲突(2)烦琐的文件依赖(3)模块的版本管理(4)提高可维护性(5)前端性能优化(6)跨环境 ...
- 构建服务端的AMD/CMD模块加载器
本文原文地址:http://trock.lofter.com/post/117023_1208040 . 引言: 在前端开发领域,相信大家对AMD/CMD规范一定不会陌生,尤其对requireJS. ...
- C编译器、链接器、加载器详解
摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...
- js模块化/js模块加载器/js模块打包器
之前对这几个概念一直记得很模糊,也无法用自己的语言表达出来,今天看了大神的文章,尝试根据自己的理解总结一下,算是一篇读后感. 大神的文章:http://www.css88.com/archives/7 ...
- 《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现
此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...
- 小矮人Javascript模块加载器
https://github.com/miniflycn/webkit-dwarf 短小精悍的webkit浏览器Javascript模块加载器 Why 我们有许多仅基于webkit浏览器开发的应用 无 ...
- RequireJS 是一个JavaScript模块加载器
RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJ ...
- JS框架设计之加载器所在路径的探知一模块加载系统
1.要加载一个模块,我们需要一个URL作为加载地址,一个script作为加载媒介,但用户在require是都用ID,我们需要一个将ID转换为URL的方法,思路很简单,强加个约定,URL的合成规则是为: ...
- How Tomcat Works 读书笔记 八 加载器 上
Java的类加载器 具体资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...
随机推荐
- poj1722 SUBTRACT
应该是基础的dp练手题 线性dp最主要的就是关于阶段的划分,这个题中我没想到的一点就是开状态的时候使用了前i个数能合成的数来记录 我自己的想法就是类似于区间dp这样的记录方法,这种方法确实开了很多冗余 ...
- UIPopoverController 简单用法(全代码)
AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDic ...
- windows phone之依赖属性(DependencyProperty)
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF ...
- U盘安装Ubuntu 12.04成功后系统无法启动的原因及解决办法
想搭建一个Linux开发环境,选择了ubuntu12.04长期支持版,采用u盘安装(Universal-USB-Installer做的启动),发现安装完成之后,拔掉u盘无法启动,插上u盘之后,可以重启 ...
- angular Dom属性绑定
- WebService 天气预报webservice接口
WebService 天气预报webservice接口 地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 常用接口: 1. ...
- 复制构造函数被调用的三种情况------新标准c++程序设计
1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...
- C# 向TIM或者QQ自动发送中文消息【微信也是可用的】 附测试GIF
之前用C++简单的写了一个demo 现在用C#写了完整版 定义字符 定义发送数量 定义发送对象 注意事项 QQ必须单独一个窗体 微信对象在输入名字的时候必须写微信 源代码 using System; ...
- A - 活动安排问题(贪心)
A - 活动安排问题 有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input第一行一个正整数n (n <= ...
- IT职场中外企面试最爱提的问题
1.请介绍一下你自己. 这是外企常问的问题.一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验,这些在简历上都有,其实,外企最希望知道的是求职者能否胜任工作,包括:最强的技能.最深入研究的知识 ...