好的,想象一下:现在是晚上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是项目的命脉。通过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