为什么需要Deno.js? - DEV


您正在尝试学习JavaScript。您刚刚对浏览器中的JavaScript有所了解。然后,突然之间,你遇到Deno 是Node.js杀手之类的炒作。但是您不知道这些是什么。如果是这样,请继续阅读!

什么是JavaScript引擎?
您可能知道,JavaScript是一种解释型编程语言。这意味着在执行之前不会将源代码编译成二进制代码。JavaScript引擎可以将JavaScript代码即时编译为可执行的机器代码。这就是所谓的即时(JIT)编译。例如,当您在Google chrome上运行JavaScript时,您的JavaScript引擎为V8。如果在Mozilla上,则为SpiderMonkey。

什么是JavaScript运行时环境?
通常,您通常不直接使用JavaScript引擎。JavaScript引擎在一个环境中运行,该环境为您的JavaScript应用程序提供了可在运行时使用的其他功能。运行环境是允许与引擎外部环境进行通信的API。例如,像Google Chrome这样的网络浏览器是一个桌面JavaScript运行时环境,它使用V8 JavaScript引擎并提供DOM API,Fetch API,Storage API等。同样,诸如Node和Deno之类的服务器端运行时环境也使用V8引擎,并提供文件系统访问,网络访问,控制台等。

为什么我们需要浏览器之外的运行环境?
尽管JavaScript的主要环境是Web浏览器,但近年来,JavaScript接管了服务器平台。
服务器端JavaScript运行时环境使您可以访问文件系统,网络以及Web浏览器所不允许的其他内容。实际上,您可以使用仅基于JavaScript的技术堆栈(例如MEANMERN)构建整个Web应用程序(从UI到数据层)。

NodeJS怎么了?
根据NodeJS的创建者Ryan Dahl的说法,NodeJS在某些方面做错了。他在JSConf EU 2018上发表了有关此主题的演讲

  1. 不信守Promise:NodeJS实际上有本机的Promise支持,但是几个月后,它被删除了。因此,NodeJS必须使用变通方法来实现Promise。
  2. 安全:V8本身就是一个非常好的安全沙箱。NodeJS删除了所有这些安全功能,并为应用程序提供了访问所有内容的权限。
  3. 构建系统:Chrome开始将GYP用于构建系统,因此NodeJS也进行了切换。但是后来Chrome放弃了GYP并采用GN作为他们的构建系统,因为它更快,更简单。根据Ryan Dahl的说法,继续使用GYP可能是NodeJS核心最大的失败。
  4. npm和package.json:所有npm软件包都包含一个文件,通常在项目根目录中,名为package.json-该文件包含与项目相关的各种元数据。顾名思义,npm或Node Package Manager用来管理项目中的依赖包,从而使您的生活更轻松。package.json文件具有一些不必要的信息,只有npm注册表才需要。Ryan将此描述为“样板噪声”,因为它没有给项目增加任何噪声。npm是集中式的,由私人控制。如果您已经在浏览器中完成了一些项目,您将知道如何链接到依赖项。与JQuery,Bootstrap等类似。您可以将任何链接添加到HTML,并且可以直接使用它。在Node中,您不能在npm之外的任何地方安装依赖项表单。
  5. 没有扩展名“ .js”的require("module") :这是您导入外部库的方式,这还不够具体。例如,如果要在项目中安装JQuery,则应首先使用npm通过install命令将其安装在项目文件夹中:npm install jquery。然后,如果要在文件中使用它,则可以在要使用JQuery的文件中添加“ require()”语句:require("JQuery")。这种整洁的语法起作用所需的算法非常复杂且效率低下。模块加载器必须在多个位置查询文件系统,以猜测用户的意图。
  6. node_modules:在项目中安装依赖项时,它们将下载到“ node_modules”文件夹中。问题是每个项目一个,假设您要创建两个不同的项目,但是它们都使用JQuery,则可以下载“ JQuery.js”文件,并将其保存在共享文件夹中,您可以从两个项目链接到该文件夹​​。当您准备发布项目时,只需更改指向远程文件的链接并发布它们。您甚至可以将本地文件重新用于将来的任何项目。这在Node中是不可能的。
  7. index.js:如果未指定,NodeJS将寻找“ index.js”文件。这是不必要的事情。它不必要地使模块加载系统复杂化。在“ require()”支持package.json之后,它变得特别不必要。

所有这些问题都是NodeJS的核心功能,而试图解决这些问题将意味着创建一个全新的事物。而且有太多使用NodeJS的代码,解决这些问题将与永久性中断相同。所有旧代码都将过时。许多科技巨头都在使用它,许多创业公司都在使用它,许多开发人员在个人项目中使用它。到处都是!

什么是Deno?
Deno是一个新的跨平台运行时环境,就像NodeJS一样,它基于Google的V8引擎。它是由NodeJS的创建者Ryan Dahl制作的。它的制作目的与NodeJS相同。
与Node(C ++)不同,它是用Rust编写的,这使它变得更快,更安全。它还具有许多很棒的新功能。

1.TypeScript支持
Deno开箱即用地支持Typescript。您无需设置或配置任何东西。TypeScript是JavaScript的类型化超集,可转换为普通JavaScript。它是由Microsoft开发的。Typescript添加了许多功能,这些功能使扩展JavaScript应用程序变得更加容易,并从一开始就防止将来的错误。

2.ES模块导入语法
Deno使您可以使用ES模块语法从Web导入,就像在浏览器中一样:

import { bgBlue, red, bold } from "https://deno.land/std/colors/mod.ts";

Deno在第一次获取依赖项后会对其进行缓存。因此,现在您甚至不必使用单独的本地文件进行开发。一切都正常。而且可以在项目之间共享缓存的依赖项,因此您可以对正在处理的每个项目使用每个依赖项的一个副本。
这一开关功能可以解决整个node_modules问题,使其速度更快,并帮助Deno使用您在各处使用的标准JavaScript。

3.默认安全
默认情况下,如果您在Deno中运行JavaScript文件,则除了对项目目录的读取权限外,它没有其他权限。您必须对要脚本具有的所有权限明确表示“是”。它甚至没有连接到互联网或本地网络的权限。您可以控制脚本要执行的操作。

NodeJs被杀死?
错误!有一件事情,仍然使Node保持它的年龄。随着时间的流逝,Node获得了很多用户,学习资源和社区支持。另一方面,Deno最近达到了1.0版里程碑。这意味着它的用户群很小,学习资源很少,它本身就将JavaScript社区分为两个部分。
对于Deno,还没有标准的工作流程和开发堆栈。从谷歌和微软这样的技术巨头转向全职工作还有很长的路要走。反过来,这意味着没有与Deno相关的工作,因此,很少有人会尝试学习它。
因此,阻碍Deno成为NodeKiller的主要因素是用户群。

如果您不熟悉JavaScript,则一定要先学习NodeJS。将来,如果Deno仍然被证明是NodeKiller,则可以轻松切换到Deno。您要做的就是放弃整洁的导入语法,并开始对自己的工作负责。