1. 為什么要使用模塊化抵卫?
1.解決命名沖突
2.解決文件依賴問題
3.模塊的版本管理柳恐。通過別名等配置,配合構建工具狸捕,可以比較輕松地實現模塊的版本管理喷鸽。
4.提高可維護性。模塊化可以讓每個文件的職責單一灸拍,非常有利于代碼的維護做祝。
5.前端性能優(yōu)化。通過異步加載模塊鸡岗,這對頁面性能非常有益混槐。
6.跨環(huán)境共享模塊。CMD 模塊定義規(guī)范與 Node.js 的模塊規(guī)范非常相近轩性∩牵可以很方便實現模塊的跨服務器和瀏覽器共享。
7.提高代碼可讀性,代碼解耦揣苏,提高復用性
參考:玉伯也射雕github
2. CMD捌刮、AMD、CommonJS 規(guī)范分別指什么舒岸?有哪些應用
CommonJS
1.Node應用由模塊組成绅作,采用CommonJS模塊規(guī)范。
根據這個規(guī)范蛾派,每個文件就是一個模塊俄认,有自己的作用域。在一個文件里面定義的變量洪乍、函數眯杏、類,都是私有的壳澳,對其他文件不可見
2.CommonJS規(guī)范規(guī)定岂贩,每個模塊內部,module變量代表當前模塊巷波。這個變量是一個對象萎津,它的exports屬性(即module.exports
)是對外的接口。加載某個模塊抹镊,其實是加載該模塊的module.exports屬性
,加載模塊使用require 方法
锉屈,該方法讀取一個文件并執(zhí)行,如果請求的模塊不能返回垮耳,那么 require 必須拋出一個錯誤颈渊。
3.CommonJS模塊的特點
如下:
所有代碼都運行在模塊作用域遂黍,不會污染全局作用域。
模塊可以多次加載俊嗽,但是只會在第一次加載時運行一次雾家,然后運行結果就被緩存了,以后再加載绍豁,就直接讀取緩存結果榜贴。要想讓模塊再次運行,必須清除緩存妹田。
模塊加載的順序,按照其在代碼中出現的順序
/*
模塊定義model.js
*/
function printName(){
console.log('a');
}
function sayHello(){
console.log("hello" );
}
module.exports = {
printName: printName,
sayHello: sayHello
}
/*
加載模塊
*/
var nameModule = require("./model.js")
nameModule.printName() //"a"
nameModule.sayHello() //"hello"
AMD
1.define和require這兩個定義模塊鹃共、調用模塊的方法鬼佣,合稱為AMD模式。它的模塊定義的方法非常清晰霜浴,不會污染全局環(huán)境晶衷,能夠清楚地顯示依賴關系,主要用于瀏覽器端。
2.AMD模式可以用于瀏覽器環(huán)境阴孟,并且允許非同步加載模塊晌纫,也可以根據需要動態(tài)加載模塊
3.requireJS主要解決兩個問題:
a. 多個js文件可能有依賴關系,被依賴的文件需要早于依賴它的文件加載到瀏覽器
b. js加載的時候瀏覽器會停止頁面渲染永丝,加載文件越多锹漱,頁面失去響應時間越長
4.語法:
define(id?, dependencies?, factory);
require([dependencies], function(){});
//定義模塊 myModule.js
define(['dependency'],function(){
//定義方法,并return 出去
var name = 'xx'
function PrintName(){
console.log(name);
}
return {
PrintName:PrintName
}
})
//加載模塊
require(['mod'],function(my){
my.PrintName();
})
/*
define(id?, dependencies?, factory);
A. id: 定義中模塊的名字,可選慕嚷;如果沒有提供該參數哥牍,模塊的名字應該默認為模塊加載器請求的指定腳本的名字。喝检。
B. 依賴dependencies:是一個當前模塊依賴的嗅辣,已被模塊定義的模塊標識的數組字面量。 定的參數個數調用工廠方法挠说。
C. 工廠方法factory澡谭,模塊初始化要執(zhí)行的函數或對象。如果為函數损俭,它應該只被執(zhí)行一次蛙奖。如果是對象,此對象應該為模塊的輸出值杆兵。
require([dependencies], function(){});
A. 第一個參數是一個數組外永,表示所依賴的模塊
B. 第二個參數是一個回調函數,當前面指定的模塊都加載成功后拧咳,它將被調用伯顶。加載的模塊會以參數形式傳入該函數,從而在回調函數內部就可以使用這些模塊
require()函數在加載依賴的函數的時候是異步加載的,這樣瀏覽器不會失去響應祭衩,它指定的回調函數灶体,只有前面的模塊都加載成功后,才會運行掐暮,解決了依賴性的問題蝎抽。
*/
CMD
CMD(Common Module Definition)是 SeaJS推廣過程中產生的。在 CMD 規(guī)范中路克,一個模塊就是一個文件樟结。
define(id?, deps?, factory)
A. 一個文件一個模塊,所以經常就用文件名作為模塊id
B. CMD推崇依賴就近精算,所以一般不在define
的參數中寫依賴瓢宦,在factory中寫
factory
有三個參數 function(require, exports, module)
require
是 factory 函數的第一個參數,require 是一個方法,接受 模塊標識 作為唯一參數灰羽,用來獲取其他模塊提供的接口
Exports
:exports
是一個對象驮履,用來向外提供模塊接口
Module
:module
是一個對象,上面存儲了與當前模塊相關聯的一些屬性和方法
//定義模塊 myModule.js
define(function(require, exports, module){
var $ = require("jquery.js")
$("div").addClass("active")
})
//加載模塊
seajs.use(['myModule.js'], function(my){
})
3. 使用 requirejs 完成企業(yè)建站功能包括:
1. 首屏大圖為全屏輪播
2. 有回到頂部功能
3. 圖片區(qū)使用瀑布流布局(圖片高度不一)廉嚼,下部有加載更多按鈕玫镐,點擊加載更多會加載更多數據(數據在后端 mock)
4. 使用 r.js 打包應用