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的更多相关文章

  1. js前端模块化之加载器原理解析(一)

    先来说一下前端模块化的价值:引用模块此处有详细的介绍,可以自行前往观看. 一.总结如下优点: (1)解决命名冲突(2)烦琐的文件依赖(3)模块的版本管理(4)提高可维护性(5)前端性能优化(6)跨环境 ...

  2. 构建服务端的AMD/CMD模块加载器

    本文原文地址:http://trock.lofter.com/post/117023_1208040 . 引言:  在前端开发领域,相信大家对AMD/CMD规范一定不会陌生,尤其对requireJS. ...

  3. C编译器、链接器、加载器详解

    摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代 ...

  4. js模块化/js模块加载器/js模块打包器

    之前对这几个概念一直记得很模糊,也无法用自己的语言表达出来,今天看了大神的文章,尝试根据自己的理解总结一下,算是一篇读后感. 大神的文章:http://www.css88.com/archives/7 ...

  5. 《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...

  6. 小矮人Javascript模块加载器

    https://github.com/miniflycn/webkit-dwarf 短小精悍的webkit浏览器Javascript模块加载器 Why 我们有许多仅基于webkit浏览器开发的应用 无 ...

  7. RequireJS 是一个JavaScript模块加载器

    RequireJS 是一个JavaScript模块加载器.它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJ ...

  8. JS框架设计之加载器所在路径的探知一模块加载系统

    1.要加载一个模块,我们需要一个URL作为加载地址,一个script作为加载媒介,但用户在require是都用ID,我们需要一个将ID转换为URL的方法,思路很简单,强加个约定,URL的合成规则是为: ...

  9. How Tomcat Works 读书笔记 八 加载器 上

    Java的类加载器 具体资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...

随机推荐

  1. 《深度学习原理与TensorFlow实践》喻俨,莫瑜

    1. 深度学习简介 2. TensorFlow系统介绍 3. Hello TensorFlow 4. CNN看懂世界 5. RNN能说会道 6. CNN LSTM看图说话 7. 损失函数与优化算法 T ...

  2. 在MYSQL中运用全文索引(FULLTEXT index)

    在MYSQL中使用全文索引(FULLTEXT index) MYSQL的一个很有用的特性是使用全文索引(FULLTEXT index)查找文本的能力.目前只有使用MyISAM类型表的时候有效(MyIS ...

  3. APUE(3)---文件I/O (2)

    七.函数write #include <unistd.h> size_t write(int fd, const void *buf, size_t nbytes); //若成功,返回已写 ...

  4. 十进制--->二进制(利用C++栈功能)

    原创 十进制转二进制很简单,其中用到C++的栈功能就能更加方便! stack<int> s; //栈的定义,s已经被定义为一个栈 s.push(); //将20入栈 s.push(); s ...

  5. Func和Action的介绍及其用法

    Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如在反射中使用就可以弥补反射所损失的性能. ...

  6. 以太坊系列之十二: solidity变量存储

    solidity中变量的存储 变量存储主要分为两个区域,一个是storage(对应指定是SLOAD,SSTORE),一个是Memory(MLOAD,MSTORE), 这和普通编程语言的内存模型是不一样 ...

  7. Mybatis 延迟加载策略

    延迟加载: 就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据.延迟加载也称懒加载. 好处: 先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速 ...

  8. python merge、concat合并数据集

    数据规整化:合并.清理.过滤 pandas和python标准库提供了一整套高级.灵活的.高效的核心函数和算法将数据规整化为你想要的形式! 本篇博客主要介绍: 合并数据集:.merge()..conca ...

  9. 738. Monotone Increasing Digits

    Given a non-negative integer N, find the largest number that is less than or equal to N with monoton ...

  10. Codeforces Round #551 (Div. 2)A. Serval and Bus

    A. Serval and Bus time limit per test 1 second memory limit per test 256 megabytes input standard in ...