源碼中 forEach
的實(shí)現(xiàn),以及 m.deps.forEach
的用法,使得 OzJS 在 IE9 以下無法運(yùn)行。是有意不支持 Old IE?如果不需要考慮 IE6-8,則 32 行的代碼可以省略掉,在文檔中說明就好。只支持高級瀏覽器的話,代碼應(yīng)該還可以簡化。
有個(gè)建議,文檔上將 AMD 公共模塊稱呼為 AMD 具名模塊,AMD 私有模塊稱呼為 AMD 匿名模塊,這樣可能更表意,呵呵。另外,對于 AMD 私有模塊,模塊 url 的獲取,是通過串行加載來保證拿到的 url 是當(dāng)前 define 的?沒仔細(xì)看代碼,想求證下。如果是串行的話,當(dāng)開發(fā)時(shí)私有模塊超過 20 多個(gè)時(shí),豆瓣內(nèi)部是怎么縮短模塊加載時(shí)間的?(之前在淘寶遇到了這個(gè)問題,SeaJS 中改成并行才解決,但并行導(dǎo)致代碼有些 hacky,不爽)
異步模塊的支持挺有意思,但感覺有悖模塊加載器的本職工作。個(gè)人覺得模塊加載器不應(yīng)該涉及異步等待邏輯。如果需要等待,可以調(diào)整依賴來解決。
遠(yuǎn)程模塊的設(shè)計(jì),個(gè)人覺得讓 define 承擔(dān)了不應(yīng)該承擔(dān)的職責(zé)。比如
define("a", ["path/to/b.js"], "path/to/a.js")// 干了兩件事情:// 給模塊 a 動(dòng)態(tài)添加了依賴 b// 聲明模塊 a 的路徑是 path/to/a.js
上面兩件事情,是否通過 config 來配置會(huì)更明確?比如
require.config({
aliases: { "a": "path/to/a.js"
},
deps: { "a": ["path/to/b.js"]
}
})
在 SeaJS 里,通過增加 shim 配置來實(shí)現(xiàn),比如
seajs.config({
plugins: ["shim"], // 激活 shim 插件,有這個(gè)插件 shim 配置才生效shim: { // jQuery 的 shim 配置
'jquery': { exports: function() { return jQuery; }
}, // jQuery 插件的 shim 配置
'jquery-plugins': {
match: /jquery\.[a-z].*\.js/, // 匹配所有 jquery 插件,自動(dòng)化
deps: ['jquery'], // 動(dòng)態(tài)指定依賴
exports: 'jQuery'
}
}
})
shim 配置的方式,功能和 OzJS 的遠(yuǎn)程模塊類似,但在批量處理上,感覺更方便些,比如上面 jquery-plugins 的聲明方式,只要命名規(guī)則為 jquery.xxx.js 的插件,都自動(dòng)添加好了依賴,使用上,直接 require 真實(shí)路徑或 alias 就好。RequireJS 2.0 里,也是類似的處理方式。
從源碼上看,OzJS 中的 require
也是身兼多職。這是我一直很難接受 RequireJS 的重要原因之一。為什么不職責(zé)單一一些?全局中的 require 跟 參數(shù)中的 require 應(yīng)該不一樣,就像 NodeJS 中的 require 一樣,每個(gè)模塊的 require 是私有的,是有上下文環(huán)境的,這樣相對路徑的解析也更合理。可能是個(gè)人喜好,如有冒犯,請忽略。
new!
挺有意思,贊。
mo 里面的模塊挺小巧實(shí)用的,和 Arale 的理念異曲同工,呵呵。有個(gè)小疑問,mo 的模塊 id 都是固定的,比如 mo/cookie
,這樣,當(dāng) cookie 版本升級時(shí),如果是一個(gè)老頁面,有些功能點(diǎn)依賴 cookie 的老版本,但新功能點(diǎn)想依賴 cookie 的新版本,這種情況下,OzJS 里是如何處理的?Arale 里給每個(gè)模塊都加了版本,比如 arale/cookie/1.2.0/cookie
這種方式,這樣兩個(gè)不同版本的 cookie,可以認(rèn)為是完全兩個(gè)不同的模塊,因此可以并存。想知道豆瓣這一塊是如何處理。
建議 mo 里的模塊可以每個(gè)模塊一個(gè)獨(dú)立庫,這樣通過簡單的 transport 工具,可以和 Arale 的組件互通起來。對于生態(tài)圈,也想聽聽 @dexteryy 的想法。
更多建議: