Deno:Node.js 的下一步
Deno由Node的创建者 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
但在 Deno 中,你可以这样做:
~$ deno run --allow-read linter.js
这里有几点需要注意。首先是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!
该文件.deno/bin/linter
非常简单:
#!/bin/sh
# generated by deno install
exec deno run --allow-read 'file:///Users/APPLE/Sites/Projects/deno-test/linter.js' "$@"
这里没有包管理器
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?
你不需要重新学习(大部分)JavaScript
Deno 尝试使用 Web 平台 API(例如fetch
),而不是自行开发新的 API。这些 API 通常遵循规范,并且应该与 Chrome 和 Firefox 中的实现相匹配。Deno 甚至在其自己的 API 中使用 Web 标准,例如,Deno 的http
API 使用标准的请求和响应对象。Deno 甚至还window
Node.js 则反其道而行之,用自带的 API(通常使用回调)替换旧代码,这让我们不得不依赖模块。而 Deno 则充分利用了 JavaScript 的所有发展,而无需重新构建。此外,使用 Deno 更容易将代码移植到 Web 上(反之亦然)。
TypeScript 是这里的一等公民
Deno 内置了对 TypeScript 的支持 !它不仅仅是用作外部模块或其他任何东西,不需要额外的参数,甚至不需要tsconfig.json
。它甚至还具有互操作性——在 TS 中导入 JS,在 JS 中导入 TS。
更简单的分发
与 Node 不同,Deno 只是一个二进制文件。这使得安装和部署变得轻而易举。Deno 甚至可以将程序编译成二进制文件,这真是太棒了!它甚至支持交叉编译!
一个简单的演示
以下是cat
deno 中的一个简单实现:
// 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);
}
});
该脚本将文件名作为参数并将其打印到控制台。
~$ 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;
...
请注意,您不需要安装或配置任何东西 - Deno 会为您处理。
现在,我们可以执行install
脚本:
~$ deno install --allow-read mycat.ts
✅ Successfully installed mycat
/Users/APPLE/.deno/bin/mycat
~$
概括
Deno 仍然很新。它拥有一个蓬勃发展的社区和大量的库(许多 Node 库已被移植到 Deno)。但它不像 Node 那样流行或受支持。不过,Deno 的易用性和简洁性使其在编写日常脚本时非常有用,而且它基于 URL 的模块共享系统使程序的分发变得像放在 GitHub 仓库或个人网站上一样简单。
文章来源:https://dev.to/siddharthshyniben/deno-the-next-step-in-node-js-ij1