1.為什么要使用模塊化?
解決命名沖突
依賴(lài)管理
提高代碼可讀性
代碼解耦,提高復(fù)用性
2.CMD、AMD、CommonJS規(guī)范分別指什么?有哪些應(yīng)用
CMD(Common Module Definition)通用模塊定義,CMD的規(guī)范是SeaJS推廣過(guò)程中產(chǎn)生的,是國(guó)內(nèi)發(fā)展出來(lái)的,與AMD不同的是,在模塊定義方式和模塊加載時(shí)機(jī)上有所不同。SeaJS推崇一個(gè)模塊一個(gè)文件,遵循統(tǒng)一的寫(xiě)法
define(id?,deps?,factory)
factory有三個(gè)參數(shù)
function(require,exports,module)
require是factory的第一個(gè)參數(shù),require(id)
require是一個(gè)方法,接受模塊標(biāo)識(shí)作為唯一參數(shù),用來(lái)獲取其他模塊提供的接口
exports是一個(gè)對(duì)象,用來(lái)向外提供模塊接口
module是一個(gè)對(duì)象,上面存儲(chǔ)了與當(dāng)前模塊相關(guān)聯(lián)的一些屬性和方法
demo
//定義模塊myModule.js
define(function(require,exports,module){
var $ = require('jquery.js');
$('div').addClass('active');
})
//加載模塊
seajs.use(['myModule.js'], function(my){
})
AMD(Asynchronous Module Definition)異步模塊定義,指定一種機(jī)制,在該機(jī)制下模塊和依賴(lài)可以異步加載,它是一個(gè)在瀏覽器端模塊化開(kāi)發(fā)的規(guī)范。由于不是JavaScript原生支持,使用AMD規(guī)范進(jìn)行頁(yè)面開(kāi)發(fā)需要用到對(duì)應(yīng)的庫(kù)函數(shù),也就是RequireJS,實(shí)際上AMD是RequireJS在推廣過(guò)程中對(duì)模塊定義的規(guī)范化的產(chǎn)出。
語(yǔ)法:
define(id?,dependencies?,factory)
demo
//定義模塊myModule.js
define(['dependency'], function(){
var name = 'Byron';
function printName(){
console.log(name);
}
return {
printName: printName
}
})
//加載模塊
require(['myModule'],function(my){
my.printName()
})
require()函數(shù)在加載依賴(lài)的函數(shù)的時(shí)候是異步加載的,這樣瀏覽器不會(huì)失去響應(yīng),它指定的回調(diào)函數(shù)只有前面的模塊都加載成功后才會(huì)運(yùn)行,解決了依賴(lài)性的問(wèn)題。
CommonJS是服務(wù)器端模塊的規(guī)范,NodeJS采用了這個(gè)規(guī)范。
1.定義模塊:根據(jù)CommonJS規(guī)范,一個(gè)單獨(dú)的文件就是一個(gè)模塊,每一個(gè)模塊都是一個(gè)單獨(dú)的作用域,也就是說(shuō),在該模塊內(nèi)部定義的變量無(wú)法被其他模塊讀取,除非定義為global對(duì)象的屬性
2.模塊輸出:模塊只有一個(gè)出口,module.exports
對(duì)象,把模塊希望輸出的內(nèi)容放入該對(duì)象
3.加載模塊:加載模塊使用require方法,該方法讀取一個(gè)文件并執(zhí)行,返回文件內(nèi)部的module.exports
對(duì)象
demo
//定義模塊myModel.js
var name = 'Byron';
function printName(){
console.log(name);
}
function printFullName(firstName){
console.log(firstName + name);
}
module.exports = {
printName: printName,
printFullName: printFullName
}
//加載模塊
var nameModel = require('./myModel.js');
nameModel.printName();
不同的實(shí)現(xiàn)對(duì)require時(shí)的路徑有不同要求,一般情況可以省略js擴(kuò)展名,可以使用相對(duì)路徑,也可以使用絕對(duì)路徑,甚至可以省略路徑直接使用模塊名(前提是該模塊是系統(tǒng)內(nèi)置模塊)。
3.使用requireJS完善入門(mén)任務(wù)15,包括如下功能
1. 首屏大圖為全屏輪播
2. 有回到頂部功能
3. 圖片區(qū)使用瀑布流布局(圖片高度不一),下部有加載更多按鈕,點(diǎn)擊加載更多會(huì)加載更多數(shù)據(jù)
4. 使用 r.js 打包應(yīng)用