又出新JS運行時了!JS運行時大盤點

2024.03.21

在前端技術日新月異的今天,新的JavaScript 執行環境不斷湧現,它們為開發者提供了更多的選擇和可能性。近期,諸如LLRT 和WinterJS 等新執行環境的發布,進一步豐富了JavaScript 執行時期的生態。本文將對現有的JavaScript 執行階段進行盤點,探討它們各自的優勢以及可能存在的不足之處。

JavaScript 執行時期是執行JavaScript 程式碼的環境或平台。它負責解析和執行JavaScript 程式碼,提供所需的功能和接口,以便在特定的作業系統或裝置上運行。

Node.js

Node.js 是一個基於Google V8 引擎的JavaScript 執行環境,也是目前使用最多的JavaScript 執行時間。它允許開發者在服務端使用JavaScript 進行編程,實現了全端JavaScript 的開發模式。Node.js 的出現,大大推動了JavaScript 在服務端的應用,並且改變了許多傳統的Web 開發模式。

圖片以下是Node.js 的一些主要特點:

  • 非阻塞I/O:Node.js 採用了非阻塞I/O 模型,使其在處理高並發請求時具有出色的效能。這意味著Node.js 可以同時處理多個請求,而不會像傳統的阻塞模型那樣等待一個請求處理完成後再處理下一個請求。
  • 事件驅動:Node.js 的事件驅動架構使其能夠有效率地處理大量並發連線。
  • 單執行緒:儘管Node.js 是單執行緒的,但由於其非阻塞I/O 和事件驅動的特性,它仍然能夠有效率地處理大量並發請求。當然,這也意味著開發者需要避免在Node.js 中執行CPU 密集型任務,以免阻塞事件循環。
  • 跨平台:Node.js 可以在多種作業系統上運行,包括Windows、Linux 和macOS 等。這使得開發者可以靈活地選擇適合自己的開發環境。
  • 豐富的生態系統:Node.js 擁有龐大的開源社群和豐富的生態系統,提供了大量的第三方模組和工具,可以輕鬆實現各種功能。
  • 用途廣泛:  Node.js 適用於建置各種類型的應用,包括Web 伺服器、API 伺服器、即時應用(如聊天應用)、命令列工具等。

Node.js 有以下幾個問題:

  • 安全性問題:Node.js 的預設安全性設定相對較為寬鬆,這可能會增加在處理敏感資料或執行未驗證程式碼時的安全性風險。雖然可以透過額外的安全措施進行增強,但這增加了開發者的負擔,並可能引入潛在的配置錯誤。
  • TypeScript 支援不足:Node.js 對於TypeScript 的支援相對較弱,需要額外的配置和工具鏈來實現。這增加了開發複雜性和維護成本,尤其是對於那些傾向於使用TypeScript 的開發者。
  • 模組系統相容性挑戰:Node.js 主要使用CommonJS 模組系統,而現代JavaScript 開發中越來越傾向於使用ES 模組。儘管Node.js 已經開始逐步支援ES 模組,但仍存在與CommonJS 模組之間的相容性問題,這可能導致專案中混合使用不同模組系統時的混亂和複雜性。
  • 效能瓶頸:Node.js 的單執行緒模型在處理高並發I/O 操作時表現出色,但它在處理CPU 密集型任務時可能受到限制。對於需要大量運算資源的任務,Node.js 的效能可能不如多執行緒或編譯型語言。

不是

Deno 最初由Node.js 的原始創建者Ryan Dahl 於2018 年創建,旨在解決他認為Node.js 中存在的一些問題,例如效能、安全性。它專注於安全性、現代JavaScript 實踐和開發人員體驗。基於V8 JavaScript 引擎建置並用Rust 編寫。

圖片Deno的核心特性包括:

  • 預設安全:Deno 預設沒有檔案、網路或環境存取權限,除非使用者明確授權。這種設計使得Deno在處理敏感資料或執行不受信任的程式碼時更為安全。
  • 支援TypeScript:Deno 開箱即用地支援TypeScript,無需額外的配置或工具鏈。這使得開發者能夠直接編寫TypeScript程式碼,並在Deno環境中執行。。
  • Node生態相容:Deno 向後相容Node.js 的內建API和npm 上超過200萬個模組,這使得開發者能夠更輕鬆地遷移或整合現有的Node.js程式碼庫。

與Node.js 相比,Deno 具有更全面的功能。它對Web API 和現代標準有很好的支持,並且還支援大多數NPM 套件。Deno 還提供了出色的開發體驗,特別是如果使用TypeScript,它是開箱即用的。Deno 還具有內建linting、程式碼格式化程式等優勢,節省一些配置和引導時間。如果你傾向於開箱即用的設置,只需啟動編輯器,創建一個main.ts文件,然後你就可以開始快樂編碼了!

除此之外,Deno 還擁有自己的工具集,例如分散式資料庫Deno KV、JavaScript 註冊表JSR、分散式部署系統Deno Deploy、專為邊緣設計的Web 框架Fresh 等!

Deno 作為一個相對較新的運行環境,仍然需要時間來建立其生態系統和社區。與已經擁有龐大社群和豐富生態的Node.js相比,Deno的社群規模和生態發展尚顯不足,這限制了其普及的速度。

好的

Bun是一個現代化的JavaScript運行時,它圍繞著WebKit的JavaScriptCore構建,而不是像Node.js或Deno那樣基於V8引擎。Bun 被設計為Node.js 的更快、更精簡、更現代的替代品,旨在成為一個全功能的運行時環境和工具包,重點關注速度、打包、測試和與Node.js 包的兼容性。最大的優勢之一是它的性能。事實證明,Bun 比Node.js 和Deno 都要快。如果Bun 能夠完成這些目標,那麼它將成為一個非常有吸引力的選擇。

圖片Bun具有以下特性:

  • 一體化工具包:Bun不僅僅是一個執行時間環境,它還整合了Web API、打包工具、測試框架等多種功能,形成了一個完整且一體化的工具包。這使得開發者能夠在一個統一的平台上進行專案的開發、建置、測試和調試,提高了工作效率。
  • 基於JavaScriptCore:Bun 基於Apple Safari 瀏覽器的引擎JavaScriptCore,具有快速的啟動時間和更好的記憶體使用效率。
  • 無外部依賴:與Node.js 不同,Bun 不依賴npm 或外部相依性。它具有內建的標準庫,提供了多種協定和模組的功能,包括環境變數、HTTP、WebSocket、檔案系統等。
  • 內建TypeScript 支援:Bun 提供了對TypeScript 的內建支援。它會內部轉譯每個JavaScript 或TypeScript 原始文件,使得可以直接運行TypeScript 文件,無需額外的配置或轉譯。
  • 強大的命令列介面工具:Bun 配備了強大的命令列介面工具(CLI),可以使用簡單的命令來運行、格式化、檢查、測試和打包程式碼。

值得一提的是,Bun 目前尚不支援在Windows 系統上使用,這讓許多Windows 用戶感到失望。官方對於Windows 版本的發布多次推遲,最新的測試進度顯示,Bun的Windows版本已經完成了94%的開發工作,這意味著它離正式發布可能已經不遠了。

冬季JS

WinterJS 是一個全新的兼容WinterCG 的運行時環境,它使用Rust 編寫,並利用SpiderMonkey 引擎和Tokio 處理HTTP 請求。WinterJs 的速度將遠遠超出Bun 和Node。它還支援Next.js、React Server Components、Svelte 以及更多功能。

圖片WinterJS 的特性如下:

  • 與Cloudflare無縫配合:WinterJS被設計為與Cloudflare的工具(如Workers和Pages)協同工作,有助於在全球加速網站的運作。
  • 極速效能:WinterJS在單一CPU核心上能夠達到每秒超過58,000個請求,幾乎比類似的工具(如Deno和Bun)快2倍。這種效能的提升主要得益於它所使用的Wasmer技術,使其幾乎能像直接在本機上運行應用一樣快速。
  • WebAssembly相容性:WinterJS支援直接與WebAssembly模組一起使用,這使得開發者能夠利用諸如Rust之類的語言來加速應用的特定部分,從而獲得更高的效能。
  • 適用於React Server Components:WinterJS可以與React Server Components搭配使用,讓伺服器可以執行React應用,從而減少了在瀏覽器中執行JavaScript的需求,進一步提升了網站的速度。

低層RT

LLRT(Low Latency Runtime,低延迟运行时)是亚马逊开源的一个轻量级的 JavaScript 运行时,其主要目标是为 Serverless 应用提供显著更快的启动时间和改进的效率。与在 AWS Lambda 上运行的其他JavaScript运行时相比,LLRT提供高达 10 倍以上的启动速度,总体成本降低高达2倍。

圖片LLRT 具有以下特點:

  • 更快的啟動時間:LLRT 的啟動速度比其他在AWS Lambda 上執行的JavaScript 運行時快10 倍以上。這種速度優勢對於需要快速回應傳入請求的Serverless 函數至關重要。
  • 節省成本:LLRT 的整體成本比其他運行時低2 倍以上。透過優化記憶體使用和減少啟動時間,它有助於最小化運行無Serverless 工作負載的成本。
  • 基於Rust 建置:LLRT 使用Rust 實現,這是一種系統程式語言,以其效能、安全性和記憶體效率而聞名。
  • QuickJS 引擎:LLRT 使用QuickJS JavaScript 引擎。QuickJS 是一個小巧且可嵌入的用C 語言編寫的引擎,非常適合像LLRT 這樣的輕量級運行時。

與像Node.js、Bun 或Deno 這樣的通用運行時不同,LLRT 專注於Serverless 環境的需求。以下是一些關鍵區別:

  • 無JIT 編譯器:與Node.js 依賴即時(JIT)編譯不同,LLRT 不包含JIT 編譯器。這種設計選擇簡化了系統複雜性,減少了運行時大小,同時節省了CPU 和記憶體資源。
  • 打包依賴項:為了實現加速,LLRT 要求開發者將他們的程式碼和相依性打包到一個單獨的.js 檔案中。這消除了模組解析期間的檔案系統查找,這是其他運行時常見的瓶頸。
  • 預編譯AWS SDK:LLRT 將AWS SDK 的部分內容預先打包並預先編譯為字節碼。這種方法進一步有助於加快應用的啟動時間。

LLRT 可用於以下情況:

  • 資料轉換:LLRT 在需要低延遲的資料處理任務中表現出色。
  • 即時處理:對於即時工作負載,例如事件驅動處理或串流數據,LLRT 的快速啟動時間是無價的。
  • AWS 服務整合:在與AWS 服務如DynamoDB 或S3 整合時,LLRT 確保快速回應。

總結

  • Node.js:Node.js是基於Google V8引擎的JavaScript執行時,以非阻塞I/O和事件驅動架構為特色,實作全端開發。它跨平台且擁有豐富的生態系統,但也面臨安全性、TypeScript支援和效能等挑戰。
  • Deno:Deno是Ryan Dahl創建的JavaScript運行時,強調安全性和現代實踐。它預設安全,內建TypeScript支持,並與Node.js相容。然而,其社區和生態系統尚處於發展階段。
  • Bun:Bun是基於WebKit JavaScriptCore建構的現代化JavaScript執行時間,旨在提供卓越的效能和一體化的工具包。它無外部依賴,內建TypeScript支持,並專注於速度、打包、測試以及與Node.js包的兼容性。
  • WinterJS:WinterJS是一個以速度為傲的JavaScript Web伺服器運行時,與Cloudflare無縫配合,支援React Server Components,並擅長處理高並發和WebAssembly模組。它的目標是提供快速且功能強大的網路應用解決方案。
  • LLRT:LLRT是亞馬遜開源的輕量級JavaScript運行時,專為Serverless應用設計。它基於Rust和QuickJS引擎構建,以快速啟動時間和成本節省為優勢,適用於Serverless環境的需求,要求預編譯和打包依賴項。