Deno:Node.js 的下一步

2025-05-26

Deno:Node.js 的下一步

DenoNode的创建者 Ryan Dahl在 JSConf 2018 上首次亮相,目前已发展成为 Node.js 的主要替代方案。Deno 与 Node.js 类似——使用 JavaScript 编写脚本并运行——但 Deno 的功能更加强大。它拥有一流的 TypeScript 支持,简化了模块,更加安全,并且弥合了浏览器和 Node 之间的差距,等等。

节点

Node 于 2009 年发布,并迅速占领了市场。尽管最初人们对 Node 持怀疑态度,但社区的支持无与伦比。

如今,Node 是用于后端开发的最流行的工具之一。

进入 Deno

有趣的事实:Deno 只是节点的反转。no + de = node,de + no = deno。

Node 虽然很棒,但也存在不少设计缺陷。你可以看看Ryan Dahl 的演讲来了解更多,以下是一些:

  • Node 并没有坚持使用 Promise。Node早在 2009 年就添加了 Promise,但在将近一年后的 2010 年就将其移除。
  • Node 不够安全。任何 Node 程序都可以访问系统调用、http 请求和文件系统调用。你的 Linter 不应该拥有对你的计算机和网络的完全访问权限。
  • 更多的...

本质上,Node 专注于 IO,模块是事后才考虑的。为了解决这个问题,Ryan 引入了 Deno。

Deno 的设计是安全的

假设你想运行一个 lint 脚本。如果你使用的是 Node,那么只需执行以下操作:

~$ node linter.js
Enter fullscreen mode Exit fullscreen mode

但在 Deno 中,你可以这样做:

~$ deno run --allow-read linter.js
Enter fullscreen mode Exit fullscreen mode

这里有几点需要注意。首先是run子命令。Deno 还有许多其他工具,我们稍后会讲到。

接下来要注意的是标志--allow-read。它和许多其他标志一起构成了 deno 的安全系统。默认情况下,当使用 运行脚本时deno run,它只能使用控制台。

现在,更高的安全性固然很好,但没人愿意--allow每次运行程序时都输入一堆参数。幸运的是,deno 提供了一个install可以“安装”程序的命令。安装方式是在特定平台的目录中创建一个精简的包装器(~/.deno/bin适用于 MacOS 和 Linux,Windows 系统暂不确定)。

~$ deno install --allow-read linter.js
✅ Successfully installed linter
/Users/APPLE/.deno/bin/linter
~$ linter
linter running!
Enter fullscreen mode Exit fullscreen mode

该文件.deno/bin/linter非常简单:

#!/bin/sh
# generated by deno install
exec deno run --allow-read 'file:///Users/APPLE/Sites/Projects/deno-test/linter.js' "$@"
Enter fullscreen mode Exit fullscreen mode

这里没有包管理器

Deno 使用 ES 模块导入语法,这意味着导入必须是文件的完整路径或相对路径。与 Node.js 不同,它没有这样的限制deno_modules(谢天谢地!),而且 Deno 不会在任何特殊的地方查找模块。

// These work
+ import {lint} from './linter.js';
+ import {lint} from 'absolute/path/to/linter.js';
+ import {WebSocket} from "https://deno.land/std@0.103.0/ws/mod.ts";

// But these wont:
- import {lint} from './linter'; // Note the extension is missing
- import {WebSocket} from "ws"; // ws who?
Enter fullscreen mode Exit fullscreen mode

你不需要重新学习(大部分)JavaScript

Deno 尝试使用 Web 平台 API(例如fetch),而不是自行开发新的 API。这些 API 通常遵循规范,并且应该与 Chrome 和 Firefox 中的实现相匹配。Deno 甚至在其自己的 API 中使用 Web 标准,例如,Deno 的httpAPI 使用标准的请求和响应对象。Deno 甚至还window

Node.js 则反其道而行之,用自带的 API(通常使用回调)替换旧代码,这让我们不得不依赖模块。而 Deno 则充分利用了 JavaScript 的所有发展,而无需重新构建。此外,使用 Deno 更容易将代码移植到 Web 上(反之亦然)。

TypeScript 是这里的一等公民

Deno 内置了对 TypeScript 的支持 它不仅仅是用作外部模块或其他任何东西,不需要额外的参数,甚至不需要tsconfig.json。它甚至还具有互操作性——在 TS 中导入 JS,在 JS 中导入 TS。

更简单的分发

与 Node 不同,Deno 只是一个二进制文件。这使得安装和部署变得轻而易举。Deno 甚至可以将程序编译成二进制文件,这真是太棒了!它甚至支持交叉编译!

一个简单的演示

以下是catdeno 中的一个简单实现:

// mycat.ts
import { expandGlob } from "https://deno.land/std@0.102.0/fs/expand_glob.ts";

// no need to remove the path to deno, etc.
const files = Deno.args;

files.forEach(async file => {
    for await (const fileExpansion of expandGlob(file)) {
        const contents = await Deno.readTextFile(fileExpansion.path);
        console.log(contents);
    }
});
Enter fullscreen mode Exit fullscreen mode

该脚本将文件名作为参数并将其打印到控制台。

~$ deno run --allow-read mycat.ts cat.ts
// cat.ts
import { expandGlob } from "https://deno.land/std@0.102.0/fs/expand_glob.ts";

// no need to remove the path to deno, etc.
const files = Deno.args;
...
Enter fullscreen mode Exit fullscreen mode

请注意,您不需要安装或配置任何东西 - Deno 会为您处理。

现在,我们可以执行install脚本:

~$ deno install --allow-read mycat.ts
✅ Successfully installed mycat
/Users/APPLE/.deno/bin/mycat
~$
Enter fullscreen mode Exit fullscreen mode

概括

Deno 仍然很新。它拥有一个蓬勃发展的社区和大量的库(许多 Node 库已被移植到 Deno)。但它不像 Node 那样流行或受支持。不过,Deno 的易用性和简洁性使其在编写日常脚本时非常有用,而且它基于 URL 的模块共享系统使程序的分发变得像放在 GitHub 仓库或个人网站上一样简单。

文章来源:https://dev.to/siddharthshyniben/deno-the-next-step-in-node-js-ij1
PREV
什么是虚拟 DOM?(让我们来构建它!)
NEXT
面向软件工程经理的现代书籍