发布了Deno v1.0.0来解决Node.js的设计缺陷

发布于:2020-12-24 16:13:08

0

132

0

后端 Node deno javascript rust typescript

自从2009年创建以来,Node.js已经成为最流行的web技术之一。它并不是第一个允许JavaScript在服务器端进行处理的公司——那是1997年Netscape公司的Rhino——它专注于在浏览器之外执行JavaScript,这使得它非常受欢迎。

您可以看到原因:在前端和后端使用相同的语言可以简化事情。您可以在不了解多种语言的情况下编写前端和服务器端代码,然后在这两种语言中重用代码。此外,它还有垃圾收集功能,因此不会干扰内存管理或任何底层机制。创建您的业务逻辑代码,让她自行处理。脚本的简单性是Python过去和现在如此流行的原因之一。

此外,在事件驱动编程还不流行的时候,它普及了它(但并没有真正使它变得简单)。js只在被调用时工作。它获取一个请求,触发一个回调,只要没有其他东西需要运行,它就会休眠。支持大量异步并发用户的巨大飞跃。难怪这么多大型web应用程序使用它。

但那是11年前的事了,用计算的术语来说,那已经很古老了。js生态系统已经发展到产生大量的图书馆——仅npm就有超过100万个——它是基于一种本身经历了11年令人难以置信的增长的技术。有一些破解方法,但它们仍不完美。

Node.js的创建者Ryan Dahl在2012年离开了Node.js项目,大约6年后又开始了与它的合作。在再次使用它的过程中,他发现了一些困扰他的设计缺陷。在2018年JSConf欧盟的一次发言中,他说,“当你对漏洞负责时,漏洞就会变得非常明显。”所以他决定创造一个新的实现他最初的想法:Deno。随着上周发布的Deno v1,每个人都可以使用这个新版本。

当Node.js表现完美的时候,为什么你需要一个新的独立的JavaScript运行时呢?好吧,继续往下读,我们将介绍主要的变化,以及它们对开发人员意味着什么。

Deno和Node之间的区别是什么?

与Node一样,Deno主要在命令行界面上操作,这使得从其他程序调用它更加容易。它内置在Rust中,速度更快,并包含一个插件API。Deno被设计成一系列的防锈板条箱,其中以外延核作为主要的骨架运行时。另一个板条箱提供到JavaScript V8 c++ API的绑定。所以如果另一个版本的JavaScript取代了V8, Deno需要做的就是提供一个新的板条箱。

对于很多人来说,Deno中最致命的特性是对TypeScript的原生支持。TypeScript对JavaScript有很大的影响,但是它必须被转换成JavaScript,以便利用它强大的类型和其他特性。但是有了Deno, TypeScript现在是一种一流的语言。您可以免去调试类型错误的痛苦,而不必担心复杂的构建链。

TypeScript最近迅速流行起来,这在很大程度上是因为静态类型语言具有更容易的可维护性和调试性,也因为它被Angular和React等流行的前端框架所采用。通过取消构建步骤,Deno消除了不切换到TypeScript的另一个原因。

对于一个为事件而构建的技术,Node.js并没有做得很好。它出现在承诺或异步/等待模式的概念之前,因此必须提出自己的版本。早在2009年,Node.js就有了promise抽象的一个版本,但是在2010年就被删除了。相反,它采用了EventEmitter模式。除非显式地调用pause(),否则任何打开的TCP套接字都会不停地向您抛出事件,可能会淹没一个停止的应用程序。

Deno逆转。不是显式地停止来自套接字的流,而是必须显式地读取它们。它们仍然异步运行,只是不是持续的。将它与构建在Rust中的类似承诺的抽象“期货”结合起来,您就可以更容易地管理传入的事件。

但是现在没有任何一个网络技术是孤立的,比如德诺节点。js -将支持庞大的模块和依赖关系生态系统。js用npm做到了这一点,但是尽管它有一个npm的中央存储库,它还是无法阻止恶意参与者。最近,一些曾经有用的包被更新并嵌入了恶意代码,暴露了自动更新的困难。

Deno在如何管理依赖关系方面受到了一些批评。Deno没有通过包管理器路由它们,而是将每个依赖项模块指定为一个简单的URL。您不再拥有中央管理器的保护,但是不能保证该存储库提供的保护比直接链接到该代码的保护更多。

像任何现代浏览器一样,Deno在沙箱中执行所有代码;没有明确的权限,它不能访问硬盘驱动器、网络连接或I/O外围设备。任何代码都必须使用启用非沙箱活动的标志来执行。而且权限是颗粒状的——您可以授予对单个硬盘驱动器或网络位置的访问权。

Dahl明确表示,这不是节点的延续;这是一个全新的项目。因此,它目前还不能与现有的Node.js生态系统相匹配。大多数包无法工作,工具也不兼容。可能让人们离开,但保罗·福特说过我们的播客,“我不流血的边缘了,但是如果你告诉我,一年后我下载Deno代替节点和使用包管理方法代替npm的了,我不会感到惊讶。”

这是web应用程序的游戏规则改变者,还是一个尚未站稳脚跟的有用更新,还有待观察。但乍一看,它可以在服务器端代码中实现JavaScript(如TypeScript)标准过程的最新进展。