js的模塊化規范


js的模塊化規范常見的有:AMD,CMD,commonJS,UMD,es6

前期在沒有模塊化的時候,js文件十分龐大,於是就按功能抽離划分為多個js文件。

但是在html頁面通過script的方式加載大量js文件會出項許多問題,例如文件之間的相互依賴問題,瀏覽器的阻塞問題,接着就有了模塊化規范。

對於前端擁有AMD,CMD,UMD,ES6的import/export

1)AMD

AMD是requireJS倡導的一種模塊化規范,推崇依賴前置;在requireJS中模塊是通過define來進行定義的,如果模塊之間相互依賴,需要先將依賴模塊導入進來,待導入完畢之后,在通過回掉函數的方式執行后面的代碼,有效的解決了模塊依賴的問題。

// CModuleJS

define(['AModuleJs','BModuleJS'], // AModuleJs,BModuleJS分別對應兩個js文件(模塊),運行至此已經下載完成,可直接使用
  function (AModuleJs, BModuleJS) {
    var a = AModuleJs();
    var b = BModuleJS;
    var c = a + b;
  })
}

 參考鏈接:http://www.cnblogs.com/evaling/p/6722760.html

 

2)CMD

CMD則是seaJS倡導的一種解決模塊之間相互依賴規范,推崇依賴就近;在seaJS中一個腳本文件就是一個模塊,所有的模塊代碼寫在define的回調函數中,傳遞三個參數require,exports,module,通過使用 module.exports(exports) 對象向外暴露。

require 函數加載模塊的時候,會自動拿到模塊內部的 module.exports 對象

// main.js

define(function (require, exports, module) {
    var moduleA = require('add.js') // //等待add.js下載、執行完
    console.log(moduleA.add(10,20))
})

// add.js

define(function (require, exports, module) {
  function add(a, b){
    return a+b;
   }
  module.exports.add = add;
})

參考鏈接:https://www.cnblogs.com/jingh/p/6024873.html

 

比較兩者的異同?
相同:都是js模塊化的異步加載方式
不同:可以看出AMD規范是在所有以來文件加載完畢之后才執行回調函數,cmd是按需加載,代碼執行到了就加載

優缺分析:
AMD:
缺點:
a)前期模塊初始化的時間相對較長(需要加載所有依賴的文件)
b)如果某一個依賴文件出錯,會導致整個代碼無法執行,資源浪費(雙刃劍)
c)有時候加載的依賴項由於代碼變更可能會沒被用到(else,case分支),但是忘記修改,會造成資源浪費
優點:
a)提前加載依賴文件可以提前發現錯誤,解決問題(雙刃劍)  

CMD:
優點:
a)延遲按需加載,代碼執行到了就加載,可節省資源(用不到的就不加載)
缺點:
a)不能提前暴露錯誤,降低開發效率

 

3)commonJS

commonJS服務器端(nodeJS)的js模塊規范,同步加載方式。因為nodeJS會被部署在服務端不存在js模塊下載阻塞的問題,但是瀏覽器則是本地客戶機存在下載js文件阻塞的問題。

 

4)UMD

更像是一種語法糖首先判斷程序環境是否是nodeJS環境如果是就使用commonJS規范,在判斷是否支持AMD,如果是就使用AMD規范,否則就全局注冊。

function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    (global.Vue = factory());
}

 

5)ES6模塊化規范 

使用import/export語法,在文件頂部導入需要的模塊,特點是:靜態化,在編譯時候(決定import 不能放在執行代碼中)確定模塊之間的以來關系,以及輸入輸出變量。

commonJS,AMD,CMD都是在執行階段導入模塊,確定依賴關系。

參考鏈接: https://segmentfault.com/a/1190000015991869

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM