查看原文
其他

Deno 会取代 Node.js 吗?

前端大全 2021-01-15

The following article is from CSDN Author Fernando

(给前端大全加星标,提升前端技能

转自:CSDN

几天前,Node 之父 Ryan Dahl 及 Deno 团队为我们正式带来了 Deno 1.0,据官方介绍,这是一个 JavaScript/TypeScript 运行时,使用 V8 引擎、Rust 构建。因其是 Node 之父的已经历时两年的新项目,Deno 在业界引起了非常强烈的讨论。本文作者 Fernando Doglio 是在 Node.js 上鼎鼎有名的大神,著作了多本技术图书,包括《Scaling Your Node.js Apps》、《REST API Development with Node.js》、《Reactive Programming with Node.js》等,其中有《Python 性能分析与优化》经图灵引进已在国内上架中文版。在本文中,Fernando 详细分析了 Deno 的众多特性,以及开发者们尤为关注的是否会取代 Node.js 上,CSDN 经 Fernando 授权并发布以飨读者。


以下为译文:

Deno 是什么?它会取代 Node.js 吗?

显然,对这个问题的简单回答就是“现在下结论还为时过早”,但有几个事实可能在你做出这样的决定时发挥重要的作用。

首先,Deno 是由 Ryan Dahl(Node 之父)所创建,他也以创建 Node.js 而闻名于世,听起来很熟悉吗?这是否意味着 Deno 会自动取代 Node?我们都应该开始计划重构 sprint 吗?见鬼,当然不!但是如果你想了解更多,请继续阅读!

我们从头说起


2018 年,Ryan 做了一次演讲,他谈到了他认为 Node.js 的十大错误之处。在演讲的最后,他公布了 Deno 项目,当时它还只是一个小项目,Ryan 将在这个项目中构建一个称为 Node.js v2 的东西,它将对 Node.js 作些改进,并且使其更加安全。

下面是 Ryan 当时演讲的视频(请自备梯子访问):

https://youtu.be/M3BM9TB-8yA

两年后,这个项目的发布日期终于确定在 2020 年 5 月 13 日,也就是 Deno 1.0 正式发布的日子。Deno 是一个在服务端运行的、全新的 JavaScript 运行时,但是它是用 Rust,而不是用 C++编写的。它基于 Tokio 平台(它提供 JavaScript 所需的异步运行时),并且仍然运行谷歌的 V8 引擎。

除此以外,Deno 都有什么新特性?


Deno 将不再是一个与当前 Node.js 完全兼容的新的 JavaScript 运行时。相反,Ryan 利用这个机会将一些他认为在 Node.js 的早期创建中缺失的一些特性放入到了 Deno 中。

  • 集成的安全性

默认情况下,Node.js 允许你访问所有内容。也就是说,你可以读写文件系统、发出请求、访问环境变量等等。虽然作为一个开发人员,拥有这种访问权限是一个好处,但如果在编写自己的代码时不小心,也会带来安全风险。

而 Deno 则不同,它使用命令行参数来启用或禁用对于一个访问不同的安全特性。比如说,如果你需要对脚本启用访问/etc 文件夹的权限,你可以执行以下操作:

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

这样一来,你的脚本代码从可以从 /etc 文件夹中读取任何内容,而其他的东西想要执行同样的读取操作将会遇到安全异常。这与其他平台处理安全性的方式类似。如果你是一个安卓用户,那么肯定有很多应用程序曾要求你允许它们访问手机内部的不同系统(例如联系人,电话,文件夹等),同样的概念也可以在这里应用。通过在执行脚本的命令行中使用这些标志,可以提供代码所需的权限。

  • 更完整的标准库

自从 Node.js 的第一个版本以来,JavaScript 已经改进了它的标准库,但是与其他语言相比,它还有相当长的路要走。Deno 试图改进这一点,并声称拥有一个非常完整的标准库,允许开发人员使用官方工具来执行基本任务,只是在执行复杂的任务时需要使用外部库(ala NPM)。

从本质上讲,Deno 提供了一些开箱即用的工具,例如,它可以为终端文本添加颜色、使用外部数据结构(例如二进制、csv、yaml 等)、生成 UUID 甚至编写 WebSocket 等等。它还提供了其他更基本的模块,如文件系统访问、日期助手函数、HTTP 相关函数等等。

  • 集成的 TypeScript

你没看错,如果你是 TypeScript 的爱好者,那么 Deno 就可以满足你的需要。不需要外部工具,默认情况下,将 TypeScript 代码转换为 JavaScript 是在内部完成的,因此你无需担心。

尽管默认情况下,Deno 会处理很多事情,但是你也可以使用自己的 tsconfig.json 文件覆盖默认配置:

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

默认配置使用严格模式,因此任何未经深思熟虑的编码实践都会立即得到警告。

  • 不再有 NPM 或 node_modules 文件夹

因为每个软件都需要尽量兼容它的各个前代版本,所以这成了一个大问题。Node.js 的文件夹太臃肿了吗?分发依赖关系的方式是错误吗?这绝对是 Node.js 最具争议的方面之一,而 Deno 决定彻底摆脱它。

那么,Deno 如何处理依赖关系呢?在这个版本中,它的做法是:允许你从任何地方导入你所需要的模块。换句话说,你可以简单地执行以下操作:

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

Deno 不再需要拥有自己的集中式存储库,但是在执行此操作时你必须谨慎,因为从无法控制的第三方来源导入模块,可能会导致你处于公开状态,并暴露于外部世界中。

实际上,我们的好朋友 package.json 文件也不再使用了,现在通过将模块列表及其对应的 URL 放入一个名为 deps.ts 的文件中,简化了依赖管理。而对于版本控制,你可以在 URL 上指定软件包的版本,虽然它不是很优雅,但是使用起来很方便。

一个正常的 deps.ts 文件可能如下所示:

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 还包含其他功能,例如开箱即用的大型工具,包括测试运行程序、调试器、文件监视程序等。但是必须指提出,其中一些只是该语言提供的 API,你需要编写自己的工具才能使用它们。

以 Deno.watchFs 提供给你的文件监视程序 API 为例,如果你正在寻找与 nodemon 类似的解决方案,那么你必须自己构建它。下面是一个解决类似问题的 23 行脚本,代码如下:

用户 Caesar2011 将上述脚本作为其代码库的一部分发布,你可以在这里找到完整的代码。

Deno 会很快取代 Node.js 吗?


不见得会。说实话,这个标题看起来有点像是骗取点击的诱饵。我们中的一些人在 Node.js 发布版本 0.10 的时候就开始使用它了,并且是在生产环境中使用它!告诉你真相有点吓人,但是我们这么做是因为当时周围没有类似的东西。PHP、Python 甚至 Ruby(更不用说 Java 或.NET)都无法与这样一个在服务器端支持 JavaScript 和异步 I/O 模型的软件相提并论。经历了这么多年,Node.js(和 JavaScript)已经发展到可以满足整个行业的要求。但是它完美吗?当然不是!但是,就像生活中的任何其他事物一样,任何编程语言都不是完美无缺的。

Deno 也没有什么不同。现在发布的 Deno,只是对一个想法在过去大约两年工作的总结。它还没有被投放到生产环境中进行尝试和测试。也尚未对它进行过审查,并将它放入各种奇怪的和异常的用例中,以了解其如何处理各种边界情况。在这些工作完成之前,Deno 只是一个供早期采用者使用的玩具。也许一年后,我们会开始听到一些公司分享他们的经验,以及他们是如何解决新发现的问题的。最终,它的支持社区将对其进行调整,使其变得更加实用。那么,Deno 最终会取代 Node.js 吗?没有人知道答案!我们将对其拭目以待。

英文:What is Deno and will it Replace NodeJS?

链接:https://blog.bitsrc.io/what-is-deno-and-will-it-replace-nodejs-a13aa1734a74


推荐阅读  点击标题可跳转

推倒 Node 重做,Deno 1.0 来了

了不起的 Deno 入门教程

一杯茶的时间,上手 Node.js


觉得本文对你有帮助?请分享给更多人

关注「前端大全」加星标,提升前端技能

好文章,我在看❤️

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存