最明顯的區別就是在模塊定義時對依賴的處理不同
1.AMD推崇依賴前置,在定義模塊的時候就要聲明其依賴的模塊2.CMD推崇就近依賴,只有在用到某個模塊的時候再去require這種區別各有優劣,只是語法上的差距,而且requireJS和SeaJS都支持對方的寫法
AMD和CMD最大的區別是對依賴模塊的執行時機處理不同,注意不是加載的時機或者方式不同
很多人說requireJS是異步加載模塊,SeaJS是同步加載模塊,這么理解實際上是不準確的,其實加載模塊都是異步的,只不過AMD依賴前置,js可以方便知道依賴模塊是誰,立即加載,而CMD就近依賴,需要使用把模塊變為字符串解析一遍才知道依賴了那些模塊,這也是很多人詬病CMD的一點,犧牲性能來帶來開發的便利性,實際上解析模塊用的時間短到可以忽略
為什么我們說兩個的區別是依賴模塊執行時機不同,為什么很多人認為ADM是異步的,CMD是同步的(除了名字的原因。。。)
同樣都是異步加載模塊,AMD在加載模塊完成后就會執行改模塊,所有模塊都加載執行完后會進入require的回調函數,執行主邏輯,這樣的效果就是依賴模塊的執行順序和書寫順序不一定一致,看網絡速度,哪個先下載下來,哪個先執行,但是主邏輯一定在所有依賴加載完成后才執行
CMD加載完某個依賴模塊后并不執行,只是下載而已,在所有依賴模塊加載完成后進入主邏輯,遇到require語句的時候才執行對應的模塊,這樣模塊的執行順序和書寫順序是完全一致的
這也是很多人說AMD用戶體驗好,因為沒有延遲,依賴模塊提前執行了,CMD性能好,因為只有用戶需要的時候才執行的原因.
原文:http://www.cnblogs.com/hgonlywj/p/4854038.html
兩者的主要區別如下:
定位有差異。RequireJS 想成為瀏覽器端的模塊加載器,同時也想成為 Rhino / Node 等環境的模塊加載器。Sea.js 則專注于 Web 瀏覽器端,同時通過 Node 擴展的方式可以很方便跑在 Node 環境中。
遵循的規范不同。RequireJS 遵循 AMD(異步模塊定義)規范,Sea.js 遵循 CMD (通用模塊定義)規范。規范的不同,導致了兩者 API 不同。Sea.js 更貼近 CommonJS Modules/1.1 和 Node Modules 規范。
推廣理念有差異。RequireJS 在嘗試讓第三方類庫修改自身來支持 RequireJS,目前只有少數社區采納。Sea.js 不強推,采用自主封裝的方式來“海納百川”,目前已有較成熟的封裝策略。
對開發調試的支持有差異。Sea.js 非常關注代碼的開發調試,有 nocache、debug 等用于調試的插件。RequireJS 無這方面的明顯支持。
插件機制不同。RequireJS 采取的是在源碼中預留接口的形式,插件類型比較單一。Sea.js 采取的是通用事件機制,插件類型更豐富。
還有不少差異,涉及具體使用方式和源碼實現,歡迎有興趣者研究并發表看法。
總之,如果說 RequireJS 是 PRototype 類庫的話,則 Sea.js 致力于成為 jQuery 類庫。
我可以說下AMD/CMD的區別以及我的看法:
有必要簡單提一下兩者的主要區別,CMD推崇依賴就近,可以把依賴寫進你的代碼中的任意一行,例:define(function(require, exports, module) { var a = require('./a') a.doSomething() var b = require('./b') b.doSomething()})代碼在運行時,首先是不知道依賴的,需要遍歷所有的require關鍵字,找出后面的依賴。具體做法是將function toString后,用正則匹配出require關鍵字后面的依賴。顯然,這是一種犧牲性能來換取更多開發便利的方法。而AMD是依賴前置的,換句話說,在解析和執行當前模塊之前,模塊作者必須指明當前模塊所依賴的模塊,表現在require函數的調用結構上為:define(['./a','./b'],function(a,b){ a.doSomething() b.doSomething()}) 代碼在一旦運行到此處,能立即知曉依賴。而無需遍歷整個函數體找到它的依賴,因此性能有所提升,缺點就是開發者必須顯式得指明依賴——這會使得開發工作量變大,比如:當你寫到函數體內部幾百上千行的時候,忽然發現需要增加一個依賴,你不得不回到函數頂端來將這個依賴添加進數組。細心的讀者可能發現,到目前位置我討論的AMD和CMD的思想的關于依賴的部分,都只討論的“硬依賴”,也就是執行前肯定需要的依賴,但是這不是全部的情況。有的時候情況是這樣的:// 函數體內:if(status){ a.doSomething()}在這個函數體內,可能依賴a,也可能不依賴a,我把這種可能的依賴成為“軟依賴”。對于軟依賴當然可以直接當硬依賴處理,但是這樣不經濟,因為依賴是不一定的,有可能加載了此處的依賴而實際上沒有用上。對于軟依賴的處理,我推薦依賴前置+回調函數的實現形式。上面的例子簡單表述如下:// 函數體內:if(status){ async(['a'],function(a){ a.doSomething() })}至此可以對由commonJS衍生出來的方案做出總結了。在瀏覽器端來設計模塊加載機制,需要考慮依賴的問題。我們先把依賴分為兩種,“強依賴” —— 肯定需要 和“弱依賴” —— 可能需要。對于強依賴,如果要性能優先,則考慮參照依賴前置的思想設計你的模塊加載器,我個人也更推崇這個方案一些;如果考慮開發成本優先,則考慮按照依賴就近的思想設計你的模塊加載器。對于弱依賴,只需要將弱依賴的部分改寫到回調函數內即可。如果現在我要實現一個模塊加載器,我會將強依賴前置,弱依賴采用異步回調函數的形式,其它的方法我認為都只是語法糖而已,僅此就夠了。
轉自: http://www.zhihu.com/question/21347409#answer-2323656
新聞熱點
疑難解答