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

统计

我的模块加载系统 v5

本版本更换更好的状态查询机制与列队机制,去除定时器检测,性能更优,体积更小,功能更强。下面是广告时间:

  1. 无阻塞加载,使用的是script标签注入方式(还有HTML5的async属性,虽然不知其到底发挥多少威力),并在脚本加载成功后自动移除这些临时生成的标签。
  2. 按需加载,每一个模块都放进一个与它同名的JS文件中,没有必要为使用某个API而载入整个框架。
  3. 每个模块自行处理依赖关系,用户不用操心调用了这个模块还要调用哪几个相关模块,核心模块也不用为这些配置而膨胀(如YUI2,dojo)。
  4. 并行加载,简单解释为加载是无序的,解释执行时(模块本身是个curry函数)由依赖关系强制排队。效果图:
    //http://www.cnblogs.com/rubylouvre/archive/2011/04/10/2011175.html by 司徒正美
          dom.require("ecma,lang,support,deferred,oop,brower",function(){
            dom.log("执行回调函数")
          });
  5. 负向回调,dom.require拥有三个参数,模块列表,正向回调,负向回调。正向回调在所有指定的模块都加载成功后执行,负向回调用于万一有某个加载失败时调用。IE6-8通过一个映射查询解决script.onerror问题,opera则利用iframe与两个script成功模拟script.onerror,其他浏览器则直接用script.onerror。
  6. 错误堆栈机制,有时我们不但要看负向回调有没有执行,还要查一下因为那个模块没有成功加载而导致失败,这时它就大派用场了。
  7. 连domReady的联袂使用。我们先看一下YUI丑鄙的使用方式吧:
    YUI().use("module1",function(){ 
      //action 1 
    })  ;
    YUI().use("module2",function(){ 
      //action 2 
    })  ;
    YUI().use("module3,module4",function(){ 
      //action 3 
    }) 

    它让我们的业务代码布满了这种结构,通常我们更希望像jQuery那样一个函数体写完$(function(){}),看dom Framework是怎么解决的!

    //在加载所有模块后并待到domReady才执行回调函数
    dom.ready(function(){
      //.........
    },true);
    //这种方式必须加模node模块才行
    dom(function(){
     
    },true);
    //我们还可以指定要加载的模块
    dom.$$modules = ["ecma","lang","support","deferred","oop","brower"]
    dom.ready(function(){},true);

由于比较懒,直接把我的核心模块放出来吧,包含了别名机制,错误堆栈,并行加载器,domReady与一些常用函数!

我们可以以下面的格式定义其他模块:

//test.js
(function(global,DOC){
    var dom = global[escape(DOC.URL.split("#")[0])];
    dom.define("test", ["string"],function(dom){
        dom.log("test_module");
    });
})(this,this.document);
 
//string.js
;
(function(global,DOC){
    var dom = global[escape(DOC.URL.split("#")[0])];
    dom.define("string", [],function(dom){
        dom.log("string_module");
    });
})(this,this.document);

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

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

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