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