17611538698
webmaster@21cto.com

Deno 与 Node.js:一场没人要求但人人都需要的对决

前端 0 25 5小时前

现在,请大家想象一下:现在是晚上 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

评论