自發布以來,Deno 就引起了 JavaScript 社區的廣泛關注。作為 Node 創建者設計的 JavaScript 運行時,你可能會期待這兩個項目有很多相似之處,事實也確實如此。然而,它們也存在重要的差異,這意味著你不能簡單地用一個替換另一個。
本文將探討 Deno 與其“老前輩” Node.js 的關係,以幫助理解它們的共同點和不同之處。 (如果你想先了解 Deno 的核心內容,可以查看我們最近的介紹文章。)
這兩個項目都是 JavaScript 運行時,允許在計算機上(在 Web 瀏覽器之外)執行 JavaScript 代碼。讓我們看看它們在語言支持方面的比較。
當前 Node 的 LTS 版本(截至撰寫本文時為 v12.18.1)支持現代 JavaScript 語法和功能。它還支持大約 75% 的 ES2020 規範。 ECMAScript 模塊也受支持,但目前僅被歸類為實驗性:你需要使用 .mjs 文件擴展名,或在項目的 package.json 文件中添加屬性 "type": "module"。
為了在 Node 上運行 TypeScript(或任何其他語言),代碼需要編譯成 V8 引擎可以執行的 JavaScript 代碼。有幾種不同的方法可以做到這一點,各有優缺點,因此啟動和運行意味著必須選擇其中一種並遵循必要的設置過程。
我沒有找到任何關於 Deno 支持的 JavaScript 規範的提及,但由於它也在後台使用 V8,所以我假設它與 Node 的支持級別相似。我自己的測試表明,Deno 支持 ES2020 功能,如 Promise.allSettled() 和 globalThis 關鍵字。 ECMAScript 模塊是默認的,除非你使用 Node 兼容性庫(稍後會詳細介紹),否則不支持 CommonJS 模塊。
TypeScript 在 Deno 中作為一等語言受支持,這意味著它可以開箱即用:無需先安裝額外的工具來轉換為 JavaScript。當然,V8 引擎本身並不原生支持 TypeScript,因此 Deno 仍然在後台轉換代碼,但這對於你作為開發人員來說是完全無縫透明的。
我也找不到 Deno v1.0.1 使用哪個版本的 TypeScript 的信息,但它支持可選鍊和空值合併(但不支持私有類字段),這可以將其定位為 TS 3.7。
Deno 和 Node 都向開發者公開自己的 API,允許我們編寫可以執行有用的操作的程序,例如讀取和寫入文件,以及發送和接收網絡請求。
Node 首次發佈時,沒有內置對 Promise 的支持。因此,大多數異步操作的 API 都是使用錯誤優先回調編寫的:
const fs = require('fs'); fs.readFile('readme.txt', (err, data) => { if (err) { // 处理错误 } // 否则处理数据 });
即使 Node 開發人員現在可以使用 Promise 和 async/await 語法,為了保持向後兼容性,API 仍然需要回調。
Deno 的 API 旨在利用現代 JavaScript 功能。所有異步方法都返回 Promise。 Deno 還支持頂級 await,這意味著你可以在主腳本中使用 await,而無需將其包裝在 async 函數中。
try { const data = await Deno.readFile('readme.txt'); // 处理数据 } catch (e) { // 处理错误 }
開發團隊還決定盡可能使用 Web 標準,這意味著他們在實際可行的情況下實現了瀏覽器 API。 Deno 提供全局 window 對象和 addEventListener 和 fetch 等 API。訪問 fetch 特別好,因為在 Node 中,你必須為此使用 polyfill 或第三方庫。
Deno 提供了一個兼容性層,旨在允許你重用現有的 Node 包。它尚未完成,但它目前支持通過 require() 加載 CommonJS 模塊,以及其他一些功能。
包管理是 Deno 與 Node 的工作方式大相徑庭的一個領域。由於 Deno 仍處於早期階段,其方法是否會證明是有利的還有待觀察。
你可能知道,Node 自帶一個名為 npm 的包管理器,用於安裝和管理第三方包。 npm 主要與在線 npm 註冊表一起使用,大多數可用的第三方包都列在其中。
當你使用 npm 將包安裝到你的項目中時,package.json 文件用於指定包名稱和可接受的版本範圍。然後,包本身(以及它所依賴的任何包)將下載到項目內的 node_modules 文件夾中。
Deno 完全取消了對包管理器的需求。相反,包是通過 URL 直接鏈接的:
import { Response } from "https://deno.land/std@0.53.0/http/server.ts";
在第一次運行你的代碼時,Deno 會獲取並編譯所有依賴項。然後它們將緩存在文件系統中,與你的項目分開,因此後續運行速度會更快。
與 npm 的 package-lock.json 文件類似,Deno 允許你指定一個鎖定文件,該文件將用於確保只使用與你最初導入的精確版本匹配的依賴項。
一門語言的繁榮與否取決於其生態系統的活力,因為生產力依賴於不必重新發明輪子!在這裡,Node 目前似乎佔據優勢。
Node 擁有一個龐大而多樣的庫和包生態系統。在其發布的 11 年裡,已在 npm 註冊表上註冊了超過一百萬個包。當然,質量可能差異很大,許多包不再積極維護,但這仍然是 Node 開發人員的一大優勢。
正如我們在上一節中看到的,Deno 正積極嘗試避免對包管理器或註冊表的需要,允許腳本直接從任何公共 URL 導入模塊。當然,如果你不知道有什麼,就很難導入包,因此 Deno 網站維護著一個兼容第三方模塊的列表。截至撰寫本文時,列表中有 707 個模塊。
Deno 嘗試改進開發者體驗的一種方法是提供一個標準庫,其中包含用於常見任務的輔助程序和實用程序。所有模塊都由核心開發人員審核,以確保高質量、可靠的代碼。有用於處理命令行參數和為終端輸出著色的模塊——這兩者對於 Node 來說都只有作為第三方包才可用。
也許 Deno 比 Node 最受吹捧的改進之一是權限系統。讓我們看看原因。
Node 運行時非常寬鬆,允許代碼完全訪問計算機的網絡和文件系統。如果未經檢查,第三方代碼有可能對你的系統造成破壞。
改進安全模型是 Ryan Dahl 在設計 Deno 時特別想要做的事情。默認情況下,所有代碼都在安全的沙箱環境中執行。這可以防止代碼訪問文件系統、網絡和環境變量等內容,除非使用命令行參數明確授予訪問權限。
const fs = require('fs'); fs.readFile('readme.txt', (err, data) => { if (err) { // 处理错误 } // 否则处理数据 });
更好的是,在允許讀取或寫入文件系統或訪問網絡時,你可以提供白名單。這意味著你可以將 Deno 程序的讀/寫訪問權限限制在項目的 data 文件夾中,例如,限制任何潛在的惡意損壞。
在結束之前,我還想談一件事。如果你瀏覽一下手冊的工具部分,你會注意到 Deno 為我們提供了一些不錯的“額外功能”!以下是內置工具,可以使開發體驗更好一些:
本文的目的不是為了宣傳 Node 或 Deno,而是為了比較和對比兩者。你現在應該了解這兩個運行時之間的相似之處,也許更重要的是,它們之間的區別。
Deno 為開發者提供了一些特別的優勢,包括強大的權限系統和一流的 TypeScript 支持。設計決策和額外的內置工具旨在提供一個高效的環境和良好的開發者體驗。
另一方面,Node 周圍擁有一個龐大而完善的生態系統,已經發展了十多年。這加上大量的文檔和教程,可能使 Node.js 在未來一段時間內成為一個安全的選擇。
快速了解 Deno。我們的 Deno 基礎系列文章將幫助你邁出進入 Deno 世界的第一步,並且我們正在不斷地添加內容。我們將提供你成為專業人士所需的教程。你可以在更新我們的 Deno 簡介後隨時參考我們的索引:
➤ Deno 基礎
什麼是 Node.js? Node.js 是一個基於 Chrome 的 V8 JavaScript 引擎構建的開源跨平台 JavaScript 運行時。它允許開發人員執行服務器端 JavaScript,從而可以構建可擴展且高性能的 Web 應用程序。
什麼是 Deno? Deno 是一個基於 V8 引擎構建的用於 JavaScript 和 TypeScript 的安全運行時。它是由最初開發 Node.js 的同一個人(Ryan Dahl)創建的。 Deno 旨在解決 Node.js 中存在的一些設計缺陷和安全問題。
Node.js 和 Deno 在架構上有什麼區別? Node.js 使用基於回調的異步模型,而 Deno 使用 async/await 等現代功能,使異步代碼更易於閱讀和維護。與 Node.js 相比,Deno 還具有更模塊化和分散的架構。
Node.js 和 Deno 之間的主要安全差異是什麼? Deno 採用安全優先的方法,這意味著它默認情況下會限制對文件系統、網絡和其他潛在危險操作的訪問。相反,Node.js 採用更寬鬆的模型,開發人員需要手動管理安全設置。
Deno 可以運行 Node.js 模塊嗎? Deno 旨在與 Web 平台兼容,並且它有自己的模塊系統。雖然它可以運行經過一些修改的 Node.js 模塊,但通常建議使用 Deno 原生模塊以獲得更好的兼容性和安全性。
Node.js 和 Deno 如何支持 TypeScript? Node.js 和 Deno 都支持 TypeScript。在 Node.js 中,開發人員通常需要設置一個單獨的 TypeScript 編譯步驟,而 Deno 原生支持 TypeScript,允許你直接運行 TypeScript 代碼而無需額外的配置。
以上是node.js vs deno:您需要知道的的詳細內容。更多資訊請關注PHP中文網其他相關文章!