Node.js 開始反擊了,看看 Node.js 近來都引入了哪些實(shí)用功能!
2018 年,Node.js 之父 Ryan Dahl 推出了全新的 JavaScript 運(yùn)行時 Deno,旨在解決Node.js中一些長期存在的問題,同時提供增強(qiáng)的安全性和現(xiàn)代語言特性。到了2022年,另一個名為 Bun 的 JavaScript 運(yùn)行時橫空出世,在開發(fā)社區(qū)內(nèi)引發(fā)了廣泛討論。
這兩個新興的運(yùn)行時之所以受到如此多的關(guān)注,很大程度上反映了開發(fā)者們對Node.js現(xiàn)狀的不滿以及對新解決方案的渴望,然而,盡管它們帶來了許多創(chuàng)新和改進(jìn),但由于歷史原因以及 Node.js 龐大的生態(tài)系統(tǒng)構(gòu)建等因素,許多開發(fā)者仍然持觀望態(tài)度。
面對這些新興競爭者的挑戰(zhàn),Node.js 似乎感受到了前所未有的危機(jī)感,開始反擊,推出了一系列實(shí)用功能,解決了許多痛點(diǎn)問題。下面就來看看 Node.js 近來都引入了哪些實(shí)用功能!
Node.js v20.0
- 權(quán)限模型(實(shí)驗(yàn)性功能):Node.js 20 引入了權(quán)限模型,它允許開發(fā)者在程序執(zhí)行期間限制對特定資源的訪問,例如文件系統(tǒng)操作、子進(jìn)程生成和工作線程創(chuàng)建。
- 原生測試運(yùn)行器:Node.js 20 中,test_runner模塊被標(biāo)記為穩(wěn)定,這意味著它已經(jīng)準(zhǔn)備好用于生產(chǎn)環(huán)境。穩(wěn)定的測試運(yùn)行器包括編寫和運(yùn)行測試所需的基本組件,如describe、it/test和鉤子來構(gòu)建測試文件、模擬、監(jiān)視模式以及node --test用于并行運(yùn)行多個測試文件。
Node.js v20.6
- 原生支持 .env 文件:引入了對.env文件的原生支持,允許開發(fā)者直接在Node.js中使用.env文件配置環(huán)境變量,無需依賴第三方模塊(如dotenv)。
Node.js v21.0
- 內(nèi)置 WebSocket 客戶端(實(shí)驗(yàn)性功能): Node.js v21.0提供了一個實(shí)驗(yàn)性的、與瀏覽器兼容的WebSocket實(shí)現(xiàn)。開發(fā)者可以通過標(biāo)志(--experimental-websocket)啟用該功能,從而更方便地在Node.js環(huán)境中使用WebSocket。
- 自由切換默認(rèn)模塊系統(tǒng)(實(shí)驗(yàn)性功能): 引入了一個新的實(shí)驗(yàn)性標(biāo)志(--experimental-default-type),用于切換Node.js使用的默認(rèn)模塊系統(tǒng)。這一功能允許開發(fā)者在ES模塊和CommonJS之間靈活切換,以滿足不同的項(xiàng)目需求。
Node.js v21.7
- 內(nèi)置彩色文本輸出: 支持通過console.log間接輸出彩色文本,無需再引入第三方庫(如 chalk),可以通過util.styleText函數(shù)來設(shè)置文本的顏色和樣式。
- 環(huán)境變量功能增強(qiáng):新增了兩個API來加載和解析環(huán)境變量
- process.loadEnvFile(path)用于加載指定路徑的.env文件。如果未指定路徑,則會自動加載當(dāng)前目錄下的.env文件。
- util.parseEnv(content)用于解析包含環(huán)境變量賦值的字符。
Node.js v22.0
- 監(jiān)聽模式: 從Node.js 22版本開始,觀察模式(node --watch)已經(jīng)穩(wěn)定。在監(jiān)聽模式下,當(dāng)被監(jiān)視的文件發(fā)生變化時,Node.js進(jìn)程將自動重新啟動,不再需要借助第三方模塊(如 nodemon)。
- 內(nèi)置 WebSocket 客戶端(穩(wěn)定版): 內(nèi)置 WebSocket 客戶端成為于穩(wěn)定功能,不再需要--experimental-websocket標(biāo)志來啟用。WebSocket的實(shí)現(xiàn)遵循了瀏覽器中WebSocket API的標(biāo)準(zhǔn),這意味著在Node.js中使用WebSocket的方式將與在JavaScript中使用WebSocket的方式非常相似。
- 支持通過require()引入ESM :打破了CommonJS與ESM之間的界限,允許開發(fā)者使用require()函數(shù)來導(dǎo)入ESM 模塊。這為大型項(xiàng)目和遺留系統(tǒng)提供了一個平滑過渡的方案,因?yàn)樗鼈兛梢灾饌€模塊遷移到ESM,而不是一次性對整個項(xiàng)目進(jìn)行修改。
- 支持運(yùn)行 package.json 中的腳本: 添加了一個新命令行標(biāo)志
--run
,允許直接從命令行執(zhí)行package.json中定義的腳本。這提供了一個標(biāo)準(zhǔn)化的方式執(zhí)行腳本,有助于統(tǒng)一不同包管理器在處理腳本時的行為,并且直接使用node執(zhí)行腳本要比通過npm執(zhí)行腳本更快。
Node.js v22.5
- 支持 SQLite 數(shù)據(jù)庫(實(shí)驗(yàn)性功能):在這個版本中,Node.js自帶了SQLite模塊,開發(fā)者可以直接在程序中使用SQLite數(shù)據(jù)庫,而無需引入第三方庫。
Node.js v22.6
- 原生支持TypeScript(實(shí)驗(yàn)性功能):通過--experimental-strip-types標(biāo)志,實(shí)現(xiàn)了對TypeScript的實(shí)驗(yàn)性支持。這意味著開發(fā)者們現(xiàn)在可以在Node.js環(huán)境中直接執(zhí)行.ts文件,而無需進(jìn)行額外的編譯步驟。然而,需要注意的是,當(dāng)前的實(shí)驗(yàn)性支持有一些限制,例如僅支持內(nèi)聯(lián)類型注釋,不支持像 enums、namespaces 這樣的高級TypeScript功能。此外,Node.js不會讀取tsconfig.json文件,因此在運(yùn)行時不會進(jìn)行類型校驗(yàn)。
- 網(wǎng)絡(luò)檢測支持(實(shí)驗(yàn)性功能): 為 Node.js 引入了網(wǎng)絡(luò)檢查的初步支持。這是一個實(shí)驗(yàn)性功能,需要使用--experimental-network-inspection標(biāo)志來啟用它。啟用此功能后,可以檢查 JavaScript 應(yīng)用中發(fā)生的網(wǎng)絡(luò)活動。不過,目前網(wǎng)絡(luò)檢查僅限于http和https模塊。
Node.js v23.0
- 原生支持 ES 模塊:Node.js v23.0最大的亮點(diǎn)之一是原生支持通過require()加載 ES 模塊(ECMAScript Modules)。這意味著開發(fā)者可以直接使用require()來加載ES模塊,而無需額外的工具或配置。
- 停止支持 32 位Windows系統(tǒng):不再支持32位Windows,專注于現(xiàn)代環(huán)境。
小結(jié)
近來 Node.js 已經(jīng)在很努力的更新了,相信未來越來越多更現(xiàn)代化的功能被 Node.js 支持。與此同時,Bun 和 Deno 也在迅猛崛起。值得注意的是,Bun 的目標(biāo)不僅限于作為一個 JavaScript 運(yùn)行時,它更致力于構(gòu)建一個全面的 JavaScript 工具鏈。這三者之間的競爭,無疑加速了各自的創(chuàng)新步伐,未嘗不是一件好事。