JavaScript分水嶺CommonJS對(duì)比ES模塊分析
引言
所周知,JavaScript社區(qū)喜歡進(jìn)行熱烈的辯論。四年來(lái),我們?nèi)绾谓M織代碼的問(wèn)題上一直存在一個(gè)分歧——這是一個(gè)基本但令人意外地有爭(zhēng)議的問(wèn)題,繼續(xù)將開發(fā)者分開。
這種分歧圍繞著 CommonJS 和 ES 模塊,這是兩個(gè)用于劃分 JavaScript代碼的主要系統(tǒng)。
理解這個(gè)分歧
當(dāng)JavaScript最初被發(fā)明時(shí),它的主要角色是作為Web瀏覽器的腳本語(yǔ)言。但是,隨著Node.js的出現(xiàn),似乎展現(xiàn)出了一系列的可能性。
現(xiàn)在,它不僅僅是一個(gè)瀏覽器的語(yǔ)言。它可以為服務(wù)器和其他應(yīng)用程序提供動(dòng)力。
在那種情境下,瀏覽器中的所有東西都在全局作用域中,你不必過(guò)多地考慮模塊。但是構(gòu)建一個(gè)復(fù)雜的服務(wù)器應(yīng)用程序并不那么簡(jiǎn)單。你不能把所有的代碼都打包在一個(gè)文件中——那將是一個(gè)噩夢(mèng)。
出現(xiàn)的解決方案?一個(gè)叫做CommonJS的模塊系統(tǒng)。
const moduleA = require('./moduleA');
CommonJS 使用一個(gè)叫做 require
的函數(shù),允許你從其他文件中提取 JavaScript并訪問(wèn)從它們導(dǎo)出的函數(shù)。
然而,JavaScript 很快用ES6——適應(yīng)了這些想法,以滿足Web應(yīng)用程序的需求。他們引入了import
和export
。
import moduleA from './moduleA';
現(xiàn)在,你可能會(huì)納悶,為什么JavaScript沒有堅(jiān)持已經(jīng)在使用的require
調(diào)用呢?
require
的問(wèn)題在于它是同步的,并假設(shè)所有文件都已經(jīng)準(zhǔn)備好。但是,在瀏覽器上下文中,你可能需要等待外部資源時(shí),require
的同步性質(zhì)會(huì)讓系統(tǒng)崩潰。
因此,分裂開始了。
兼容性難題
大多數(shù)開發(fā)者轉(zhuǎn)向ES模塊,因?yàn)樗鼈儾粌H是新穎的,而且很有趣。但一個(gè)相當(dāng)大的群體仍然堅(jiān)持使用CommonJS。這種分裂導(dǎo)致了兼容性問(wèn)題。
如果你在ES模塊內(nèi)部運(yùn)行,你可以沒有問(wèn)題地導(dǎo)入CommonJS。但是,使用CommonJS
導(dǎo)入ES模塊是不行的——除非你采用一個(gè)模擬導(dǎo)入的異步函數(shù)解決方法。
const moduleA = await import('./moduleA');
打包器的作用
像Babel或TypeScript這樣的打包器或轉(zhuǎn)譯器為這個(gè)復(fù)雜問(wèn)題增加了另一層,你寫的內(nèi)容取決于你發(fā)出的內(nèi)容。你可以用ES模塊寫,但發(fā)出 CommonJS
。
// Babel或TypeScript編譯器將ES模塊轉(zhuǎn)換為CommonJS const moduleA = require('./moduleA');
如果你在構(gòu)建的代碼中看到 require
調(diào)用,你就是在發(fā)出 CommonJS,而import
和export
的存在表示你是ES模塊的未來(lái)的一部分。
未來(lái)屬于ES模塊
在吸引了開發(fā)者注意的新工具中,bun 是亮點(diǎn)。bun 的主要亮點(diǎn)在于,它已經(jīng)解決了CommonJS 和 ES 模塊之間的互操作性問(wèn)題。但是,這個(gè)修復(fù)并不完全符合規(guī)范——他們只是為了讓它工作而修補(bǔ)了CommonJS和ES模塊之間的問(wèn)題。
由于支持這些不同的模塊系統(tǒng),JavaScript工具鏈可能非常復(fù)雜。
采用ES模塊,你正在簡(jiǎn)化Web開發(fā)。所有的Node.js長(zhǎng)期支持版本現(xiàn)在都使用ES模塊,這標(biāo)志著一個(gè)明確的海變。
盡可能使用ES模塊?,F(xiàn)在是時(shí)候結(jié)束這種分裂,擁抱未來(lái)了?,F(xiàn)代JavaScript,統(tǒng)一的JavaScript。
如果你一直在使用或考慮使用 CommonJS,可能是時(shí)候仔細(xì)看看你的代碼了。未來(lái)是一個(gè)有ES模塊的地方,我們每個(gè)人都有責(zé)任使 JavaScript 的景觀變得更加簡(jiǎn)單和有趣。
以上就是JavaScript分水嶺CommonJS 對(duì)比ES模塊分析的詳細(xì)內(nèi)容,更多關(guān)于JavaScript CommonJS 對(duì)比ES的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS前端知識(shí)點(diǎn)offset,scroll,client,冒泡,事件對(duì)象的應(yīng)用整理總結(jié)
這篇文章主要介紹了JS前端知識(shí)點(diǎn)offset,scroll,client,冒泡,事件對(duì)象的應(yīng)用,結(jié)合實(shí)例形式總結(jié)分析了offset,scroll,client,冒泡,事件對(duì)象相關(guān)功能、原理及操作注意事項(xiàng),需要的朋友可以參考下2019-06-06JavaScript判斷輸入是否為數(shù)字類型的方法總結(jié)
這篇文章主要介紹了JavaScript判斷輸入是否為數(shù)字類型的方法總結(jié)的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09JavaScript?error瀏覽器端錯(cuò)誤捕獲處理方法筆記解決示例
這篇文章主要為大家介紹了JavaScript?error瀏覽器端錯(cuò)誤捕獲處理方法筆記解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06JS獲取當(dāng)前網(wǎng)址、主機(jī)地址項(xiàng)目根路徑
本文為大家提供JS如何獲取當(dāng)前網(wǎng)址、主機(jī)地址之后的目錄及項(xiàng)目根路徑的方法,喜歡的朋友可以收藏下2013-11-11微信小程序授權(quán)登錄實(shí)現(xiàn)方案wx.getUserProfile(2022年最新版)
微信在最近開始要求使用wx.getUserProfile()來(lái)獲取用戶的昵稱,頭像等信息,所以下面這篇文章主要給大家介紹了關(guān)于2022年最新版微信小程序授權(quán)登錄實(shí)現(xiàn)方案wx.getUserProfile的相關(guān)資料,需要的朋友可以參考下2022-11-11微信小程序 wx:for遍歷循環(huán)使用實(shí)例解析
這篇文章主要介紹了微信小程序 wx:for遍歷循環(huán)使用實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09一個(gè)剛完成的layout(拖動(dòng)流暢,不受iframe影響)
一個(gè)剛完成的layout(拖動(dòng)流暢,不受iframe影響)...2007-08-08