学习 Deno 并超越 Node.js

已发表: 2023-04-20

尽管 Node.js 仍然是最常用的服务器端 JavaScript 运行时,并且遥遥领先,但像 Deno 和 Bun 这样的替代运行时在尝试改进 Node.js 概念时已经引起了人们的关注。

Deno 是两个较新的运行时中更受欢迎的一个,它解决了 Node.js 中固有的一些安全问题,并为 TypeScript 和 WebAssembly 等技术提供了更全面的支持。

在本文中,您将探索 Deno 基础知识,了解它与 Node.js 和 Bun 的比较,并遵循使用 Deno 构建简单 HTTP Web 服务器的动手演示。

什么是德诺?

随着开发人员对 JavaScript 的熟悉,他们看到了它在本地机器上编程的潜力。 因此,他们创建了服务器端运行时——无需使用浏览器即可在机器上执行 JavaScript 代码的环境。

Ryan Dahl 为此目的开发了 Node.js,后来创建了 Deno 来解决他在原始 Node.js 设计中遇到的一些问题。 一些值得注意的缺陷包括它依赖于像 npm 这样的集中式包管理器、缺少标准库以及默认的松散安全设置。

Deno 的一些主要优势包括:

  • 默认安全——用户必须明确授予代码访问网络、文件系统或环境的权限。
  • 内置对 TypeScript 和 WebAssembly 的支持——在 Deno 中运行 TypeScript 和 WebAssembly 程序就像运行 JavaScript 程序一样简单。 运行时编译语言就像编译 JavaScript 一样。
  • 去中心化的包管理器——Deno 可以直接从 URL 导入代码,而不是依赖像 npm 或 Bun 的包管理器这样的包存储库。 此功能意味着您可以从托管它们的任何地方加载依赖项,包括您的 GitHub 存储库、服务器或 CDN。 Deno 还提供脚本托管服务,以便更轻松地访问。
  • 符合 Web 标准——Deno 的目标是遵循与浏览器相同的 API,这意味着为浏览器编写的代码可以轻松转换为运行时。

Slack、Netlify 和 Supabase 等大公司和主要行业参与者已经采用了 Deno,但它在 Web 开发人员中的采用并不那么广泛。 根据 2022 Stack Overflow 调查,只有 1.47% 的受访专业开发人员使用 Deno,而 46.31% 的人表示使用 Node.js。

Deno 会成为 Web 开发的未来吗? 发现它的好处,看看它如何与 Node.js 和 Bun 相提并论,并尝试动手演示 - 所有内容都在本指南中! 点击鸣叫

Deno 做什么?

与任何 JavaScript 运行时一样,Deno 使开发人员能够在服务器端运行 JavaScript。 因此,您可以使用 Deno 完成各种各样的编程任务。

Deno 在诸如开发响应基于 Web 的用户请求的服务器应用程序等任务中最为出色。 例如,如果您正在创建一个在线书店,您可以使用 Deno 构建一个应用程序,该应用程序从 PostgreSQL 数据库获取信息,构建用户想要查看的页面,并将其发送到浏览器进行渲染。

您还可以将 Deno 用于较低级别的编程任务,例如构建命令行工具以通过终端管理您的待办任务。 换句话说,您可以使用 Deno 实现与使用 Python 或 Ruby 等语言实现的目标相同的目标。

Deno 与节点

Deno 的目标是改进 Node.js,它在几个关键领域实现了这一承诺。 Deno 通过为不同的代码模块启用更细粒度的访问配置来提高安全性。 它还关注 Web 标准 API 合规性,这使开发人员能够在浏览器和服务器端使用相同的代码。

对于从事服务器端 JavaScript 项目的团队来说,Deno 已成为 Node.js 的可行替代方案。 尽管它们相似的功能让一些开发人员相信 Deno 可以取代 Node.js,但由于几个关键原因,这种可能性不大。

Node.js 是最流行的 JavaScript 运行时,它积累了一个庞大的预写包生态系统和一个庞大、活跃的用户社区。 这些宝贵的资源帮助 Node.js 保持极具吸引力的运行时。

相比之下,Deno 是新的:1.0 版本于 2020 年 5 月发布,因此相对较少的开发人员有时间使用它。 学习新工具会延长开发时间。 此外,尚不清楚 Deno 是否会给许多简单的项目带来显着的好处。

但是,如果您在安全性至关重要的领域构建应用程序,例如金融,Deno 的安全功能可能值得进行转换。

德诺 vs 包子

前 Stripe 工程师 Jarred Sumner 于 2022 年 7 月首次发布 Bun 进行 Beta 测试。 Bun 是一个比 Deno 更具实验性的运行时,并且与 Deno 不同,Bun 旨在与 Node.js 具有广泛的向后兼容性。

Bun 还拥有超快的性能,超越了 Node.js 和 Deno。 关键特性支持以下功能:

  • 更好的引擎——Bun 使用更快、更高效的 JavaScriptCore 作为其底层 JavaScript 引擎,而不是 Google 的 V8 JavaScript 和 Web Assembly 引擎。
  • 更多的代码控制——Bun 是用 Zig 编写的,Zig 是一种低级语言,比 JavaScript 对代码执行提供更大的控制。
  • 微调效率——Bun 团队在开发过程中优先考虑性能分析、基准测试和优化,以确保代码效率。

Bun 太新了,很少有社区支持来帮助解决问题。 尽管如此,Bun 对于实验来说还是很有趣的。 特别需要性能提升的团队可能会发现 Bun 对他们的项目很有用,但 Web 开发通常会优先考虑性能以外的因素。

开始使用 Deno

现在您已经了解了一些关于 Deno 的知识以及它与其他流行的 JavaScript 运行时的比较,是时候看看它是如何工作的了。 在本节中,您将学习如何在 Deno 中创建一个简单的服务器,该服务器以“Hello from the server!”响应 HTTP 请求。

安装 Deno

您可以使用官方文档中的这些安装说明将 Deno 作为二进制可执行文件安装在机器上。 例如,在 macOS 上,您可以使用命令brew install deno安装 Deno。

开始使用 Deno 的另一种方法是将其安装为 npm 包,如下所示:

为您的项目创建一个文件夹(也许是 deno_example )并在其中运行命令npm init 。 (您可以接受init在创建基本package.json文件时建议的所有默认选项。)

初始化应用程序后,运行npm install deno-bin以安装 Deno 二进制包。 现在您可以更新package.json文件以使用npm start启动应用程序。 将下面的粗体行添加到默认 package.json 文件中的“scripts”对象属性:

 "scripts": { "start": "deno run --allow-net app.ts", "test": "echo \"Error: no test specified\" && exit 1" },

此脚本添加使 Deno 能够以网络权限 ( --allow-net ) 运行 app.ts 模块。 请记住,在使用 Deno 时,您需要明确允许访问网络或文件系统。

现在,您已准备好创建app.ts模块,负责侦听端口并为用户请求提供服务。

创建 App.ts 模块

在 Deno 中创建基本服务器非常简单。 首先,创建一个app.ts文件并粘贴以下代码:

 import { serve } from "https://deno.land/[email protected]/http/server.ts"; serve((_req) => new Response("Hello from the server!"), { port: 8000 });

该代码使用存储在 Deno.land 官方网站上的server.ts Deno library中的serve函数。 此代码还为传入请求提供serve函数处理程序。 处理函数以“Hello from the server!”响应每个请求。

serve函数还采用可选参数,例如您要提供服务的端口号。 此处,代码示例使用这些参数在端口 8000 上提供服务。

接下来,通过运行npm start启动服务器。 这应该启动一个服务器来监听localhost:8000并用问候语响应请求。

Deno 服务器在运行
Deno 服务器在运行

如果您想将服务器扩展为成熟的 API,您可能需要添加数据库连接。 这很容易做到,因为 Deno 社区已经创建了支持 MariaDB/MySQL、PostgreSQL、MongoDB 等流行数据库的驱动程序。

Deno 提供额外的安全性和更好的开发体验,但它适合您吗? 深入阅读本指南,了解它与 Node.js 和 Bun 的比较

概括

运行时范围从普通和可靠到非常实验性。 为您的项目选择合适的一个取决于您的项目以及您希望运行时如何帮助您实现目标。

Node.js 适用于大多数项目。 它拥有庞大的生态系统和庞大的社区,可以帮助解决各种故障排除场景。

Deno 具有额外的安全性和更好的开发人员体验。 同时,它最适合有经验的团队,因此它的好处超过了学习不熟悉的运行时所花费的时间和人力成本。

最后,虽然 Bun 对于大多数专业项目来说过于实验性,但它是一个独特而有趣的运行时,可以用于个人项目或扩展。

总而言之,Deno 在 Node.js 的优势和 Bun 的实验可能性之间取得了平衡。 虽然 Node.js 是大多数项目的实用选择,但 Deno 可能处于未来 Web 开发发展方式的最前沿。

同时,通过注册 Kinsta 的 Application Hosting Hobby Tier 来练习您的 Deno 技能——现在编码,以后扩展。