1.惱人的命名衝突;前端
2.繁瑣的文件依賴;正則表達式
1.解決命名衝突和依賴管理;數組
2.模塊的版本管理;瀏覽器
3.提升代碼的可維護性;性能優化
4.前端性能優化;網絡
JavaScript自己不具有模塊化的功能,開發人員爲了更好的開發,須要人爲的制定一套規範標準,約定一套固定的寫法來實現JavaScript模塊化功能。框架
一個模塊化系統所必須的能力:異步
AMD(Asynchronous Module Definition)異步模塊定義: 是 RequireJS 在推廣過程當中對模塊定義的規範化產出。前端性能
requireJS主要解決兩個問題模塊化
requireJS定義了一個函數 define,它是全局變量,用來定義模塊
define(id?, dependencies?, factory);
在頁面上使用require函數加載模塊
require([dependencies], function(){});
require()函數接受兩個參數
require()函數在加載依賴的函數的時候是異步加載的,這樣瀏覽器不會失去響應,它指定的回調函數,只有前面的模塊都加載成功後,纔會運行,解決了依賴性的問題。
CMD(Common Module Definition)通用模塊定義: 是SeaJS 在推廣過程當中對模塊定義的規範化產出。
Sea.js 推崇一個模塊一個文件,遵循統一的寫法。Sea.js定義了一個函數define,它是全局變量,用來定義模塊
define(id?, deps?, factory)
由於CMD推崇一個文件一個模塊,因此常常就用文件名做爲模塊id。CMD推崇依賴就近,因此通常不在define的參數中寫依賴,在factory函數中寫,factory函數有三個參數:require, exports, module。
function(require, exports, module)
require(id)----require 是一個方法,接受 模塊標識 做爲惟一參數,用來獲取其餘模塊提供的接口
exports 是一個對象,用來向外提供模塊接口
module 是一個對象,上面存儲了與當前模塊相關聯的一些屬性和方法
AMD和CMD最大的區別在於執行的時機不一樣,注意不是加載的時機。對於依賴的模塊,AMD 是提早執行,CMD 是延遲執行。
AMD,CMD在模塊的加載方面是沒有差別的,都是異步加載,而且順序不可控,在factory執行時,其依賴模塊都已被加載。
在上述代碼中,AMD中在BEGIN處a、b模塊都已被加載且factory都是執行過的;
在上述代碼中,CMD中雖然a、b模塊在BEGIN處已被加載,但factory還沒有執行,須要調用require執行依賴模塊。在END處,a,b模塊實際只執行了一個,這就是CMD中着重強調的延遲執行。
注意:AMD,CMD所說的執行是指factory函數的執行!文件異步加載完成,當即執行的是define函數(即當即註冊模塊),而模塊化框架控制的是factory函數的執行順序。