學習Deno並超越Node.js

學習Deno並超越Node.js

儘管Node.js仍然是使用最多的伺服器端JavaScript執行時,但像Deno和Bun這樣的替代執行時已經獲得了關注,因為它們試圖改進Node.js的概念。

Deno是兩個較新的執行時中較受歡迎的,它解決了Node.js中固有的一些安全問題,併為TypeScript和WebAssembly等技術提供了更全面的支援。

在這篇文章中,你將探索Deno的基礎知識,瞭解它與Node.js和Bun的比較,並跟隨一個實踐演示,使用Deno來構建一個簡單的HTTP網路伺服器。

  1. 什麼是Deno?
  2. Deno是做什麼的?
  3. Deno vs Node
  4. Deno vs Bun
  5. 開始使用Deno

什麼是Deno?

隨著開發人員對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還提供了一個指令碼託管服務,以便更容易訪問。
  • 遵守網路標準 – Deno旨在遵循與瀏覽器相同的API,這意味著為瀏覽器編寫的程式碼可以很容易地轉換到執行時。

大公司和主要的行業參與者,如SlackNetlifySupabase已經採用了Deno,但它在網路開發者中的採用卻不那麼廣泛。根據2022年Stack Overflow的調查,只有1.47%的專業開發人員在使用Deno,而46.31%的人表示在使用Node.js。

Deno是做什麼的?

像任何JavaScript執行時一樣,Deno使開發人員能夠在伺服器端執行JavaScript。因此,你可以使用Deno來完成各種各樣的程式設計任務。

Deno在開發響應基於網路的使用者請求的伺服器應用程式等任務中表現最為突出。例如,如果你正在建立一個線上書店,你可以使用Deno建立一個應用程式,從PostgreSQL資料庫中獲取資訊,建立使用者想要檢視的頁面,並將其傳送到瀏覽器上進行渲染。

你也可以用Deno來完成較低階別的程式設計任務,比如建立一個命令列工具,通過終端管理你的待辦事項。換句話說,你可以用Deno來實現與使用Python或Ruby等語言相同的目標。

Deno vs Node

Deno旨在成為Node.js的改進,它在幾個關鍵領域實現了這一承諾。Deno通過為不同的程式碼模組實現更細粒度的訪問配置來提高安全性。它還專注於網路標準的API合規性,這使得開發人員能夠在瀏覽器和伺服器端使用相同的程式碼。

對於從事伺服器端JavaScript專案的團隊來說,Deno已經成為Node的一個可行的替代品。雖然它們相似的功能讓一些開發者相信Deno可以取代Node.js,但這種可能性是不可能的,有幾個關鍵原因。

Node.js是最受歡迎的JavaScript執行時,它積累了一個龐大的預寫包生態系統和一個龐大、活躍的使用者社羣。這些寶貴的資源幫助Node.js保持了一個極具吸引力的執行時。

相比之下,Deno是新的:1.0版本是在2020年5月釋出的,所以相對來說,很少有開發者有時間去玩它。學習一個新工具會延長開發時間。此外,目前還不清楚Deno是否會給許多簡單的專案帶來重大好處。

但是,如果你正在構建一個安全至關重要的領域的應用程式,如金融,Deno的安全功能可能會使你值得轉換。

Deno vs Bun

Stripe工程師Jarred Sumner在2022年7月首次釋出了Bun,進行Beta測試。Bun是一個比Deno更具實驗性的執行時,與Deno不同的是,它被設計為與Node.js有廣泛的後向相容性。

Bun還擁有快得驚人的效能,超過了Node.js和Deno。主要特點是實現了這些能力:

  • 更好的引擎—Bun使用更快、更高效的JavaScriptCore作為其底層JavaScript引擎,而不是谷歌的V8 JavaScript和Web Assembly引擎。
  • 更多的程式碼控制—Bun是用Zig編寫的,這是一種低階語言,對程式碼執行的控制比JavaScript更強。
  • 精心調整的效率—開發Bun的團隊在開發過程中優先考慮剖析、基準測試和優化,以確保程式碼效率。

Bun是如此之新,在幫助解決故障方面的社羣支援也相對較少。儘管如此,Bun對於實驗來說還是很有趣的。那些特別需要提升效能的團隊可能會發現Bun對他們的專案很有用,但網路開發經常優先考慮效能以外的因素。

開始使用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” 物件屬性中新增下面的程式碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
"scripts": {
"start": "deno run --allow-net app.ts",
"test": "echo \"Error: no test specified\" && exit 1"
},
"scripts": { "start": "deno run --allow-net app.ts", "test": "echo \"Error: no test specified\" && exit 1" },
"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檔案並貼上以下程式碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import { serve } from "https://deno.land/std@0.177.0/http/server.ts";
serve((_req) => new Response("Hello from the server!"), { port: 8000 });
import { serve } from "https://deno.land/std@0.177.0/http/server.ts"; serve((_req) => new Response("Hello from the server!"), { port: 8000 });
import { serve } from "https://deno.land/std@0.177.0/http/server.ts";
serve((_req) => new Response("Hello from the server!"), { port: 8000 });

該程式碼使用了儲存在Deno.land官方網站上的server.ts Deno庫中的 serve 函式。這段程式碼還為傳入的請求提供了一個 serve 函式處理程式。處理程式函式對每個請求的迴應是:”Hello from the server!”

該 serve 函式還接受可選引數,例如你想要服務的埠號。這裡,程式碼示例使用這些引數在8000埠提供服務。

接下來,通過執行 npm start 來啟動伺服器。這應該會啟動一個伺服器,它監聽 localhost:8000 ,並以問候語迴應請求。

執行中的Deno伺服器

執行中的Deno伺服器

如果你想把伺服器擴充套件成一個完整的API,你可能需要新增資料庫連線。這很容易做到,因為Deno社羣已經建立了支援MariaDB/MySQLPostgreSQLMongoDB等流行資料庫的驅動程式。

小結

執行時的範圍從普通的、可靠的到非常實驗性的。為你的專案選擇合適的執行時取決於你的專案以及你希望你的執行時如何幫助你實現你的目標。

Node.js對大多數專案來說都很好用。它有一個龐大的生態系統和一個龐大的社羣,可以幫助解決各種各樣的故障情況。

Deno的好處是具有額外的安全性和更好的開發者體驗。同時,它最適合有經驗的團隊使用,這樣它的好處就超過了學習一個不熟悉的執行時的時間和人力成本。

最後,雖然Bun對於大多數專業專案來說過於實驗性,但它是一個獨特而有趣的執行時,可以為個人專案或擴充套件而拿起。

總而言之,Deno在Node.js的優點和Bun的實驗性可能性之間提供了平衡。雖然Node.js對大多數專案來說是一個可行的選擇,但Deno可能會成為網路開發未來發展的前沿。

評論留言