題目1: 為什么要使用模塊化?
模塊化可以使你的代碼低耦合,功能模塊直接不相互影響。模塊化主要有以下幾點(diǎn)好處:
1.可維護(hù)性:根據(jù)定義,每個(gè)模塊都是獨(dú)立的。良好設(shè)計(jì)的模塊會(huì)盡量與外部的代碼撇清關(guān)系,以便于獨(dú)立對(duì)其進(jìn)行改進(jìn)和維護(hù)。維護(hù)一個(gè)獨(dú)立的模塊比起一團(tuán)凌亂的代碼來(lái)說(shuō)要輕松很多。
2.命名空間:在JavaScript中,最高級(jí)別的函數(shù)外定義的變量都是全局變量(這意味著所有人都可以訪問(wèn)到它們)。也正因如此,當(dāng)一些無(wú)關(guān)的代碼碰巧使用到同名變量的時(shí)候,我們就會(huì)遇到“命名空間污染”的問(wèn)題。
這樣的問(wèn)題在我們開(kāi)發(fā)過(guò)程中是要極力避免的。
3.可復(fù)用性:現(xiàn)實(shí)來(lái)講,在日常工作中我們經(jīng)常會(huì)復(fù)制自己之前寫(xiě)過(guò)的代碼到新項(xiàng)目中。
參考鏈接
題目2: CMD、AMD、CommonJS 規(guī)范分別指什么?有哪些應(yīng)用
- CommonJS
CommonJS規(guī)范是誕生比較早的。NodeJS就采用了CommonJS。是這樣加載模塊:
var clock = require('clock');
clock.start();
這種寫(xiě)法適合服務(wù)端,因?yàn)樵诜?wù)器讀取模塊都是在本地磁盤(pán),加載速度很快。但是如果在客戶端,加載模塊的時(shí)候有可能出現(xiàn)“假死”狀況。比如上面的例子中clock的調(diào)用必須等待clock.js請(qǐng)求成功,加載完畢。那么,能不能異步加載模塊呢?
- AMD
AMD,即 (Asynchronous Module Definition),這種規(guī)范是異步的加載模塊,requireJs應(yīng)用了這一規(guī)范。先定義所有依賴,然后在加載完成后的回調(diào)函數(shù)中執(zhí)行:
require([module], callback);
用AMD寫(xiě)上一個(gè)模塊:
require(['clock'],function(clock){
clock.start();
});
AMD雖然實(shí)現(xiàn)了異步加載,但是開(kāi)始就把所有依賴寫(xiě)出來(lái)是不符合書(shū)寫(xiě)的邏輯順序的,能不能像commonJS那樣用的時(shí)候再require,而且還支持異步加載后再執(zhí)行呢?
- CMD
CMD (Common Module Definition), 是seajs推崇的規(guī)范,CMD則是依賴就近,用的時(shí)候再require。它寫(xiě)起來(lái)是這樣的:
define(function(require, exports, module) {
var clock = require('clock');
clock.start();
});
AMD和CMD最大的區(qū)別是對(duì)依賴模塊的執(zhí)行時(shí)機(jī)處理不同,而不是加載的時(shí)機(jī)或者方式不同,二者皆為異步加載模塊。 AMD依賴前置,js可以方便知道依賴模塊是誰(shuí),立即加載;
而CMD就近依賴,需要使用把模塊變?yōu)樽址馕鲆槐椴胖酪蕾嚵四切┠K,這也是很多人詬病CMD的一點(diǎn),犧牲性能來(lái)帶來(lái)開(kāi)發(fā)的便利性,實(shí)際上解析模塊用的時(shí)間短到可以忽略。
AMD應(yīng)用:RequireJS、curl、Dojo
CMD應(yīng)用:SeaJS
CommonJS應(yīng)用:NodeJs
原文鏈接
其他文章