好的,想像一下:現在是晚上11點,我拿著一杯咖啡,不知何故既冷又滾燙(這是我掌握的技能),而我正在陷入JavaScript運行時的兔子洞。是的,我知道,瘋狂的星期五晚上,對吧?但是嘿,當你是一名軟體工程師時,你對“有趣”的理解有時可能包括比較Deno和Node.js,而你的貓則從房間另一邊評判著你。
稍微說明一下這個概念,多年來我一直在試用Node.js。這就像你衣櫥裡那些破舊的衣服,你就是無法丟掉,因為它們仍然能派上用場。它很舒適,但有時你會想要買一些市場上流行的類似款式——你懂的,經過修訂和更新的版本。
回到主題,進入現代對手Deno,這是眾人一直在議論的。多年來習慣了Node.js,對我來說深入探索這個元素並親自檢查它是否配得上所有的炒作,或者它是否擁有同等甚至更好的運行時,這是一種自然的本能。那麼,我們應該來仔細研究一下嗎?
第一印象:這些東西是怎麼取名的?
回到2000年代末期,當科技還處於初期階段時,Node.js 自2009年以來就已經出現在業界。基於 Chrome 的 V8 引擎,Node.js 一直穩定地幫助我們構建可擴展的應用程式。你可以把它理解為那個版本的 Javascript,這是非常可靠且受到眾人青睞的選擇。
最新消息是,Deno 在2018年推出。是的,它也是由同一個人開發的,Ryan Dahl,也就是人氣 Node.js 的原創 創造者。情節反轉,對吧?他回來了,指出他認為在 Node 上搞砸的一切,然後說:「等我一下,我來修。」Deno 以安全性、簡潔性和現代特性為核心而誕生。如果你在好奇這個名字的由來……老實說,我也不知道。但 Deno 是 Node 的字母重組,所以有這一點。
第一輪:安全性
讓我們來談談安全性,因為如果你和我一樣,你至少有過一次「哦不,我不小心暴露了 API 密鑰」的時刻。(我們不再談論那個項目了。)
Node.js 將 安全性交給開發者,這意味著你最好對 .env 文件和權限了如指掌——否則後果不堪設想。至於 Deno 呢?它就像我們所有人都有的那些偏執的朋友,堅持不懈地檢查鎖。無論如何,Deno 默認在一個受保護的沙盒中運行,不允許你的代碼訪問網絡、文件系統,甚至環境變量,除非明確授予權限。
這裡有一個例子:
Node.js
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!');
但是如果你嘗試在沒有權限的情況下運行那段 Deno 代碼,你會收到一條大錯誤信息:
PermissionDenied: Requires write access to "hello.txt".
沒錯,Deno 是不會開玩笑的。你需要在運行腳本時明確傳遞像 --allow-write
這樣的標誌。這是否有點煩人?當然。但它是否能讓你避免意外釋放混亂?絕對可以。
第二回合:性能
現在,我不是一個速度狂,但在運行時,性能是很重要的。你希望你的應用在你問“誰想吃披薩?”時能比你的朋友們反應得更快。
Node.js和Deno都使用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
增长到2GB时对着屏幕大喊的方式。
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:
const data = await Deno.readTextFile('./file.txt');
console.log(data);
發送HTTP請求
Node.js(使用axios):
const axios = require('axios');
const response = await axios.get('https://api.example.com/data');
console.log(response.data);
Deno(內置Fetch):
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
那麼,你應該選擇哪個呢?
讓我們花點時間進一步分析。因此,假設您正在忙於Node.js項目,請考慮您的優先順序;如果一切運轉良好,則沒有必要改變。Node.js現在已經很成熟,擁有龐大的生態系統,可以完成所有工作。然而,如果您想要從頭開始或者構建強調安全性方面的東西,那麼Deno是值得考慮的。它就像是Node更酷、更現代的表親,在那些獨立樂隊出名前就開始聽的那類人。
對我來說?我可能會繼續兩者都玩耍。在這一點上,Node.js對我來說感覺像家,但Deno對我有著那種閃亮、新玩具的吸引力。更重要的是,我實際上對於編寫能夠更保證未來的代碼概念感到著迷。
把這些事情從我腦海中掃除後,我現在需要搬動並清理我的顯示器,因為它目前被約90%的錯誤彈出窗口截圖和隨機代碼片段所佔據。經典案例,對吧?
輪到你了!
你試過用Deno了嗎,還是堅持使用Node.js?在下方留下你的想法 — 我一直樂於參與良好的技術辯論(如果涉及到表情包,額外加分)。
Source:
https://dzone.com/articles/deno-vs-nodejs-the-showdown-nobody-asked-for