Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

我的模块加载系统 v14

在过去的一段时间内,我与几个对AMD有兴趣的人聊起匿名模块的实现。

为什么有匿名模块的需求?因为有些人是这样想的,如果这个模块是放在a.js中,那么这个模块就叫a模块,有一天这文件改名为b.js,那么它就是b.js。

想法是很好的。不过,在javascript中是先有require再有define。这正好像,在黑色连成一片的小巷中,妈妈着急地呼叫:“小明,回家吃饭了。”这时,依照匿名模块的方式,这时谁回复谁就是小明。比如,那个是小冲,他恶作剧了呢。或者,妈妈本来是想叫小萌的(小明的妹妹,兄妹俩的名字总是很相近的),不小心叫错了,那么那个男的就是小萌吗?在紧张的开发,程序员被弄到头晕转向的情况多了,因此系统必须有一个纠错机制才行,也因此匿名模块被我否决了。

v14其实也是沿着先有require再有define的思路进行改进。在先前的版本,如果在dom.js所在目录下有一个more文件夹,more之下有一个lazyload.js文件,那么我们请求它时就得使用

dom.require("more/lazyload",callback)

这时,我们也必须要求lazyload这个JS文件里面的模块命名为"more/lazyload",非常麻烦。这是因为里面有个缓存系统,要求两者相等才挂钩在一起。v14就在define中做了工作,如果缓存系统有了一个与它同名(带目录)的对象,并且没有加载过了,那么这两者就认为相等了。换言之,确保了模块名字的纯净性。现在我们可以允许存在同名模块,我们在请求它们时需要指定必要的目录,没有则默认它就是与mass.js位于同一目录下的那个JS文件。

define:function(name,deps,callback){//模块名,依赖列表,模块本身
    var str = "/"+name;
    for(var prop in map){
        if(map.hasOwnProperty(prop) ){
            if(prop.substring(prop.length - str.length) === str && map[prop].state !== 2){
                name = prop.slice(1);//自动修正模块名(加上必要的目录)
                break;
            }
        }
    }
    if(typeof deps == "function"){//处理只有两个参数的情况
        callback = deps;
        deps = "";
    }
    callback._name = "@"+name; //模块名
    this.require(deps,callback);
},

有关mass Framework的详细介绍见github

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(3811)  评论(1编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2009-12-19 jQuery源码学习笔记九
点击右上角即可分享
微信分享提示