為什么要使用模塊化?
- JavaScript在設計時由于定位原因,沒有提供類似模塊管理的功能,開發(fā)者需要模擬出類似的功能,來隔離、組織復雜的JavaScript代碼,我們稱為模塊化。
最主要的目的:
- 解決命名沖突。
- 依賴管理。
其它價值:
- 提高代碼可讀性。
- 代碼解耦提高復用性。
CMD、AMD、CommonJS 規(guī)范分別指什么?有哪些應用
AMD:
AMD 即Asynchronous Module Definition,中文名是異步模塊定義的意思。它是一個在瀏覽器端模塊化開發(fā)的規(guī)范
由于不是JavaScript原生支持,使用AMD規(guī)范進行頁面開發(fā)需要用到對應的庫函數,也就是大名鼎鼎RequireJS,實際上AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化的產出
requireJS主要解決兩個問題
- 多個js文件可能有依賴關系,被依賴的文件需要早于依賴它的文件加載到瀏覽器
- js加載的時候瀏覽器會停止頁面渲染,加載文件越多,頁面失去響應時間越長
使用requireJS的例子:
// 定義模塊 myModule.js
define(['dependency'], function(){
var name = 'Byron';
function printName(){
console.log(name);
}
return {
printName: printName
};
});
// 加載模塊
require(['myModule'], function (my){
my.printName(); });
CMD:
CMD 即Common Module Definition通用模塊定義,CMD規(guī)范是國內發(fā)展出來的,就像AMD有個requireJS,CMD有個瀏覽器的實現SeaJS,SeaJS要解決的問題和requireJS一樣,只不過在模塊定義方式和模塊加載(可以說運行、解析)時機上有所不同
Sea.js 推崇一個模塊一個文件,遵循統(tǒng)一的寫法
demo:
// 定義模塊 myModule.js
define(function(require, exports, module) {
var $ = require('jquery.js')
$('div').addClass('active');
});
// 加載模塊
seajs.use(['myModule.js'], function(my){
});
CommonJS:
CommonJS是服務器端模塊的規(guī)范,Node.js采用了這個規(guī)范。Node.JS首先采用了js模塊化的概念。
定義模塊: 根據CommonJS規(guī)范,一個單獨的文件就是一個模塊。每一個模塊都是一個單獨的作用域,也就是說,在該模塊內部定義的變量,無法被其他模塊讀取,除非定義為global對象的屬性
模塊輸出: 模塊只有一個出口,module.exports對象,我們需要把模塊希望輸出的內容放入該對象
加載模塊: 加載模塊使用require方法,該方法讀取一個文件并執(zhí)行,返回文件內部的module.exports對象
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 nameModule = require('./myModel.js');
nameModule.printName();