執行模塊的機制大不同
-----------------------------------
因爲 RequireJS 是執行的 AMD 規範, 所以全部的依賴模塊都是先執行.
使用 RequireJS 默認定義模塊的方式, 在理解上會更清楚一些, 但我的仍是偏心 require('./mod1') 這樣的方式
define(['dep1', 'dep2'], function (dep1, dep2) {
//Define the module value by returning a value.
return function () {};
});
但願文章沒有誤人子弟, 謝謝
@Jaward華仔 的意見, 請你們多看評論, 評論更有料...
---------------------------------------------------------------------------
SeaJS對模塊的態度是懶執行, 而RequireJS對模塊的態度是預執行
不明白? 讓咱們來舉個例子
以下模塊經過SeaJS/RequireJS來加載, 執行結果會是怎樣?
define(function(require, exports, module) {
console.log('require module: main');
var mod1 = require('./mod1');
mod1.hello();
var mod2 = require('./mod2');
mod2.hello();
return {
hello: function() {
console.log('hello main');
}
};
});
猜猜看?
先試試SeaJS的執行結果
require module: main
require module: mod1
hello mod1
require module: mod2
hello mod2
hello main
![很正常嘛, 我也是這麼想的...](http://static.javashuo.com/static/loading.gif) |
很正常嘛, 我也是這麼想的...
|
再來是RequireJS的執行結果
require module: mod1
require module: mod2
require module: main
hello mod1
hello mod2
hello main
![神馬狀況? 你他麼是在逗我嗎?](http://static.javashuo.com/static/loading.gif) |
神馬狀況? 你他麼是在逗我嗎?
|
RequireJS你坑的我一滾啊, 這也就是爲何我不喜歡RequireJS的緣由, 坑隱藏得太深了.
終於明白
玉伯說的那句: "
RequireJS 是沒有明顯的 bug,SeaJS 是明顯沒有 bug"是什麼意思了
所以咱們得出結論(分別使用SeaJS 2.0.0和RequireJS 2.1.6進行測試)
-------------------------
SeaJS只會在真正須要使用(依賴)模塊時才執行該模塊
SeaJS是異步加載模塊的沒錯, 但執行模塊的順序也是嚴格按照模塊在代碼中出現(require)的順序, 這樣才更符合邏輯吧! 你說呢, RequireJS?
而RequireJS會先儘早地執行(依賴)模塊, 至關於全部的require都被提早了, 並且模塊執行的順序也不必定100%就是先mod1再mod2
所以你看到執行順序和你預想的徹底不同! 顫抖吧~ RequireJS!
詳細的代碼請參考
-------------------------
SeaJS測試加載/執行模塊
RequireJS測試加載/執行模塊
後記
-------
注意我這裏說的是執行(真正運行define中的代碼)模塊, 而非加載(load文件)模塊.
模塊的加載都是並行的, 沒有區別, 區別在於執行模塊的時機, 或者說是解析.
爲了說明阻塞的問題, 翠花上圖
![SeaJS的懶執行](http://static.javashuo.com/static/loading.gif) |
SeaJS的懶執行
|
![RequireJS的預執行](http://static.javashuo.com/static/loading.gif) |
RequireJS的預執行
|
注意圖中巨大的pinyin-dict.js模塊, 取自
pinyin.js, 複製了N次後以增長它的"重量", 加強演示效果, 你們有興趣的話能夠親手試試. 能夠很明顯的看出RequireJS的作法是並行加載全部依賴的模塊, 並完成解析後, 再開始執行其餘代碼, 所以執行結果只會"停頓"1次, 完成整個過程是會比SeaJS要快. 而SeaJS同樣是並行加載全部依賴的模塊, 但不會當即執行模塊, 等到真正須要(require)的時候纔開始解析, 這裏耗費了時間, 由於這個特例中的模塊巨大, 所以形成"停頓"2次的現象, 這就是我所說的SeaJS中的"懶執行". 最後感謝你們的各類意見建議, 我這裏並無說SeaJS與RequireJS哪一個更好一些, 僅僅是爲了說明下他們的區別, 各類取捨請你們根據實際狀況來定, 但願能幫到你們.