1. 為什么要使用模塊化?
模塊的由來:
嵌入網(wǎng)頁的JS代碼越來越龐大,越來越像桌面程序躯喇,需要一個團隊去分工協(xié)作,進行管理和測試等等硝枉,為了更好的管理網(wǎng)頁的業(yè)務(wù)邏輯廉丽,產(chǎn)生了模塊化編程的理念。
模塊化有以下好處:
- 解決命名的沖突
- 實現(xiàn)依賴管理
- 提高代碼可讀性
- 代碼解耦妻味,提高復(fù)用性
2. CMD正压、AMD、CommonJS 規(guī)范分別指什么责球?有哪些應(yīng)用
CMD
通用模塊定義common module definition 通過 exports 暴露接口焦履。這意味著不需要命名空間了,更不需要全局變量雏逾。這是一種徹底的命名沖突解決方案嘉裤。 通過 require 引入依賴。這可以讓依賴內(nèi)置栖博,開發(fā)者只需關(guān)心當(dāng)前模塊的依賴屑宠,其他事情 Sea.js 都會自動處理好。
//acfun.js
define(function(require, exports) {
var until = require('./until.js');
exports.init = function() {
};
})
// index.html
<script src="sea.js"></script>
<script>
seajs.use('acfun', function(Acfun) {
Acfun.init();
})
</script>
AMD
AMD 即Asynchronous Module Definition仇让。它是一個在瀏覽器端模塊化開發(fā)的規(guī)范典奉。由于不是JavaScript原生支持躺翻,使用AMD規(guī)范進行頁面開發(fā)需要用到對應(yīng)的庫函數(shù),也就是大名鼎鼎RequireJS卫玖,實際上AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化的產(chǎn)出
主要解決兩個問題:
多個js文件可能有依賴關(guān)系公你,被依賴的文件需要早于依賴它的文件加載到瀏覽器
js加載的時候瀏覽器會停止頁面渲染,加載文件越多假瞬,頁面失去響應(yīng)時間越長
// 定義模塊 myModule.js
define(['dependency'], function() {
var name = "Hunger";
function printName() {
console.log(name);
}
return {
printName:printName
}
})
// 加載
require(['myModule'], function(e) {
e.printName();
})
CommonJS
根據(jù)這個規(guī)范陕靠,每個文件就是一個模塊,有自己的作用域笨触。在一個文件里面定義的變量懦傍、函數(shù)、類芦劣,都是私有的粗俱,對其他文件不可見。
每個模塊內(nèi)部虚吟,module變量代表當(dāng)前模塊寸认。這個變量是一個對象,它的exports屬性(即module.exports)是對外的接口串慰。加載某個模塊偏塞,其實是加載該模塊的module.exports屬性。
特點
所有代碼都運行在模塊作用域邦鲫,不會污染全局作用域灸叼。
模塊可以多次加載,但是只會在第一次加載時運行一次庆捺,然后運行結(jié)果就被緩存了古今,以后再加載,就直接讀取緩存結(jié)果滔以。要想讓模塊再次運行捉腥,必須清除緩存,模塊加載的順序是按照其在代碼中出現(xiàn)的順序你画。
// 定義模塊 myModule.js
var x = 5;
var addX = function (value) {
return value + x;
}
module.exports = {
x: x,
addX: addX
};
// 加載
var e = require('./myModule.js');
e.addX(2);
3. 使用 requirejs 完善入門任務(wù)15抵碟,包括如下功能:
1. 首屏大圖為全屏輪播
2. 有回到頂部功能
3. 圖片區(qū)使用瀑布流布局(圖片高度不一),下部有加載更多按鈕坏匪,點擊加載更多會加載更多數(shù)據(jù)(數(shù)據(jù)在后端 mock)
4. 使用 r.js 打包應(yīng)用