Deno是什么?为什么火?

Deno 是一个安全的运行时,专为执行 JavaScript 和 TypeScript 而设计。这个创新的运行时是在 Node.js 最初发布近 9 年后出现的,是一个非常流行的 JavaScript 运行时。Node.js作为 JavaScript 运行时,使开发人员能够在服务器端使用 JavaScript,这是其广泛采用的关键因素。JavaScript 是一种具有悠久历史的编程语言,是全球使用最广泛的语言。

此外,Node.js 拥有一个充满活力和参与度的社区,提供大量强大的工具和库,如 Express.js 和 Socket.io,可简化 Web 应用程序的创建。此运行时还与实时应用程序和新兴的微服务架构非常吻合,这是当代 Web 开发趋势的特征。从本质上讲,Node.js因其适应性、用户友好性以及社区的坚定支持而广受欢迎。

Deno 1.0 于 2020 年 5 月首次亮相,由 Ryan Dahl 精心制作并赋予生命,他是 Node.js 诞生的幕后推手。虽然 Deno 和 Node.js 有一些相似之处,但它们也表现出鲜明的特征。两者都用作服务器端运行时,在Deno的情况下可以执行TypeScript和JavaScript,在Node.js的情况下也可以执行JavaScript(Node.js确实通过NPM包支持TypeScript,但不是开箱即用的)。将 Deno 和 Node.js 进行比较是不可避免的,因为 Deno 通常被视为 Node.js 的进化继承者。然而,Deno 拥抱现代技术,使其与众不同。

虽然 Node.js 已经巩固了自己的地位,并得到了大公司和初创公司的信任,但 Deno 的存在仍然相对年轻。在撰写本文时,Deno 已经成立三年(截至 2023 年 8 月),并且已经发布了 36 个版本,从 1.0 到 1.36 版本。然而,在成为Node.js的有力竞争者之前,它必须走过一条相当大的道路。

在许多方面,Deno 可以被视为 Node.js 的下一代对手。在深入研究 Deno 的内部运作之前,最好先对其背景有一个基本的了解。我们将探讨一些问题,例如产生 Deno 的驾驶需求、Node.js面临的挑战以及 Deno 如何有效地解决这些缺点。这段旅程从深入研究 Deno 背后的历史和灵感开始。在介绍之后,下一章将深入探讨定义 Deno 的复杂架构。

Deno

Deno 是一个用户友好、现代且高度安全的运行时,专为执行 JavaScript 和 TypeScript 而设计。Deno 的一个特殊品质是它与生俱来的对 TypeScript 的支持,这使得使用这种语言变得毫不费力。Deno 的引擎盖下的东西非常了不起——它是使用 Rust 制作的,Rust 是一种以其性能和安全功能而闻名的尖端系统编程语言。

Deno 执行 JavaScript 背后的驱动力是 Google 高效的 V8 引擎,该引擎以其非凡的速度而闻名。然而,这里有一个转折点:V8 是专门为 JavaScript 量身定制的,这意味着当 Deno 遇到 TypeScript 代码时,它会进行转换。在 V8 发挥其魔力之前,Deno 努力将 TypeScript 代码翻译成 JavaScript。此转换任务由 TSC/SWC 编译器二人组管理。

当涉及到这些编译器时,有一个有趣的对比需要注意。SWC 编译器是用 Rust 编写的,就像 Deno 本身一样,专为快速性能而设计。其基于 Rust 的基础有助于其令人印象深刻的速度。另一方面,我们有使用 JavaScript 构建的 TSC 编译器。虽然它完成了工作,但它不像 SWC 那样灵活,相比之下可能有点迟钝。

Deno 的独特功能

与Node.js相比,Deno 有几个显着的特点。其中许多不同的属性源于上一节中强调的经验教训和问题。这些特性使 Deno 与众不同,并有助于其对 JavaScript 和 TypeScript 运行时环境的创新方法。

Deno 是由 Ryan Dahl(Node.js 的创造者)开发的一款现代的 JavaScript 和 TypeScript 运行时环境,其设计目标是在 Node.js 的基础上改进并引入一些独特的功能和设计理念。以下是 Deno 独特的一些功能:

  1. 安全默认:Deno 从设计上就注重安全性,默认情况下不允许任何文件、网络或环境变量的访问权限,除非通过命令行参数明确授予。
  2. 模块系统:不同于 Node.js 使用的 CommonJS 模块系统,Deno 使用 ES 模块规范,并且可以直接在代码中使用 URL 引入远程模块,这使得模块管理更为简洁且符合浏览器的加载方式。
  3. 内置工具:Deno 集成了很多开发者常用的工具,如类型检查器(TypeScript 编译器)、格式化工具(例如支持 Prettier 格式化)、测试框架等,无需额外安装第三方依赖。
  4. 标准化依赖管理:Deno 不依赖于 package.jsonnpm,而是通过 URL 寻址和锁定文件 (deps.tsimport_map.json) 来管理依赖版本。
  5. V8 和 Rust 构建:底层基于 V8 JavaScript 引擎,同时利用 Rust 语言编写高效稳定的运行时组件和服务端基础设施,提高了性能和安全性。
  6. 异步 I/O:类似于 Node.js,Deno 提供了异步非阻塞 I/O API,但实现细节有所不同,例如它使用 Rust 库 Tokio 提供异步编程能力。
  7. 更好的错误处理和调试:Deno 提供更详尽的错误报告,以及与现代开发工具更好的集成,便于调试。
  8. 标准库丰富:Deno 自带了一套丰富的标准库,包含了许多开发者需要的基础功能,减少对外部模块的依赖。

这些特性使 Deno 成为了一个更加现代化、安全且易于维护的 JavaScript/TypeScript 运行时环境。

版本

https://github.com/denoland/deno/releases/

如何使用

以下是基本的 Deno 使用步骤:

  1. 安装 Deno
  • 在 Windows、macOS 或 Linux 上,您可以访问 Deno 官方网站 获取安装指南。
  • 对于大多数系统,可以通过包管理器或直接下载二进制文件来安装。

例如,在 macOS 或 Linux 中通过 Homebrew 安装:

brew install deno
  1. 运行 Deno 脚本: 打开终端(命令行),然后尝试运行一个简单的 "Hello World" 示例:
deno run https://deno.land/std/examples/welcome.ts

这将会从 Deno 的标准库中下载并执行 welcome.ts 文件。

  1. 本地脚本: 如果您有一个本地 TypeScript 或 JavaScript 文件(例如:app.ts),则可以这样运行:
deno run --allow-net app.ts

注意,由于 Deno 默认的安全策略,对于需要网络权限的脚本,你需要明确添加 --allow-net 参数。

  1. 模块导入: 在 Deno 中,可以直接从 URL 导入模块:
// app.ts
import { serve } from "https://deno.land/std/http/server.ts";

const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}
  1. 类型检查和自动格式化: Deno 集成了 TypeScript 编译器和代码格式化工具,可以在运行时进行类型检查,并且可以根据 .editorconfigdeno.jsonc 文件配置进行自动格式化。

以上是一个简化的入门指南,具体使用时请根据项目需求和 Deno 文档调整参数和配置。

手册:https://docs.deno.com/runtime/manual

github:https://github.com/denoland

文档:https://choubey.gitbook.io/internals-of-deno/

Deno是什么?为什么火?_编译器

Don’t reinvent the wheel, library code is there to help.

文章来源:刘俊涛的博客

若有帮助到您,欢迎点赞、转发、支持,您的支持是对我坚持最好的肯定(_)