學習 Deno 並超越 Node.js
已發表: 2023-04-20儘管 Node.js 仍然是最常用的服務器端 JavaScript 運行時,並且遙遙領先,但像 Deno 和 Bun 這樣的替代運行時在嘗試改進 Node.js 概念時已經引起了人們的關注。
Deno 是兩個較新的運行時中更受歡迎的一個,它解決了 Node.js 中固有的一些安全問題,並為 TypeScript 和 WebAssembly 等技術提供了更全面的支持。
在本文中,您將探索 Deno 基礎知識,了解它與 Node.js 和 Bun 的比較,並遵循使用 Deno 構建簡單 HTTP Web 服務器的動手演示。
什麼是德諾?
隨著開發人員對 JavaScript 的熟悉,他們看到了它在本地機器上編程的潛力。 因此,他們創建了服務器端運行時——無需使用瀏覽器即可在機器上執行 JavaScript 代碼的環境。
Ryan Dahl 為此目的開發了 Node.js,後來創建了 Deno 來解決他在原始 Node.js 設計中遇到的一些問題。 一些值得注意的缺陷包括它依賴於像 npm 這樣的集中式包管理器、缺少標準庫以及默認的鬆散安全設置。
Deno 的一些主要優勢包括:
- 默認安全——用戶必須明確授予代碼訪問網絡、文件系統或環境的權限。
- 內置對 TypeScript 和 WebAssembly 的支持——在 Deno 中運行 TypeScript 和 WebAssembly 程序就像運行 JavaScript 程序一樣簡單。 運行時編譯語言就像編譯 JavaScript 一樣。
- 去中心化的包管理器——Deno 可以直接從 URL 導入代碼,而不是依賴像 npm 或 Bun 的包管理器這樣的包存儲庫。 此功能意味著您可以從託管它們的任何地方加載依賴項,包括您的 GitHub 存儲庫、服務器或 CDN。 Deno 還提供腳本託管服務,以便更輕鬆地訪問。
- 符合 Web 標準——Deno 的目標是遵循與瀏覽器相同的 API,這意味著為瀏覽器編寫的代碼可以輕鬆轉換為運行時。
Slack、Netlify 和 Supabase 等大公司和主要行業參與者已經採用了 Deno,但它在 Web 開發人員中的採用並不那麼廣泛。 根據 2022 Stack Overflow 調查,只有 1.47% 的受訪專業開發人員使用 Deno,而 46.31% 的人表示使用 Node.js。
Deno 做什麼?
與任何 JavaScript 運行時一樣,Deno 使開發人員能夠在服務器端運行 JavaScript。 因此,您可以使用 Deno 完成各種各樣的編程任務。
Deno 在諸如開發響應基於 Web 的用戶請求的服務器應用程序等任務中最為出色。 例如,如果您正在創建一個在線書店,您可以使用 Deno 構建一個應用程序,該應用程序從 PostgreSQL 數據庫獲取信息,構建用戶想要查看的頁面,並將其發送到瀏覽器進行渲染。
您還可以將 Deno 用於較低級別的編程任務,例如構建命令行工具以通過終端管理您的待辦任務。 換句話說,您可以使用 Deno 實現與使用 Python 或 Ruby 等語言實現的目標相同的目標。
Deno 與節點
Deno 的目標是改進 Node.js,它在幾個關鍵領域實現了這一承諾。 Deno 通過為不同的代碼模塊啟用更細粒度的訪問配置來提高安全性。 它還關注 Web 標準 API 合規性,這使開發人員能夠在瀏覽器和服務器端使用相同的代碼。
對於從事服務器端 JavaScript 項目的團隊來說,Deno 已成為 Node.js 的可行替代方案。 儘管它們相似的功能讓一些開發人員相信 Deno 可以取代 Node.js,但由於幾個關鍵原因,這種可能性不大。
Node.js 是最流行的 JavaScript 運行時,它積累了一個龐大的預寫包生態系統和一個龐大、活躍的用戶社區。 這些寶貴的資源幫助 Node.js 保持極具吸引力的運行時。
相比之下,Deno 是新的:1.0 版本於 2020 年 5 月發布,因此相對較少的開發人員有時間使用它。 學習新工具會延長開發時間。 此外,尚不清楚 Deno 是否會給許多簡單的項目帶來顯著的好處。
但是,如果您在安全性至關重要的領域構建應用程序,例如金融,Deno 的安全功能可能值得進行轉換。
德諾 vs 包子
前 Stripe 工程師 Jarred Sumner 於 2022 年 7 月首次發布 Bun 進行 Beta 測試。 Bun 是一個比 Deno 更具實驗性的運行時,並且與 Deno 不同,Bun 旨在與 Node.js 具有廣泛的向後兼容性。
Bun 還擁有超快的性能,超越了 Node.js 和 Deno。 關鍵特性支持以下功能:
- 更好的引擎——Bun 使用更快、更高效的 JavaScriptCore 作為其底層 JavaScript 引擎,而不是 Google 的 V8 JavaScript 和 Web Assembly 引擎。
- 更多的代碼控制——Bun 是用 Zig 編寫的,Zig 是一種低級語言,比 JavaScript 對代碼執行提供更大的控制。
- 微調效率——Bun 團隊在開發過程中優先考慮性能分析、基準測試和優化,以確保代碼效率。
Bun 太新了,很少有社區支持來幫助解決問題。 儘管如此,Bun 對於實驗來說還是很有趣的。 特別需要性能提升的團隊可能會發現 Bun 對他們的項目很有用,但 Web 開發通常會優先考慮性能以外的因素。
開始使用 Deno
現在您已經了解了一些關於 Deno 的知識以及它與其他流行的 JavaScript 運行時的比較,是時候看看它是如何工作的了。 在本節中,您將學習如何在 Deno 中創建一個簡單的服務器,該服務器以“Hello from the server!”響應 HTTP 請求。
安裝 Deno
您可以使用官方文檔中的這些安裝說明將 Deno 作為二進制可執行文件安裝在機器上。 例如,在 macOS 上,您可以使用命令brew install deno
安裝 Deno。
開始使用 Deno 的另一種方法是將其安裝為 npm 包,如下所示:
為您的項目創建一個文件夾(也許是 deno_example )並在其中運行命令npm init
。 (您可以接受init
在創建基本package.json文件時建議的所有默認選項。)
初始化應用程序後,運行npm install deno-bin
以安裝 Deno 二進制包。 現在您可以更新package.json文件以使用npm start
啟動應用程序。 將下面的粗體行添加到默認 package.json 文件中的“scripts”對象屬性:
"scripts": { "start": "deno run --allow-net app.ts", "test": "echo \"Error: no test specified\" && exit 1" },
此腳本添加使 Deno 能夠以網絡權限 ( --allow-net
) 運行 app.ts 模塊。 請記住,在使用 Deno 時,您需要明確允許訪問網絡或文件系統。
現在,您已準備好創建app.ts模塊,負責偵聽端口並為用戶請求提供服務。
創建 App.ts 模塊
在 Deno 中創建基本服務器非常簡單。 首先,創建一個app.ts文件並粘貼以下代碼:
import { serve } from "https://deno.land/[email protected]/http/server.ts"; serve((_req) => new Response("Hello from the server!"), { port: 8000 });
該代碼使用存儲在 Deno.land 官方網站上的server.ts Deno library
中的serve
函數。 此代碼還為傳入請求提供serve
函數處理程序。 處理函數以“Hello from the server!”響應每個請求。
serve
函數還採用可選參數,例如您要提供服務的端口號。 此處,代碼示例使用這些參數在端口 8000 上提供服務。
接下來,通過運行npm start
啟動服務器。 這應該啟動一個服務器來監聽localhost:8000
並用問候語響應請求。
如果您想將服務器擴展為成熟的 API,您可能需要添加數據庫連接。 這很容易做到,因為 Deno 社區已經創建了支持 MariaDB/MySQL、PostgreSQL、MongoDB 等流行數據庫的驅動程序。
概括
運行時範圍從普通和可靠到非常實驗性。 為您的項目選擇合適的一個取決於您的項目以及您希望運行時如何幫助您實現目標。
Node.js 適用於大多數項目。 它擁有龐大的生態系統和龐大的社區,可以幫助解決各種故障排除場景。
Deno 具有額外的安全性和更好的開發人員體驗。 同時,它最適合有經驗的團隊,因此它的好處超過了學習不熟悉的運行時所花費的時間和人力成本。
最後,雖然 Bun 對於大多數專業項目來說過於實驗性,但它是一個獨特而有趣的運行時,可以用於個人項目或擴展。
總而言之,Deno 在 Node.js 的優勢和 Bun 的實驗可能性之間取得了平衡。 雖然 Node.js 是大多數項目的實用選擇,但 Deno 可能處於未來 Web 開發發展方式的最前沿。
同時,通過註冊 Kinsta 的 Application Hosting Hobby Tier 來練習您的 Deno 技能——現在編碼,以後擴展。