Deno與Node.js:一場沒人要求但人人都需要的對決

現在,請大家想象一下:現在是晚上 11 點,我喝著一杯既冰冷又滾燙的咖啡(這是我掌握的一項獨特技能),然後我陷入了JavaScript 執行時的兔子洞中。
是的,我知道,星期五晚上很瘋狂,對吧?但是,嘿,當你是一名軟體工程師時,你對“樂趣”的想法有時包括比較 Deno 和 Node.js,而你的貓則在房間的另一邊評判你。
關於這個概念,我多年來一直在研究Node.js。
它就像你衣櫃裡那些破舊的衣服,你似乎無法扔掉,因為它們仍然處於工作(質量)狀態。它很舒服,但有時,你會想買一些市場上流行的類似流行款式——你知道的,有改進版和新款。
回到正題,進入Deno.js,每個人都在熱議的現代競爭對手。多年來,我已經習慣了 Node.js,對我來說,深入探索這個元素並親自檢查它是否值得大肆宣傳,或者它是否具有同等甚至更好的執行時間,這只是一種自然的本能。那麼,我們應該把它分解一下,以便更好地掌握它嗎?

第一印象:誰給這些東西起的名字?

早在 2000 年代後期,當技術還處於起步階段時,Node.js 自 2009 年起就出現在行業中。基於Chrome 的 V8 引擎構建的Node.js 一直在穩步幫助我們構建可擴充套件的應用程式。你可以將其理解為 Javascript 的那個版本,它非常可靠並且受到所有人的青睞。

最新訊息是,Deno 於 2018 年推出。沒錯,它也是由流行的 Node.js 的原創者Ryan Dahl開發的。情節很曲折,對吧?他回來後指出了他認為 Node 的所有問題,然後說:“等我拿咖啡。我來修復它。” Deno 以安全性、簡單性和現代功能為核心。如果你想知道它的名字……老實說,我不知道。但 Deno 是 Node 的字母重寫,所以變成了這樣。

第一輪:安全性

讓我們來談談安全性,因為如果您和我一樣,你至少會遇到一次“哦不,我不小心暴露了一個 API 金鑰”的情況。

Node.js 將安全性留給開發人員,這表示著最好了解如何使用.env檔案和許可權 — — 否則。那麼 Deno 呢?它就像我們所有人都有的那些堅持反覆檢查鎖的偏執朋友之一。無論如何,預設情況下,Deno 在受保護的沙箱中工作,除非獲得明確許可,否則不允許程式碼訪問網路、檔案系統甚至環境變數。

以下是一個程式碼例子:

const fs = require('fs');fs.writeFileSync('./hello.txt', 'Hello, World!');console.log('File written successfully!');
但是如果你嘗試在沒有許可權的情況下執行該 Deno 程式碼,
const encoder = new TextEncoder();await Deno.writeFile('hello.txt', encoder.encode('Hello, World!'));console.log('File written successfully!');
你會收到一條很大的錯誤訊息:PermissionDenied:需要 對“hello.txt”具有寫訪問許可權 。
PermissionDenied: Requires write access to "hello.txt".
是的,Deno 不會亂來。你需要像–allow-write執行指令碼時一樣明確傳遞標誌。這有點煩人嗎?當然。但它能避免你意外引發混亂嗎?當然。

第二輪:效能表現

現在,我不是速度狂人,但說到執行時,效能很重要。當你問“誰想吃披薩?”時,你希望你的應用比你的朋友反應更快。

Node.js 和 Deno 都使用JavaScript V8 引擎,因此速度都很快。但 Deno 是用 Rust 編寫的,這使其在效能和可靠性方面略勝一籌。Rust 的記憶體安全功能和併發模型使其成為強大的引擎。話雖如此,Node.js 已經存在了很長時間,其效能最佳化也經過了實戰檢驗

我運行了一些基準測試,因為,呃,我是個書呆子:)

Node.js 中的基本 HTTP 伺服器實現:

const http = require('http');const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello from Node.js!');});server.listen(3000, () => console.log('Node server running on port 3000'));

Deno 中的基本 HTTP 伺服器實現:

import { serve } from "https://deno.land/std/http/server.ts";const server = serve({ port: 3000 });console.log("Deno server running on port 3000");for await (const req of server) { req.respond({ body: "Hello from Deno!" });}
結果如何?Deno 在處理請求方面稍快一些,但我們這裡說的是毫秒級的差異。
對於大多數實際應用程式來說,這種差異不會改變遊戲規則——除非你試圖構建下一個 Twitter(或 X?我們現在是這樣稱呼它的嗎?)。

第三輪:開發者體驗

好吧,這部分讓我很受觸動。如果你一直在使用 Node.js,你就會知道 npm 是你專案的命脈。它就是你安裝軟體包、管理依賴項的方式,而且當檔案node_modules大小增長到 2 GB 時,你偶爾會對著螢幕大喊大叫。

Deno 說:“不,我們這裡不做 npm。”相反,它使用分散式的模組系統。你可以透過 URL 直接匯入模組,如下程式碼所示:

import * as _ from "https://deno.land/x/lodash/mod.ts";console.log(_.chunk([1, 2, 3, 4], 2));
一開始,我心想:“等等,什麼?”但後來我意識到它有多酷。
我不再有臃腫的 node_modules 資料夾!不再擔心軟體包版本不匹配!只需乾淨、直接地匯入就可以。
不過,我承認:我很懷念 npm 的便利性和它提供的軟體包的多樣性,真是舊習難改。

快速比較

下面快速並列展示一下 Deno 和 Node.js 在語法和風格上的差異:

讀取檔案

Node.js:

const fs = require('fs');const data = fs.readFileSync('./file.txt', 'utf8');console.log(data);
Deno.js:
const data = await Deno.readTextFile('./file.txt');console.log(data);

那麼,你應該選擇哪位呢?

讓我們花點時間進行更多分析。因此,假設您正在全力投入 Node.js 專案,請考慮您的優先事項;如果一切順利,則無需更換船。Node.js 現在已經成熟,擁有龐大的生態系統,可以完成所有工作。但是,如果您想重新開始或構建一些強調安全方面的東西,Deno 值得考慮。它就像 Node 更酷、更現代的表親,在獨立樂隊成名之前會聽他們的歌。

對我來說?我可能會繼續嘗試這兩種語言。目前,Node.js 對我來說就像家一樣,但 Deno 具有閃亮的新玩具吸引力。更重要的是,我實際上被編寫保證更具未來性的程式碼的概念所吸引。 

把這些都忘掉之後,我現在需要移動並清理我的顯示器,因為它現在大約 90% 被錯誤彈出視窗和隨機程式碼片段的螢幕截圖佔據。典型的情況,對吧?

現在,輪到你了!

你已經嘗試過 Deno 了嗎,還是你仍然堅持使用 Node.js?請在下面發表你的想法,我們總是樂於進行精彩的技術辯論哦!

作者:場長
參考:
https://github.com/errilaz/awesome-js-runtimes
相關閱讀:

相關文章