21

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

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI2NjkyNDQ3Mw%3D%3D&%3Bmid=2247493366&%3Bidx=2&%3Bsn=94158e2e8f4f979aed1c37f95499dbb9
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

EjyQZvZ.jpg!web

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

EJzEfyI.png!web

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

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

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

NnuUFb2.jpg!web

从头说起

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

演讲视频:

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

NnuUFb2.jpg!web

还有什么新鲜的吗?

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

安全集成

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

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

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

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

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

一个更完整的标准库

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

UjEv6fA.jpg!web

图源: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 上指定包版本。 虽然不是很方便,但行得通。

IniqYfz.jpg!web

图源:unsplash

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

<span><span>export</span> { assert } <span>from</span><span>&quot;https://deno.land/[email protected]/testing/asserts.ts&quot;</span>;</span>

<span><span>export</span> { green, bold } <span>from</span><span>&quot;https://deno.land/[email protected]/fmt/colors.ts&quot;</span>;</span>

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

还有别的吗?

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

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

3Mb6FzN.png!web

NnuUFb2.jpg!web

Deno会很快取代Node.js吗

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

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

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

eaAbeeF.jpg!web

图源:unsplash

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

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

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

VbeE7j3.jpg!web

推荐阅读专题

NBJ7vyI.jpg!web

bEniumQ.jpg!web

m6jER3M.jpg!web

iuUFJbn.jpg!web

Nbqmy26.jpg!web

留言点赞发个朋友圈

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

编译组:吴子珺、周果

相关链接:

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

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

推荐文章阅读


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK