為什么要使用模塊化?
- 解決命名沖突
- 依賴管理
- 提高代碼可讀性
- 代碼解耦,提高復用性
CMD、AMD、CommonJS 規范分別指什么?有哪些應用
CommonJS
CommonJS是由NodeJS發揚光大
定義模塊:根據CommonJS規范,一個單獨的文件就是一個模塊。每一個模塊都是一個單獨的作用域,也就是說,在該模塊內部定義的變量,無法被其他模塊讀取,除非定義為global對象的屬性
模塊輸出: 模塊只有一個出口,module.exports對象,我們需要把模塊希望輸出的內容放入該對象
加載模塊: 加載模塊使用require方法,該方法讀取一個文件并執行,返回文件內部的module.exports對象
//定義模塊,文件名為a.js
var people={
name:'saybye',
sayname:function(){
console.log(this.name)
}
}
module.exports=people
//加載模塊
var p=require('./a')
p.sayname()
AMD
瀏覽器端,加載JavaScript最佳、最容易的方式是在document中插入script 標簽。但腳本標簽天生異步,傳統CommonJS模塊在瀏覽器環境中無法正常加載,所以之后產生了AMD規范
AMD中文名是異步模塊定義的意思。它是一個在瀏覽器端模塊化開發的規范.由于不是JavaScript原生支持,使用AMD規范進行頁面開發需要用到對應的庫函數,也就是大名鼎鼎RequireJS,實際上AMD 是 RequireJS 在推廣過程中對模塊定義的規范化的產出
requireJS主要解決兩個問題
- 多個js文件可能有依賴關系,被依賴的文件需要早于依賴它的文件加載到瀏覽器
- js加載的時候瀏覽器會停止頁面渲染,加載文件越多,頁面失去響應時間越長
//定義模塊,文件名為a.js
define(['dependency'],function(){
var name=saybye
function printName(){
console.log(name)
}
return{
printName:printName
}
})
//加載模塊
require(['./a.js'], function (my){
my.printName(); });
其中例子中
dependency:是一個當前模塊依賴的模塊名稱數組
CMD
CMD 即Common Module Definition通用模塊定義,CMD規范是國內發展出來的,就像AMD有個requireJS,CMD有個瀏覽器的實現SeaJS,SeaJS要解決的問題和requireJS一樣,只不過在模塊定義方式和模塊加載(可以說運行、解析)時機上有所不同
語法:Sea.js 推崇一個模塊一個文件,遵循統一的寫法
CMD 推崇依賴就近,所以一般不在define的參數中寫依賴,在factory中寫
//定義模塊 a.js
define(function(require, exports, module){
var $ = require('jquery.js')
$('div').addClass('active');
})
//加載模塊
seajs.use(['./a.js'], function(my){
});
```
范例中:
require是一個方法,接受 模塊標識 作為唯一參數,用來獲取其他模塊提供的接口
exports 是一個對象,用來向外提供模塊接口
module 是一個對象,上面存儲了與當前模塊相關聯的一些屬性和方法