SeaJS與RequireJS最大的區別

SeaJS與RequireJS最大的區別

U_U U_U 2013-06-20 16:21:12
 
牛人觀點:
1,
我我的感受requirejs更科學,全部依賴的模塊要先執行好。若是A模塊依賴B。當執行A中的某個操doSomething()後,再去依賴執行B模塊require('B');若是B模塊出錯了,doSomething的操做如何回滾?
不少語言中的import, include, useing都是先將導入的類或者模塊執行好。若是被導入的模塊都有問題,有錯誤,執行當前模塊有何意義?
總之載入的全部模塊,都是當前要使用的,爲何要動態的去執行?這個問題能夠總結爲模塊的載入執行是靜態仍是動態。若是是動態執行的話,那頁面的程序執行過程會受到當前模塊執行的影響。而正如樓主所言,動態執行整體時間上是比靜態一次執行要慢的。
樓主說requirejs是坑,是由於你還不太理解AMD「異步模塊」的定義,被依賴的模塊必須先於當前模塊執行,而沒有依賴關係的模塊,能夠沒 有前後。在樓主的例子中,假設mod1和mod2某天發生了依賴的話,好比在某個版本,mod1依賴了mod2(這是徹底有可能的),這個時候seajs 的懶執行會不會有問題?而requirejs是不會有問題,也不須要修改當前模塊。
在javascript這個天生異步的語言中,卻把模塊懶執行,這讓人很不理解。想像一下factory是個模塊工廠吧,而依賴 dependencies是工廠的原材料,在工廠進行生產的時候,是先把原材料一次性都在它本身的工廠里加工好,仍是把原材料的工廠搬到當前的 factory來何時須要,何時加工,哪一個總體時間效率更高?顯然是requirejs,requirejs是加載便可用的。爲了響應用戶的某個 操做,當前工廠正在進行生產,當發現須要某種原材料的時候,忽然要中止生產,去啓動原材料加工,這不是讓當前工廠很是焦燥嗎?
暫且不去理會這個吧,等ECMA規範中加入了模塊化的定義後,再看誰更合理吧。


2,
AMD 運行時核心思想是「Early Executing」,也就是提早執行依賴。這個好理解:

//main.js
define(['a', 'b'], function(A, B) {
    //運行至此,a.js 和 b.js 已下載完成(運行於瀏覽器的 Loader 必須如此);
    //A、B 兩個模塊已經執行完,直接可用(這是 AMD 的特性);

    return function () {};
});
我的以爲,AMD 的這個特性有好有壞:

首先,儘早執行依賴能夠儘早發現錯誤。上面的代碼中,假如 a 模塊中拋異常,那麼 main.js 在調用 factory 方法以前必定會收到錯誤,factory 不會執行;若是按需執行依賴,結果是:1)沒有進入使用 a 模塊的分支時,不會發生錯誤;2)出錯時,main.js 的 factory 方法極可能執行了一半。

另外,儘早執行依賴一般能夠帶來更好的用戶體驗,也容易產生浪費。例如模塊 a 依賴了另一個須要異步加載數據的模塊 b,儘早執行 b 可讓等待時間更短,同時若是 b 最後沒被用到,帶寬和內存開銷就浪費了;這種場景下,按需執行依賴能夠避免浪費,可是帶來更長的等待時間。

我我的更傾向於 AMD 這種作法。舉一個不太恰當的例子:Chrome 和 Firefox 爲了更好的體驗,對於某些類型的文件,點擊下載地址後會詢問是否保存,這時候實際上已經開始了下載。有時候等了好久才點確認,會開心地發現文件已經下好; 若是點取消,瀏覽器會取消下載,已下載的部分就浪費了。
https://www.imququ.com/post/amd-simplified-commonjs-wrapping.html
相關文章
相關標籤/搜索