JavaScript中的模塊化

JavaScript在es6之前,本身并不支持模塊化,隨著前端項(xiàng)目的日益復(fù)雜化,大型化,讓JavaScript不得不做模塊化.現(xiàn)在主要有如下模塊化解決方案:

這里不討論各個(gè)模塊化解決方案的使用,而是討論區(qū)別是應(yīng)用場(chǎng)景等

  • AMD(require.js)
  • CMD(sea.js)
  • Common.js(node.js支持)
  • UMD
  • ESM(es6官方支持)

1. AMD和CMD



AMD和CMD是JavaScript中出現(xiàn)較早的模塊化解決方案,且都服務(wù)于瀏覽器端,因此放在一起看.

AMD(Asynchronous Module Definition),采用異步加載模塊,主要服務(wù)于瀏覽器端.
CMD(Common Module Definition),主要服務(wù)于瀏覽器端.

區(qū)別
  1. 加載和執(zhí)行順序不同
    AMD官方推薦依賴前置加載并執(zhí)行,而后執(zhí)行模塊內(nèi)容; 2.0后也支持就近加載,但是依然不是官方推薦.
    CMD推薦就近加載.
  2. 對(duì)第三方庫(kù)友好度
    CMD的實(shí)現(xiàn)sea.js取義海納百川,不強(qiáng)行要求別的庫(kù)遵循CMD標(biāo)準(zhǔn),但是能很好的兼容之.本人經(jīng)過(guò)項(xiàng)目實(shí)踐,覺(jué)得優(yōu)于require.js.
    AMD不那么友好

2.CommonJS



CommonJS主要服務(wù)于服務(wù)端,目前node.js支持CommonJS.
CommonJS同步加載模塊,一個(gè)單獨(dú)的文件就是一個(gè)模塊,輸出的是一個(gè)值的拷貝.

3.UMD



UMD是是AMD和CommonJS的結(jié)合.先判斷是否是Node.js環(huán)境(node支持的exports是否存在), 在判斷是否是AMD環(huán)境

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

4.ESM



es6推出的JavaScript模塊化標(biāo)準(zhǔn).
使用類似類型化語(yǔ)言的import和export
是靜態(tài)化的模塊系統(tǒng),輸出值只是一個(gè)引用,利于做代碼靜態(tài)分析.

5.ESM和CommonJS區(qū)別


  1. 最大的區(qū)別是ESM輸出值的引用,CommonJS輸出值的拷貝; 意味著ESM模塊內(nèi)部變化,會(huì)影響外部使用. 但是CommonJS模塊內(nèi)部變化不會(huì)影響外部.這也造成了兩者巨大的沖突,在node.js中很難兼容,在node.js中只能用mjs后綴來(lái)區(qū)分使用兩者.
  2. ESM靜態(tài)編譯,CommonJS運(yùn)行時(shí)加載.
  3. ESM的import和export會(huì)變量提升,優(yōu)先到頭部執(zhí)行; 但是CommonJS不會(huì)變量提升.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • JavaScript中的模塊化將代碼組織到一個(gè)類中的重要原因是,讓代碼更加“模塊化”,可以實(shí)現(xiàn)重用。但類不是唯一的...
    河的左岸閱讀 94評(píng)論 0 1
  • 我時(shí)常做夢(mèng) 夢(mèng)醒后總記不得 那些光怪陸離的瞬間 大概合上眼 這世界就與你無(wú)關(guān)
    傻小肆閱讀 119評(píng)論 0 0
  • 今日觀點(diǎn):所有的產(chǎn)品都可以實(shí)現(xiàn)“體驗(yàn)化”。三個(gè)步驟:一是讓產(chǎn)品做到感官化,添加一些比如顏色、聲音、造型等感覺(jué)觸發(fā)元...
    帥氣還是真帥的閱讀 633評(píng)論 0 0
  • 邏輯回歸如何解決過(guò)擬合問(wèn)題?過(guò)擬合大部分原因是由于特征過(guò)多導(dǎo)致的,我們可以使用以下兩種方法來(lái)解決過(guò)擬合的問(wèn)題。 減...
    b0591d0dc6ba閱讀 4,625評(píng)論 0 6
  • 日精進(jìn),今日體驗(yàn):在維修過(guò)程中遇到的問(wèn)題,就是想到要成長(zhǎng)過(guò)程。把心態(tài)擺正,一點(diǎn)點(diǎn)想這件事的關(guān)聯(lián)。
    隆非凡閱讀 125評(píng)論 0 0

友情鏈接更多精彩內(nèi)容