AMD卒密、CMD缀台、requirejs

題目1: 為什么要使用模塊化?

模塊化可以使代碼低耦合栅受,功能模塊直接不相互影響将硝。

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)題。
3.提高代碼的可復(fù)用性歌逢。
4.進(jìn)行依賴管理巾钉。

題目2: CMD、AMD秘案、CommonJS 規(guī)范分別指什么砰苍?有哪些應(yīng)用

Asynchronous Module Definition (AMD)/(異步模塊定義)

它推崇依賴前置,采用異步方式加載模塊阱高,模塊的加載不影響它后面語(yǔ)句的運(yùn)行赚导。所有依賴這個(gè)模塊的語(yǔ)句,都定義在一個(gè)回調(diào)函數(shù)中赤惊,等到加載完成之后吼旧,這個(gè)回調(diào)函數(shù)才會(huì)運(yùn)行。
特點(diǎn)/缺點(diǎn):

  • 依賴前置,需要在定義的時(shí)候未舟,寫(xiě)好需要的依賴圈暗。
  • 多個(gè)JS有依賴關(guān)系。被依賴的JS需要早于依賴它的文件提前加入处面。
  • JS加載的時(shí)候厂置,頁(yè)面會(huì)停止渲染。加載的文件越多魂角。頁(yè)面失去響應(yīng)的時(shí)間越長(zhǎng)。

應(yīng)用:Reauire.js

//定義模塊:
define(id ?, dependencies?, function)
-----------------------------------------------
//id:可選參數(shù),用來(lái)定義模塊標(biāo)識(shí)智绸。如果沒(méi)有寫(xiě)野揪,就用文件名访忿。
//denpendencies:當(dāng)前的模塊依賴的模塊,數(shù)組形式斯稳。
//function:執(zhí)行的函數(shù)
//加載模塊
require([dependencies], function)
//---------------------------------------------
//dependencies:當(dāng)前模塊需要的依賴的模塊海铆。
//function:回調(diào)函數(shù),在模塊加載完了后挣惰,會(huì)被執(zhí)行卧斟。
//require是異步執(zhí)行。在依賴模塊沒(méi)有被加載完憎茂。是不會(huì)執(zhí)行回調(diào)函數(shù)的珍语。同時(shí)瀏覽器不會(huì)失去響應(yīng)。

Common Module Definition ——(CMD)

通用模塊定義,是一種模塊定義方式和模塊加載方式的規(guī)范

  • 依賴就近竖幔,需要的時(shí)候再引入這個(gè)依賴項(xiàng)板乙,用的時(shí)候再require。
  • 推崇一個(gè)文件一個(gè)模塊拳氢,所以經(jīng)常將文件名作為模塊id
  • 因推崇依賴就近募逞,所以一般不在define的參數(shù)中寫(xiě)依賴,在factory中寫(xiě)馋评。

應(yīng)用:sea.js

define(function(require,exports,module){})
//require:獲取其他的模塊提供的接口放接。
//exports:對(duì)外提供模塊的接口。
//module是個(gè)對(duì)象留特,上面存儲(chǔ)了與當(dāng)前模塊相關(guān)的屬性和方法
//定義模塊
define(function(require, exports, module){
  var $ = require('jquery.js')
  $('div').removeClass('active')
})

 //加載模塊
seajs.use(['myModule.js'], function(my){
  
})

AMD與CMD的差別是:AMD是首先加載所有模塊纠脾,再執(zhí)行,而CMD是按需加載磕秤。AMD依賴前置乳乌,js可以方便知道依賴模塊是誰(shuí),立即加載市咆;而CMD就近依賴汉操,需要使用把模塊變?yōu)樽址馕鲆槐椴胖酪蕾嚵四切┠K,這也是很多人詬病CMD的一點(diǎn)蒙兰,犧牲性能來(lái)帶來(lái)開(kāi)發(fā)的便利性磷瘤,實(shí)際上解析模塊用的時(shí)間短到可以忽略。如今requireJS和seaJS都已經(jīng)是過(guò)去時(shí)搜变,webpack和Browserify成為主流

CommonJS

  • 一個(gè)單獨(dú)的文件就是一個(gè)模塊采缚,每個(gè)模塊都是一個(gè)單獨(dú)的作用域
    在模塊內(nèi)部定義的變量,無(wú)法被其他模塊讀取挠他,除非定義為global對(duì)象的屬性
  • 模塊輸出:模塊只有一個(gè)出口扳抽,module.exports對(duì)象,我們需要把模塊希望輸出的內(nèi)容放入該對(duì)象
  • 加載模塊:加載模塊使用require方法,該方法讀取一個(gè)文件并執(zhí)行贸呢,返回 文件內(nèi)部的module.exports對(duì)象镰烧,如果請(qǐng)求的模塊不能返回,那么”require”必須拋出一個(gè)錯(cuò)誤楞陷。
//定義模塊 myModule.js
var name =  'mamba'

function printName(){
  console.log(name)
}

function printFullName(firstName){
    console.log(firstName + name);
}

//輸出模塊
module.exports = {
    printName: printName,
    printFullName: printFullName
}

//加載模塊
var nameModule = require('./myModule.js') //不同的實(shí)現(xiàn)對(duì)require時(shí)的路徑有不同要求怔鳖,一般情況可以省略js拓展名,可以使用相對(duì)路徑固蛾,也可以使用絕對(duì)路徑结执,甚至可以省略路徑直接使用模塊名(前提是該模塊是系統(tǒng)內(nèi)置模塊)

//使用模塊
nameModule.printName();

應(yīng)用:因?yàn)閞equire是同步的,所以主要在服務(wù)器端使用
瀏覽器端加載JavaScript是異步的艾凯,所以傳統(tǒng)的CommonJS在瀏覽器環(huán)境中無(wú)法正常加載献幔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市览芳,隨后出現(xiàn)的幾起案子斜姥,更是在濱河造成了極大的恐慌,老刑警劉巖沧竟,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铸敏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡悟泵,警方通過(guò)查閱死者的電腦和手機(jī)杈笔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)糕非,“玉大人蒙具,你說(shuō)我怎么就攤上這事⌒喾剩” “怎么了禁筏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衡招。 經(jīng)常有香客問(wèn)我篱昔,道長(zhǎng),這世上最難降的妖魔是什么始腾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任州刽,我火速辦了婚禮,結(jié)果婚禮上浪箭,老公的妹妹穿的比我還像新娘穗椅。我一直安慰自己,他們只是感情好奶栖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布匹表。 她就那樣靜靜地躺著门坷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桑孩。 梳的紋絲不亂的頭發(fā)上拜鹤,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天框冀,我揣著相機(jī)與錄音流椒,去河邊找鬼。 笑死明也,一個(gè)胖子當(dāng)著我的面吹牛宣虾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播温数,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼绣硝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了撑刺?” 一聲冷哼從身側(cè)響起鹉胖,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎够傍,沒(méi)想到半個(gè)月后甫菠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冕屯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年寂诱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片安聘。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痰洒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浴韭,到底是詐尸還是另有隱情丘喻,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布念颈,位于F島的核電站泉粉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舍肠。R本人自食惡果不足惜搀继,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翠语。 院中可真熱鬧叽躯,春花似錦、人聲如沸肌括。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至黑滴,卻和暖如春憨募,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袁辈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工菜谣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晚缩。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓尾膊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荞彼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冈敛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 為什么要使用模塊化寞缝? 最主要的目的:解決命名沖突依賴管理 其他價(jià)值提高代碼可讀性代碼解耦癌压,提高復(fù)用性 CMD、AM...
    Eazer閱讀 656評(píng)論 3 1
  • 題目1: 為什么要使用模塊化第租? 模塊的由來(lái):嵌入網(wǎng)頁(yè)的JS代碼越來(lái)越龐大措拇,越來(lái)越像桌面程序,需要一個(gè)團(tuán)隊(duì)去分工協(xié)作...
    蕭雪圣閱讀 274評(píng)論 0 0
  • 題目1: 為什么要使用模塊化慎宾? 最主要的目的:1.解決命名沖突2.依賴管理其他價(jià)值:1.提高代碼可讀性2.代碼解耦...
    saintkl閱讀 309評(píng)論 0 0
  • 題目1: 為什么要使用模塊化丐吓? 解決命名沖突 依賴管理 提高代碼可讀性 代碼解耦,提高復(fù)用性 題目2: CMD趟据、A...
    撫年華輕過(guò)閱讀 341評(píng)論 0 0
  • (44)致良知是一種偉大的力量券犁! 2017年7月14星期五 涌泉學(xué)苑學(xué)習(xí)班第期 第44天 【涌泉學(xué)苑期北大群23孫...
    聞君兒閱讀 256評(píng)論 0 1