又一阵后浪:横空出世的Deno会取代NodeJS吗?

全文共 2180 字,预计学习时长 8 分钟

Deno 1.0.0版本于近期发布了,它是由Ryan Dahl发明的,他还因发明Node.js这个“小玩意儿”而闻名。

Node.js听起来很熟悉吧?这是否意味着Deno实际上已经自动取代了Node而我们该开始计划重构冲刺呢?

现在下结论显然为时尚早,但以下几个事实可能在很大程度上决定了Deno的发布。

从头说起

2018年,Ryan在一次演讲中谈到了他认为Node存在的10大问题。演讲的最后,他展示了他当时正在构建的、还只是一个小系统的Deno,也就是大家口中的Node.js 2.0版本,他对原有版本做了改进,也更加安全。

演讲视频:

两年后,Deno 1.0正式发布。其后端有一个全新的JavaScript运行环境,但它是用Rust编写的,而不是用C++。它以 Tokio 平台为基础(该平台为JavaScript提供其所需要的异步运行环境),仍可运行Google V8引擎。

还有什么新鲜的吗?

我们不仅仅是在讨论一个和现有的Node.js完全兼容的新的JavaScript运行环境,Ryan还利用了这个机会,在Deno中加入了一些他认为在早期创作中缺失的东西。

安全集成

默认设置中,Node.js允许用户访问所有内容,这意味着你可以读写文件系统、发出请求、访问环境变量等等。尽管作为开发人员,拥有这种访问权限是有利的,但如果在编写自己的代码时不够小心,也会带来安全风险。

因此,Deno使用命令行参数来启用或禁用对不同安全特性的访问。如果你需要让你的脚本访问/etc 文件夹,可以输入:

<span><span>deno</span> --allow-read=/etcmyscript.ts</span>

你的代码将从文件夹中读取,你会得到一个安全异常提示。这类似于其他平台处理安全性的方式。

如果你是Android用户,你一定已经收到了很多应用程序的要求,允许它们访问你手机中的不同系统(如联系人、电话、文件夹等)。这里也一样。通过在执行脚本的命令行中使用这些标志,可以提供代码所需的权限。

一个更完整的标准库

自Node的第一个版本开始,JavaScript就已经改进了它的标准库,但是与其他语言相比,它还有很多不足。

图源:unsplash

Deno也试图改进这一点,据说它会拥有一个非常完整的标准库,能让开发人员使用官方工具来执行基本任务,且只需使用外部库(alaNPM)来完成复杂的任务。

从本质上讲,Deno开箱即用,它的自带工具可以为终端文本添加 颜色 、处理 外部数据结构 (如二进制、csv、yaml和其他数据结构)、生成 UUID ,甚至编写 websockets 。还有其他可用的更基本模块,比如文件系统访问、日期帮助器函数、与http相关的函数 等等

集成版TypeScript

如果你是TypeScript的忠实用户,那么不需要外部工具,Deno就会帮你搞定很多工作,默认情况下JavaScript的转换在内部即可完成,这一点无需担心。

尽管默认情况下Deno会做很多工作,但你可以使用自己的tsconfig.json文件覆盖配置:

<span><span>deno</span> <span>run</span> <span>-c</span> <span>tsconfig</span><span>.json</span><span>[your-script.ts]</span></span>

默认模式是使用严格模式,因此,进行任何欠考虑的编码操作都会立即收到警告。

不再需要NPM和node_modules文件夹

这是个大问题。会不会太臃肿了?这种分散依赖关系的方式是错误的吗?这自然是Node最具争议的一大方面,Deno决定完全摆脱它。

那Deno是如何处理依赖项的呢?目前的方法是,允许你从任何地方索取模块。换言之,你可以这样做:

<span><span>import</span> * <span>as</span> log <span>from</span><span>&quot;https://deno.land/std/log/mod.ts&quot;</span>;</span>

你无需拥有自己的集中存储库,但必须谨慎操作,因为从无法控制的第三方源导入模块会让你处于开放暴露的状态。

事实上,我们的好朋友package.json也不见了。现在通过在名为deps.ts的文件中列出一系列模块及其各自的URL,来简化依赖性管理。 你肯定会问,版本控制呢? 你可以在 URL 上指定包版本。 虽然不是很方便,但行得通。

图源:unsplash

一个正常的deps.ts文件是这样的:

<span><span>export</span> { assert } <span>from</span><span>&quot;https://deno.land/std@v0.39.0/testing/asserts.ts&quot;</span>;</span>

<span><span>export</span> { green, bold } <span>from</span><span>&quot;https://deno.land/std@v0.39.0/fmt/colors.ts&quot;</span>;</span>

这将重新导出模块。如果你想更改模块的版本,需对URL进行相应的简化修改。在第一次执行脚本时,导入的代码会被缓存,直到再次使用--reload 标志运行为止。

还有别的吗?

Deno还有其他特点,比如它拥有了更多的“开箱即用”工具,包括测试运行器、调试器、文件监视程序等。但话说回来,其中一些只是由语言提供的API接口,你需要编写出自己的工具才能使用它们。

以 Deno.watchFs提供的文件监视器API接口为例,如果你正在寻找与 nodemon 类似的解决方案,那你必须自己完成。下面是解决类似问题的23行脚本:

Deno会很快取代Node.js吗

老实说,不一定。有些人自Node.js 0.10版本推出就开始使用Node js,甚至将其应用于生产。我们过去之所以这样做是因为没有与其类似的系统。

PHP、Python甚至Ruby都无法在后端与JavaScript和异步I/O模型相提并论,更不用说Java和. NET了。这些年来,Node和JavaScript不断改进升级,以满足业界需求。

它是完美的吗?当然不是。和生活中的其他事情一样,在编程语言方面也很难做到十全十美。

图源:unsplash

Deno也不例外。目前它还只是一个计划用2年时间达成目标的想法。它还没有在生产系统中试验和测试过,没有被审查过,也没有应用于奇怪的、意想不到的使用情况,我们无法了解它是如何处理这些极端情况的。

也许在一年后,我们会听到公司分享他们有关应用Deno的经验、他们如何解决新发现的缺陷,最终,它背后的群体将使用Deno,让它“物尽其用”。而在此之前,Deno还只是早期使用者的玩具。

它会取代Node吗?谁知道呢,一起拭目以待吧!

推荐阅读专题

留言点赞发个朋友圈

我们一起分享AI学习与发展的干货

编译组:吴子珺、周果

相关链接:

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

如转载,请后台留言,遵守转载规范

推荐文章阅读

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章