面向 JavaScript 初学者的 Deno
什么是 JavaScript 引擎?
什么是 JavaScript 运行时环境?
为什么我们需要浏览器之外的运行时?
NodeJS 有什么问题?
Deno 是什么?
假设您正在尝试学习 JavaScript。您刚刚在浏览器中熟练掌握了 JavaScript。然后突然间,您遇到了Deno和 #NodeKiller 的炒作。但您不知道这些是什么。如果是这样,请继续阅读!
在深入研究之前,您需要一些背景信息。
什么是 JavaScript 引擎?
你可能知道,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 的技术栈(例如MEAN或MERN )构建整个 Web 应用程序(从 UI 到数据层) 。
NodeJS 有什么问题?
NodeJS 的创始人 Ryan Dahl 表示,NodeJS 有一些地方做得不对。他在 JSConf EU 2018 上就此做了一个演讲。
不遵守承诺
NodeJS 其实原生支持 Promise,但几个月后就被移除了。因此,NodeJS 不得不使用变通方法来实现 Promise。
安全
V8 本身是一个非常好的安全沙箱。NodeJS 移除了所有这些安全功能,并让应用程序可以访问所有内容。
构建系统
我不完全理解这一点,所以不要引用我的话。
Chrome 最初使用GYP作为构建系统,NodeJS 也随之切换。但后来 Chrome 放弃了 GYP,转而采用GN作为构建系统,因为它速度更快、更简洁。据 Ryan Dahl 所说,继续使用 GYP 可能是 NodeJS 核心最大的败笔。
npm 和 package.json
所有 npm 包都包含一个文件,通常位于项目根目录中,名为package.json - 该文件包含与项目相关的各种元数据。
什么是 npm
npm 或 Node Package Manager,顾名思义,用于管理项目中的依赖包,使您的生活更轻松。
听起来很棒!这有什么问题吗?
package.json 文件包含一些不必要的信息,这些信息只有 npm 注册表才需要。Ryan 将其描述为“样板噪音”,因为它除了给项目带来噪音之外,没有任何实际作用。
npm 是中心化且私有控制的。如果你在浏览器中做过一些项目,你就会知道如何链接到依赖项。类似于 JQuery、Bootstrap 等。你可以在 HTML 中添加任何链接,然后直接使用。在 Node 中,你无法从 npm 以外的任何地方安装依赖项。
require(“module”) 不带扩展名“.js”
这是导入外部库的方式,但不够具体。例如,如果你想在项目中安装 JQuery,你需要先使用 npm 的 install 命令将其安装到项目文件夹中。
npm install jquery
然后,如果您想在文件中使用它,您需要在要使用 JQuery 的文件中添加“require()”语句。
require("JQuery")
// code that uses JQuery
这怎么会是个问题呢?看起来挺棒的!
是的,但是要使这种简洁的语法发挥作用,所需的算法非常复杂且效率低下。模块加载器必须在多个位置查询文件系统,试图猜测用户的意图。
节点模块
这是使用简洁的语法导入模块的后果。
当您在项目中安装依赖项时,它们会被下载到“node_modules”文件夹中。
这样就更简洁了!我可以离线使用它们!这有问题吗?
问题在于,你安装的依赖项本身就存在依赖关系,并且每个依赖项都存在相同的依赖关系。依赖关系树会变得非常庞大,难以管理和存储。而且你必须为每个项目都执行同样的操作,而这些项目可能大多使用相同的依赖项。项目之间无法共享依赖项。
假设您想创建两个不同的项目,但它们都使用 JQuery,您可以下载“JQuery.js”文件并将其保存在一个共享文件夹中,以便两个项目都可以链接到该文件。当您准备发布项目时,只需将链接更改为远程文件并发布即可。您甚至可以将本地文件重用于未来的任何项目。这在 Node 中是无法实现的。
如果这件事引发了网络热议,那你就知道事情很严重。这是演示文稿中的一张幻灯片。
index.js
与“index.html”类似,如果未指定“index.js”文件,NodeJS 会查找该文件。这完全没有必要,也增加了模块加载系统的复杂性。在“require()”支持 package.json 之后,这种做法就变得尤为不必要了。
他们为什么不解决这些问题?
目前,所有这些问题都是 NodeJS 的核心特性,试图修复它们就意味着创建一个全新的东西。而且使用 NodeJS 的代码如此之多,修复这些问题就如同彻底停电。所有旧代码都会被淘汰。许多科技巨头都在使用它,许多初创公司也在使用它,许多开发者也在使用它来开发个人项目。它无处不在!
那他们为什么不创造一个全新的东西呢?
对此,我想说:
除非你知道你可以得到它,否则你不会要求它。
NodeJS 于 2009 年问世,是网络史上最伟大的发明。
是的,他们确实创造了一个全新的东西......Deno。
Deno 是什么?
Deno 是一个全新的跨平台运行时环境,与 NodeJS 类似,基于 Google 的 V8 引擎。它由 NodeJS 的创始人 Ryan Dahl 开发,其目标也与 NodeJS 相同。
如果它就像 NodeJS,那它有什么新东西?
与 Node(C++)不同,它是用 Rust 编写的,这使得它速度更快、更安全。它还拥有许多很酷的新功能。
TypeScript 支持
Deno 开箱即用地支持Typescript。您无需进行任何设置或配置。
什么是 TypeScript?
TypeScript 是 JavaScript 的类型化超集,可以转换为纯 JavaScript。它由微软开发。TypeScript 增加了许多功能,使 JavaScript 应用的扩展更加轻松,并从一开始就避免了未来可能出现的 bug。
你无需为此学习一门全新的语言。任何 JavaScript 代码都是有效的 TypeScript 代码,但反过来则不然。TypeScript 可以转换为简洁、干净的 JavaScript 代码,并可在支持 ECMAScript 3(或更高版本)的任何 JavaScript 引擎上运行。
你给我扔了这么多脚本。ECMAScript 是什么?
现在,将 ECMAScript 视为 JavaScript 的版本。您可以在此处找到更多信息。
ES 模块导入语法
Deno 允许您使用 ES 模块语法从 Web 导入,就像在浏览器中一样。
import { bgBlue, red, bold } from "https://deno.land/std/colors/mod.ts";
那么离线使用情况如何?
Deno 在首次获取依赖项后会缓存它们。所以现在你甚至无需使用单独的本地文件进行开发。一切正常。而且,缓存的依赖项可以在项目之间共享,因此你正在处理的每个项目都使用每个依赖项的一个副本。
这个开关解决了整个 node_modules 问题,使其更快,并帮助 Deno 使用您在任何地方使用的标准 JavaScript。
默认安全
默认情况下,如果你在 Deno 中运行 JavaScript 文件,它除了项目目录的读取权限外没有其他权限。你必须明确地授予脚本所需的所有权限。它甚至没有连接到互联网或本地网络的权限。你可以控制脚本的操作。
就这些?你就这些?
大部分改动都发生在底层。运行时本身变得更快,遵循浏览器标准,无需使用自定义 API,摆脱了 npm 及其带来的所有功能。剥离了所有不必要的变通方法,只为你提供一个极简的运行时环境,让你轻松完成工作。
节点刚刚被摧毁了,对吗?
错了!有一件事让 Node 仍然停滞不前……年龄。随着时间的推移,Node 积累了大量用户、学习资源和社区支持。而 Deno 最近刚刚达到 1.0 版本的里程碑。这意味着它的用户群非常小,学习资源也不多,并且本身就将 JavaScript 社区分裂成了两派。
Deno 目前还没有标准的工作流程和开发栈。而且,像谷歌和微软这样的科技巨头要想完全转向 Deno 还有很长的路要走。这意味着目前还没有与 Deno 相关的工作机会,因此,很少有人会尝试学习 Deno。
因此,阻碍 Deno 成为 #NodeKiller 的主要因素是用户群。
那么我应该尝试一下吗?
试试看?好的!要全力以赴吗?还没!
如果您是 JavaScript 新手,绝对应该先学习 NodeJS。如果将来 Deno 仍然被证明是 #NodeKiller,您可以轻松切换到 Deno。您只需抛弃简洁的 import 语法,开始对自己所做的事情负责即可。
文章来源:https://dev.to/maximousblk/deno-for-javascript-beginners-4dnf