说明: 本文来自Medium ,作者:Fernando Doglio

文章版权属于原网站/原作者。我依旧只是个搬运工+不称职的翻译。

Deno v1.0.0 计划于 5 月 13 号发布。这里有一些有趣的事实,可能对确定 Deno 起作用。

Deno

确定的是,(显然)太早了来讨论这个事情,但这些事实可能可以确定 Deno。

对于初学者来说,Deno 由创建过 Node.js 的 Ryan Dahl 编写,是不是听起来很熟?这是不是意味着 Deno 是 Node 的替代方案并且可以计划我们对重构进行冲刺了?当然不是!但如果你想了解更多,请继续读下去!

让我们从头开始

在 2018 年,Ryan 讲了他认为做 Node.js 时犯的错误的前十名,并且在演讲的最后,他揭示了 Deno,在那个时候,这只是一个可以称为 Node.js 第二的小项目,提供了更多的安全方案。

点击这里观看视频(请自备梯子)

两年后,Deno 1.0 官方发布日期确定了:5 月 13 号。为后端开发准备的全新的 JavasSript 运行时,使用 Rust 而不是 C++ 编写而成,基于 Tokio 平台(为 JavaScript 提供必备的异步运行时),依旧运行于 Google V8 引擎之上。

但还有什么新东西呢?

我们讨论的不仅仅是与当前的 Node.js 完全兼容的新的 JavaScript 运行时,取而代之的是,Ryan 为 Deno 添加了在创建 Node.js 时没有考虑到的特性。

安全集成

一般来说,Node.js 允许你具有访问所有内容,意思是你可以在文件系统中进行读写操作,向外发布请求,访问环境变量等等。尽管对于开发者来说,获取这些权限是有益的,但代码可能不小心留下安全隐患。

取而代之的是,Deno 使用命令行参数用于是否开启不同的安全措施。比如你的代码需要访问 /etc 目录,则需要:

1
deno --allow-read=/etc myscript.ts

这允许代码读取该目录,除此之外会报安全错误。这与其他平台的安全措施类似。如果你是安卓用户,许多应用在使用时会向你询问是否能获取系统权限(比如联系人,通行记录,文件夹等),同样的原理也应用于此。通过使用这些选项来执行你的代码,提供了代码所需的权限。

更完整的标准库

自从第一个 Node 版本开始,JavaScript 改进了其标准库,但与其他语言相比,它还有很长的路要走。Deno 试图为开发者提供完善标准库用于完成基础任务,而使用外部库(也就是 NPM)用于更复杂的任务。

实质上,开箱即用的是,Deno 为终端文字增加了颜色,使用外部数据结构(比如 binary, csv, yaml 等),生成 UUIDs 甚至是编写 websockets。还有些其他的,更多可使用的基础模块,比如访问文件系统,日期助手(date helper)方法,http 关联方法以及其他库

TypeScript 集成

你没看错,如果你是 TypeScript 粉丝,那么 Deno 帮你解决了,而不需要额外工具,默认在内部完成编译为 JavaScript 。

尽管在默认情况下,Deno 会解决许多问题,你可以使用 tsconfig.json 进行设定:

1
deno run -c tsconfig.json [your-script.ts]

默认情况下使用严格模式,因此,任何不良的编码将立即收到警告。

不再有 NPM 或 node_modules 目录

这是一个问题,因为每个包和其父类的都有依赖。这是不是显得太臃肿了?这是分发依赖关系的错误方式吗?这无疑是Node 最具争议的方面之一,而 Deno 确定彻底摆脱这种方式?

所以 Deno 是如何处理依赖的?自此,允许你可从任意地方引用。换句话说,你可以这样做:

1
import * as log from "https://deno.land/std/log/mod.ts";

自身不再需要的集中式存储库,但需要小心进行实践,无法控制第三方导入的模块,导致处于暴露状态。

事实上,我们也没有 package.json,使用包含模块列表以及其依赖的 URL 的 deps.ts 文件用于模块管理。但版本管理呢?我知道你会提问的。你可以在 URL 上标明版本号,这样并不优雅,但的确可行。

deps.ts 文件示例如下:

1
2
export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts";
export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts";

只需要简单的更改 URL ,你就可以重新导出模块并改变其版本。

随便说一下,导入的代码会被缓存,第一次运行代码时,需要增加 –reload 标签进行重新构建。

还有什么呢?

Deno 还包括了另一些模块,比如开箱即用的工具,例如测试运行器(test runner)、调试、文件监听等等。但话又说过来,其中一些只是语言提供的 APIs,你需要编写自己的工具进行使用。

比如文件监听 API,由 Deno.watchFs 提供,你可以使用类似于 nodemon 进行构建。这里仅仅使用 23 行代码就能解决类似的问题:

Deno.watchFs

这段代码是 Caesar2011 发布的其中一段,你可以在这里看到完整代码。

所以,Deno 会很快代替 Node.js 吗?

实话实说,并不会,这里有些标题党了。我们使用 Node.js 可以追溯到 0.10 版本,并且已经用在实际产品中了!告诉你真相可能有些恐怖,但我们这么做是因为当时没有其他可选方案。无论是 PHP、Python 还是 Ruby (更不用说 Java 或 . net ),都无法与后端同时使用 JavaScript 和异步 I/O 模型相提并论。这些年来,Node(和 JavaScript )已经成为工业的必备。这是不是很完美?当然不是!与生活类似,当涉及到编程语言时,没有是完美的。

Deno 并没有区别,只是因为现在,它是花了两年时间在一个想法上的成果。其还没有在实际产品中进行编码和测试。尚未对 Deno 进行检测,也没有放入怪异和意外的用例中,以了解是如何处理边界情况的。直到这些完成,Deno 只是尝鲜者把玩的玩具。可能过了一年,我们开始听到公司是使用 Deno 的经历,他们是如何解决发现的问题,其背后的社区将对其进行怎样的调整,使其能够发挥作用。Deno 是否能代替 Node 呢?谁知道呢?只有时间才能给出答案。

所以,你是怎样认为的呢?