什么是模塊化鹦马?為什么要模塊化?
命名沖突
:為了方便也避免重復(fù)造輪子物赶,我們習(xí)慣于把一些通用的、底層的工具抽離出來留晚,例如寫成一個函數(shù)放在另一個文件中酵紫,我們需要的時候再去引用就可以;但是在工具中被定義的變量我不能在當(dāng)前文件使用错维,因為會產(chǎn)生沖突導(dǎo)致工具無法正常使用奖地。所以我們希望這個工具能是一個獨立的空間,不要影響到當(dāng)前頁面的開發(fā)赋焕。
文件依賴
:當(dāng)我們在寫一個新工具的時候参歹,有可能會需要調(diào)用其它功能更小的工具;那么在執(zhí)行時因為js的同步特性宏邮,要使用這個新工具就必須要先加載小工具泽示,也就是說小工具要先于新工具去引入缸血;當(dāng)引入文件較多或者順序亂了之后維護起來非常困難。
原因
:使用模塊化主要是為了解決兩個問題:命名沖突和文件依賴械筛。
模塊化x命名沖突
:用面向?qū)ο蟮姆绞綄⒎椒ㄉ有骸⒐ぞ呓壴趯ο笊希患s定用關(guān)鍵字exports
暴露接口返回對象埋哟。
模塊化x文件依賴
:約定關(guān)鍵字require
來獲取對象將文件依賴內(nèi)置笆豁,不需要外部引入。
CMD赤赊、AMD闯狱、CommonJS 規(guī)范分別指什么?
Common JS
:它是一個規(guī)范抛计,它通過定義豐富的能解決一些通常的應(yīng)用開發(fā)需求的API來補足了js
官方關(guān)于標(biāo)準(zhǔn)庫的不足哄孤。建立它的意圖是希望開發(fā)者可以運用這些API去開發(fā)應(yīng)用,而且所開發(fā)的應(yīng)用能夠在不同的js環(huán)境中運行而不僅僅是瀏覽器吹截。服務(wù)器端的javascript
應(yīng)用node.js
就是運用Common JS
的一個例子瘦陈,服務(wù)器端的程序比瀏覽器端要更復(fù)雜,也需要與操作系統(tǒng)和其他程序互動波俄,因此服務(wù)器端必須要模塊塊以便應(yīng)對上述問題晨逝。node.js
參照Common JS
規(guī)范創(chuàng)建了模塊系統(tǒng),模塊系統(tǒng)通過exports
暴露接口返回對象懦铺,通過require
獲取接口返回的對象捉貌。例如
// math.js文件 的內(nèi)容:
exports.method=function(){
var obj=xxx;
// doing something
return obj;
};
// main.js文件 的內(nèi)容:
var newObj= require('math').method;
// 當(dāng)然 main.js可以繼續(xù)exports接口 以供其他文件調(diào)用
AMD
:"Asynchronous Module Definition"
即異步模塊定義,實現(xiàn)AMD的庫有RequireJS
冬念、curl
趁窃、Dojo
等。在服務(wù)器端采用的Common JS
規(guī)范到瀏覽器端因為同步執(zhí)行加載的問題會導(dǎo)致瀏覽器在加載獲取時處于假死狀態(tài)什么都不能做只能等引用加載完刘急,AMD
在這種環(huán)境下誕生了棚菊;AMD
采用異步加載的方式去獲取引用的js
,待加載完成后采取執(zhí)行對應(yīng)程序叔汁,從而避免了等待和瀏覽器假死的狀況。它的語法和應(yīng)用如下:
// 語法
define(id?,dependencies?,factory);
// id 即對這個模塊命名
// dependencies 這個模塊所依賴的其他模塊 多個時用數(shù)組傳遞
// factory 加載完成后執(zhí)行的回調(diào)函數(shù)
// math.js文件 定義模塊
define(function(){
var obj=xxx;
// doing somethig
return obj
})
// main.js文件 加載模塊
define(method,['math'],function(math){
//把加載的模塊傳遞進來 doing something
})
CMD
:CMD(Common Module Definition)是Sea JS
推廣過程中產(chǎn)生的检碗。在 CMD
規(guī)范中据块,一個模塊就是一個文件。其語法與comment js
類似折剃,不過多了一個外包裝另假;且相對與AMD
的提前設(shè)置依賴,CMD
的區(qū)別就是它將依賴內(nèi)置了怕犁,需要時就使用require
去獲取边篮,從表面上看實現(xiàn)了comment js的瀏覽器端化
己莺,但實質(zhì)是通過設(shè)置外包裝 define(function(require, exports, module){}
來包裹代碼,提前去加載引用的模塊戈轿,等加載完成后再同步執(zhí)行凌受。
// 語法 一個模塊就是一個文件
define(factory);
//math.js 定義
define(function(require, exports, module){
exports.obj=xxx;
})
// main.js 加載引用
define(function(require, exports, module){
var method=require('math').obj;
//doing something
})
// 當(dāng)然這個模塊也可以繼續(xù)exports接口 讓其他模塊調(diào)用