Deno 会在短期内取代 Node 吗?

2020-05-22 09:16:30 +08:00
 GrapeCityChina

Deno 是什么?

Deno v1.0.0 已于 5 月 13 日正式发布。

其开发者为 Ryan Dahl,他的上一个项目是 Node,相信我们大部分人都了解。

作为 Node 之父,Ryan Dahl 认为 Node 自从他把项目移交出去后,Node 的走向越来越背离了他的初衷,并且存在着很多无法解决的问题,所以他决心重新开发一个新的项目去解决这些问题,这个项目就名为 Deno 。目标则是Destroy-node 。

那么,这样是不是就意味着 Deno 即将替代 Node,成为 Node 的下一代产品?我们应不应该从现在就开始放弃 Node 开始使用 Deno 呢? 让我们一起看看。

起源

在 2018 年,Ryan 在柏林进行了一次演讲,这是他第二次关于 JS 的公开演讲,第一次再 2009,那次是宣布 Node 项目的诞生。

在这次演讲中,除了主要介绍他认为 Node.js 的几大问题和不可避免的许多 Bug 外,在演讲快结束时,他揭开了当时还是个小项目名为 Deno 的面纱,因为和 node 命名有着千丝万缕的联系,那时大家认为这个项目就是 Node.js v2,它将会解决和完善 ry 提到那些问题。

两年后的 5 月 13 日,Deno 1.0 终于正式发布了,它是一个全新的服务端 JavaScript 运行时,使用 Rust 而不是 C++开发,由于 Rust 原生支持 WebAssembly,所以它也能直接运行 WebAssembly 。基于 Tokio 平台(它提供了所有 JavaScript 所需的异步操作),内置 V8 和 tsc 引擎,可直接解释 JavaScript 和 TypeScript 。

安全集成

默认情况下,Node.js 给你的访问权限比较高,这意味着你拥有读写文件系统、对外发出请求、访问环境变量等行为。虽然作为开发人员,拥有这种级别的访问权限对开发过程非常好,但如果你在开发过程中有一点疏漏,将来对你的应用也会产生安全风险。

而在 Deno 这,默认情况下脚本不具有读写权限,必须显式通过命令行参数来启用或禁用对不同安全功能的访问。因此,如果需要脚本能够访问 /etc 文件夹,可以通过下面命令行执行:

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

这就类似于其他平台处理安全性的方式。如果你是 Android 用户,那么肯定有很多应用程序要求你允许它们访问你手机内的不同资源,例如联系人、电话、文件夹等,同样的概念也可以在这里应用。通过将这些标志用作执行脚本的命令行的一部分,你可以提供代码所需的权限。

更完整的标准库

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

本质上,Deno 开箱即用工具为终端文本添加颜色,处理外部数据结构(如 Binary 、CSV 、YAML 和其他),生成 UUID,甚至编写 WebSocket 。还可以使用其他更基本的模块,例如文件系统访问、日期助手函数、http 相关函数等等。

集成 TypeScript

如果你对 TypeScript 非常熟悉,那么使用 Deno 将会更加容易上手,因为它原生可以直接运行 TS 。

另外,Deno 不需要任何外部工具去支持多语言,它内部会根据文件后缀自动判断其使用的语言解释引擎。

虽然默认情况下 Deno 会处理很多事情,但您可以使用自己的 tsconfig.json 文件覆盖配置:

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

默认配置使用的是严格模式,因此如果发现任何不合格的代码都会立即得到提示。

放弃 NPM 和 node_modules

Deno 决定完全放弃 NPM 和 node_modules, 因为 npm 逻辑越来越复杂,node.js 对外部模块几乎没有任何安全验证措施,另外 node_modules 也越来越臃肿且难以管理。

那么,Deno 是如何处理依赖关系呢?它是通过 url 加载所有模块的:

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

所以,Deno 不再需要拥有一个集中的存储库,之前的 package.json 也不再需要了,现在通过在名为 deps.ts 的文件中包含了模块列表及其各自的 URL,简化了依赖管理。但版本管理控制怎么办呢?作者已经想到了,可在 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";

由于这个文件的存在,在内部运行时,依赖项将被重新导出,这就能让应用程序的不同模块都引用相同的源。

如果您想更新任何模块的版本,可以通过修改 deps.ts 中 URL 的版本信息。另外,虽然没有了 node_modeules 目录,但依赖项仍然会下载并隐藏在你的硬盘中,供你离线使用,如通过需要重新下载,只需在命令中添加—reload 命令即可。

还有什么?

Deno 还包括其他特性,比如自动测试器、调试器、文件监视器等开箱即用的工具。但其中一些只是语言提供的 API,您需要编写自己的工具才能使用它们。

以 Deno.watchFS 向您提供的文件监视器 API 为例,如果你正在寻找类似于 nodemon 的解决方案,那么你可以自己构建它。下面是一个解决类似问题的 23 行脚本:

最后,它会在短期内取代 Node.js 吗?

虽然 Deno 的很多想法和理念非常好,也确实解决了很多问题。但作为一个从 Node 发布之初就开始用的团队,我认为 PHP 、Python 甚至 Ruby(更不用说 Java 或.NET)都不能与在后端拥有 JavaScript 和异步 I/O 模型相提并论。这些年来,Node(和 JavaScript)不断发展,以满足业界的需求。

在我看来,虽然 Deno 是以 Destroy-node 为己任而开发的,但就目前来讲,Deno 取代 Node 仍不可能,Node 的占有率太高了,生态也足够完善,基本属于想要什么功能都能在社区中找到,所以基本无需担心。而 Deno 还在孵化初期,企业很难去放弃已经成熟的技术转而投入更大的精力使用它。但它未来的前景还是令人期待的, 也许在越来越多的行业头部企业分享过它们的使用经验后,Deno 的存在也会越来越为人所知。

8884 次点击
所在节点    Node.js
41 条回复
PotatoBrother
2020-05-22 14:07:32 +08:00
@damngood 赞同,如果觉得恶心,应该提出具体的例子以及场景进行阐述……
Richardweii
2020-05-22 14:16:03 +08:00
生态才是最重要的,而 deno...
wangyzj
2020-05-22 14:58:38 +08:00
前端一直想替代后端
但是折腾来折腾去一直是把自己折腾够呛
到现在 ts 还没替代 node
deno 先等等吧
Chenamy2017
2020-05-22 15:03:22 +08:00
贵圈真是乱
galileo1214
2020-05-22 15:17:23 +08:00
登上 CSDN 首页
yuankui
2020-05-22 15:22:38 +08:00
用 yarn 挺快,没有迁移的动力,对我而言
skyline45
2020-05-22 15:23:10 +08:00
怎么可能呢傻猪猪
ayase252
2020-05-22 15:36:05 +08:00
假如我有一个依赖指向的是 url.com/package-a@0.1.0,开发的时候是好的。但是,在某个时间里,库的作者在没有更改版本号的情况下引入了 breaking change 。也就是说同样的 url 指向的是不同的文件。接下来要在新服务器上部署,会不会突然发现起不来?
love
2020-05-22 15:36:43 +08:00
都是我很看好的改进,比 Node 更适合写命令行小程序了
gaojiren
2020-05-22 16:02:44 +08:00
我非常看好 deno,短时间内无法取代,我们可以预期下 5 年后的。node 的生态环境是很容易迁移到 deno 中来的。
saberlong
2020-05-22 18:37:44 +08:00
@ayase252 这块应该有 checksum 设计。golang 就是,有 go.sum 。发现冲突,需要排查是包被篡改了,还是有人不按照规范来。
fenghuang
2020-05-22 18:51:16 +08:00
@ayase252 #28 使用的时候回缓存到本地,你不放心可以把缓存也放到服务器上一起部署,官方是这样说的
Cryse
2020-05-22 19:27:02 +08:00
node_modules 真的是恶心,里面几万个小文件...
按理说 node 和 npm 出来的时候已经有不少成熟的包管理工具了,然而并没能借鉴到优点,反而创造出了别人不存在的问题。
ccraohng
2020-05-22 20:26:02 +08:00
没太觉得 node_modules 恶心了,反正我又不对着 node_modules 目录开发。倒是 npm,拒绝使用 node-sass 。
deno 这个全局 API 确定不是送塔?不看好。
evenIfAlsoGo
2020-05-22 20:58:28 +08:00
deno 短期不会的,生态很重要,慢慢发展看
tojonozomi
2020-05-22 21:07:09 +08:00
我觉得,node 应用能较低成本的迁移到 deno 的话,还是可以的?
beginor
2020-05-22 22:08:44 +08:00
如果 deno 能够编译运行前端三大框架( Angular,React 和 Vue )的话,相信推广的会很快的,毕竟大多数都是将 node 作为前端工具链的
dioxide
2020-05-22 22:36:58 +08:00
不乱不是贵圈,不过我喜欢
xcstream
2020-05-22 22:53:59 +08:00
除非什么时候 C 语言被替代了
cw2k13as
2020-05-23 10:18:27 +08:00
@danhahaha 你就不能换成 yarn 或是换下源,还想直接出国?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674250

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX