javascript
JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)
前言
前端開發中,起初只要在script標簽中嵌入幾十上百行代碼就能實現一些基本的交互效果,后來js得到重視,應用也廣泛起來了,
jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得前端開發得到重視,也使得前端項目越來越復雜,
然而,JavaScript卻沒有為組織代碼提供任何明顯幫助,甚至沒有類的概念,更不用說模塊(module)了,那么什么是模塊呢?
一個模塊就是實現特定功能的文件,有了模塊,我們就可以更方便地使用別人的代碼,想要什么功能,就加載什么模塊。
?
一、AMD 規范
AMD 是 RequireJS 在推廣過程中對模塊定義的規范化產出。
模塊將被異步加載,模塊加載不影響后面語句的運行。
所有依賴某些模塊的語句均放置在回調函數中。
?
用法:
- 定義模塊:define(id?, dependencies?, factory)
- 加載模塊:require([module], factory)
?
?
二、CMD 規范
CMD 是 SeaJS 在推廣過程中對模塊定義的規范化產出。
在 CMD 規范中,一個模塊就是一個文件。
?
用法:
- 定義模塊:define(factory)
?
?
三、CommonJs?規范
CommonJs 是服務器端模塊的規范。
Node.js 采用了這個規范。Node.JS首先采用了js模塊化的概念。
根據 CommonJs?規范,一個單獨的文件就是一個模塊。每一個模塊都是一個單獨的作用域,也就是說,在該模塊內部定義的變量,無法被其他模塊讀取,除非定義為 global 對象的屬性。
?
用法:
- 輸出模塊:module.exports
- 加載模塊:require
?
?
四、ES Module
ES6 在語言標準的層面上,實現了模塊功能,成為瀏覽器和服務器通用的模塊解決方案,完全可以取代 CommonJS 和 AMD 規范。
?
基本特點:
- 每一個模塊只加載一次, 每一個JS只執行一次, 如果下次再去加載同目錄下同文件,直接從內存中讀取;
- 每一個模塊內聲明的變量都是局部變量, 不會污染全局作用域;
- 模塊內部的變量或者函數可以通過export導出;
- 一個模塊可以導入別的模塊
?
用法:
- 輸出模塊:export
- 加載模塊:import?
?
?
動態加載模塊:
// 普通寫法 import('./module').then(({ a }) => {}) // async、await const { a } = await import('./module');?
?
五、各模塊之間的區別
1、CommonJS 與 AMD/CMD 的差異
- CommonJS:是同步加載(代碼在本地,加載時間基本等于硬盤讀取時間)。
- AMD / CMD:是異步加載
?
2、AMD 與 CMD 的差異
- AMD是提前執行,CMD是延遲執行
- AMD推薦依賴前置,CMD推薦依賴就近
?
3、CommonJS 與 ES Module 的差異
- CommonJS 模塊是對象,是運行時加載,運行時才把模塊掛載在 exports 之上(加載整個模塊的所有),加載模塊其實就是查找對象屬性
- ES Module 不是對象,是使用 export 顯示指定輸出,再通過 import 輸入,此法為編譯時加載
- CommonJS 模塊輸出的是一個值的拷貝,ES6 模塊輸出的是值的引用。
- CommonJS 模塊是運行時加載,ES6 模塊是編譯時輸出接口。
?
3、各模塊用法上的區別
詳見各模塊介紹...
?
?
?
?
?
隨筆整理自
https://www.jianshu.com/p/da2ac9ad2960
感謝博主分享!
轉載于:https://www.cnblogs.com/gaosirs/p/10772675.html
總結
以上是生活随笔為你收集整理的JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue使用better-scroll左右
- 下一篇: LNOI2014 LCA