高級任務4-模塊化

為什么要使用模塊化?

  • 解決命名沖突
    在瀏覽器運行的 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

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容