SeaJS與RequireJS最大的區別

2021-08-28 07:36:12 字數 2045 閱讀 7097

如下模組通過seajs/requirejs來載入, 執行結果會是怎樣?

define(function(require, exports, module)

};});

猜猜看?

先試試seajs的執行結果

很正常嘛, 我也是這麼想的...

再來是requirejs的執行結果

神馬情況? 你他麼是在逗我嗎?

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的懶執行

requirejs的預執行

注意圖中巨大的pinyin-dict.js模組, 取自pinyin.js, 複製了n次後以增加它的"重量", 增強演示效果, 大家有興趣的話可以親手試試.

可以很明顯的看出requirejs的做法是並行載入所有依賴的模組, 並完成解析後, 再開始執行其他**, 因此執行結果只會"停頓"1次, 完成整個過程是會比seajs要快.

而seajs一樣是並行載入所有依賴的模組, 但不會立即執行模組, 等到真正需要(require)的時候才開始解析, 這裡耗費了時間, 因為這個特例中的模組巨大, 因此造成"停頓"2次的現象, 這就是我所說的seajs中的"懶執行".

最後感謝大家的各種意見建議, 我這裡並沒有說seajs與requirejs哪個更好一些, 僅僅是為了說明下他們的區別, 各種取捨請大家根據實際情況來定, 希望能幫到大家.

SeaJS 與 RequireJS 的差異

cmd 模組依賴宣告方式 define function require cmd 依賴是就近宣告,通過內部require方法進行宣告。但是因為是非同步模組,載入器需要提前載入這些模組,所以模組真正使用前需要提取模組裡面所有的依賴。無論是載入器即時提取,還是通過自動化工具預先提取,cmd 的這種依賴宣...

SeaJs與RequireJs執行差異

seajs與requirejs在模組的載入方面是沒有差異的,無論是requirejs在定義模組時定義的依賴模組,還是seajs在factory函式中require的依賴模組,在會在載入當前模組時被載入,非同步,並且順序不可控。差異在於factory函式執行的時機。為了增強對比,我們在定義依賴模組的時...

SeaJS 與 RequireJS 的差異對比

這篇文章主要介紹了seajs 與 requirejs 的差異對比,本文主要對cmd規範和amd規範的弊端做了對比,並做出了乙個總結,需要的朋友可以參考下 歷史不是過去,歷史正在上演。隨著 w3c 等規範 以及瀏覽器的飛速發展,前端的模組化開發會逐步成為基礎設施。一切終究都會成為歷史,未來會更好。引用...