為什么要使用模塊化?
解決命名沖突
在瀏覽器運行的 js 實際上會合并代碼掛載到全局對象(window)下,雖然有匿名函數(shù),但對于變量和定義好的函數(shù)名,是很有可能沖突的。同時,如果多人合作,命名沖突就更可能發(fā)生了,此時就需要解決這個問題了。依賴管理
代碼不可能全寫再一個文件里,我們都會分開幾個甚至幾十個文件,這樣拆分更容易維護,便于重用封裝。但這些文件的依賴關系可能很混雜,順序很重要,比如我們再引用 jQuery 的時候,在所有用到 jQ 的代碼前引入,這是常識,但依賴有很多的時候,比如 100 個,這樣人為去維護順序就顯的力不從心了。
CMD、AMD、CommonJS 規(guī)范分別指什么?有哪些應用
- CommonJS 規(guī)范
Node的出現(xiàn)才是js真正模塊化的開始。每個文件就是一個模塊,有自己的作用域。CommonJS規(guī)范規(guī)定每個模塊內(nèi)部,module
變量代表當前模塊。這個變量是一個對象,它的exports
屬性是對外的接口。加載某個模塊,其實是加載該模塊的module.exports,require方法用于加載模塊。
// a.js
var aFnc = function () {
console.log('this is a!')
}
var a = 1
module.exports.a = a
module.exports.aFnc = aFnc
//b.js
var a = require('./a.js')
console.log(a.a)
a.aFnc()
對于服務端語言,模塊化就是讀取下文件內(nèi)容的事情,是同步進行的,因為讀取硬盤速度很快,可以等待。但在瀏覽器里,同步等待js 的加載可能會出現(xiàn)因為網(wǎng)速問題,導致網(wǎng)頁加載時間過長,因此需要新的標準。
- AMD是“Asynchronous Module Definition”的縮寫,意思就是“異步模塊定義”。是RequireJS在推廣過程中的規(guī)范化產(chǎn)出。該規(guī)范定義了一個函數(shù)
define
,它是全局變量。
單獨模塊的定義:
define({
method: function(){}
})
//另一種寫法
define(function(){
return {
method: function(){}
}
})
非獨立模塊:
define(['module1', 'module2'], function(m1, m2){
...
})
- CMD 規(guī)范
CMD 是 SeaJS 在推廣過程中的規(guī)范化產(chǎn)出。
與 AMD 的區(qū)別:
對于依賴的模塊,AMD 是提前執(zhí)行,CMD 是延遲執(zhí)行。
CMD 推崇依賴就近,AMD 推崇依賴前置
模塊定義:
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
// 此處略去 100 行
var b = require('./b')
// 依賴可以就近書寫
b.doSomething()
// ...
})
- 應用
CommonJS 適用于服務端,基于 Node,可用 Glup、 Webpack 之類的打包壓縮再用于瀏覽器環(huán)境。
AMD 用于瀏覽器環(huán)境,如 RequireJS
CMD 用于瀏覽器環(huán)境, SeaJS 推廣中產(chǎn)出
使用 requirejs 完善入門任務15
源碼地址:https://github.com/jirengu-inc/jrg-renwu11/tree/master/homework/%E5%BC%A0%E6%99%93%E8%BE%B0/require