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

统计

我的模块加载系统 v22

时隔差不多两个月,积累了许多改进,升级到v22。主要改进点如下:

  1. 进行瘦身,移除本地储存
  2. IE6789的HTML5新标签支持列表,添加一个 m标签
  3. loadJS内容方法,在动态插入script节点,发现最新的firefox Nightly做了些改动,如果head还没有解析完就插入节点,那么新script会触发onerror事件。补救措施,针对firefox使用html.insertBefore(node, head)。chrome不支持head.insertBefore(node, null),第二参数必须是节点,因此firefox外浏览器统一使用 head.insertBefore(node, head.firstChild)。
  4. getCurrentScript方法进行增强,现在支持对chrome取正在解析的节点,详见源码。如此一来,除safari外,都能立即确认模块ID与script节点的对应关系。
  5. 修正parseURL转"mass.draggable"为url出错的BUG。
  6. 升级$.log,让它支持更古老的opera。
  7. 升级$.error,对异常进行包装,防止中文乱码。

现在详解一下getCurrentScript引入的新hack,利用e.stack截取正在解析的节点的src,从而得到节点。首先随便搞个错误,比如a.b.c()。在opera12的控制台下,我们通过try catch截获的输出如下:

getCurrentScript([arguments not available])@http://113.93.50.63/mass.js:424
<anonymous function: $.define>([arguments not available])@http://113.93.50.63/mass.js:606
@http://113.93.50.63/data.js:4

chrome为:

ReferenceError: a is not defined
    at getCurrentScript (http://113.93.50.63/mass.js:403:13)
    at window.define.$.define (http://113.93.50.63/mass.js:585:60)
    at http://113.93.50.63/data.js:4:1

firefox为

getCurrentScript@http://113.93.50.63/mass.js:403
$.define@http://113.93.50.63/mass.js:585
@http://113.93.50.63/query.js:4

IE10为

ReferenceError: “a”未定义
  at getCurrentScript (http://113.93.50.63/mass.js:403:13)
  at define (http://113.93.50.63/mass.js:585:9)
  at Global code (http://113.93.50.63/data.js:4:1)

因此,我们只要截取最后一个@或at ,与表示行号的数字前的冒号之间的URL就是正在解析的节点的src了。具体实现看文章最后的源码。

有关我框架的介绍与用法可参看这里(FQ,github)

加载器的使用可见v19的介绍,纯正的AMD用法,没有什么不同。

require("ready",function(){
/*待到domReady完成,执行回调*/
   $.log("将日志打印到页面上",true)
})

源码

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

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

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示