学习Deno并超越Node.js

学习Deno并超越Node.js

尽管Node.js仍然是使用最多的服务器端JavaScript运行时,但像Deno和Bun这样的替代运行时已经获得了关注,因为它们试图改进Node.js的概念。

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

在这篇文章中,你将探索Deno的基础知识,了解它与Node.js和Bun的比较,并跟随一个实践演示,使用Deno来构建一个简单的HTTP网络服务器。

  1. 什么是Deno?
  2. Deno是做什么的?
  3. Deno vs Node
  4. Deno vs Bun
  5. 开始使用Deno

什么是Deno?

随着开发人员对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还提供了一个脚本托管服务,以便更容易访问。
  • 遵守网络标准 – Deno旨在遵循与浏览器相同的API,这意味着为浏览器编写的代码可以很容易地转换到运行时。

大公司和主要的行业参与者,如SlackNetlifySupabase已经采用了Deno,但它在网络开发者中的采用却不那么广泛。根据2022年Stack Overflow的调查,只有1.47%的专业开发人员在使用Deno,而46.31%的人表示在使用Node.js。

Deno是做什么的?

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

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

你也可以用Deno来完成较低级别的编程任务,比如建立一个命令行工具,通过终端管理你的待办事项。换句话说,你可以用Deno来实现与使用Python或Ruby等语言相同的目标。

Deno vs Node

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

对于从事服务器端JavaScript项目的团队来说,Deno已经成为Node的一个可行的替代品。虽然它们相似的功能让一些开发者相信Deno可以取代Node.js,但这种可能性是不可能的,有几个关键原因。

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

相比之下,Deno是新的:1.0版本是在2020年5月发布的,所以相对来说,很少有开发者有时间去玩它。学习一个新工具会延长开发时间。此外,目前还不清楚Deno是否会给许多简单的项目带来重大好处。

但是,如果你正在构建一个安全至关重要的领域的应用程序,如金融,Deno的安全功能可能会使你值得转换。

Deno vs Bun

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

Bun还拥有快得惊人的性能,超过了Node.js和Deno。主要特点是实现了这些能力:

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

Bun是如此之新,在帮助解决故障方面的社区支持也相对较少。尽管如此,Bun对于实验来说还是很有趣的。那些特别需要提升性能的团队可能会发现Bun对他们的项目很有用,但网络开发经常优先考虑性能以外的因素。

开始使用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/std@0.177.0/http/server.ts";
serve((_req) => new Response("Hello from the server!"), { port: 8000 });

该代码使用了存储在Deno.land官方网站上的server.ts Deno库中的 serve 函数。这段代码还为传入的请求提供了一个 serve 函数处理程序。处理程序函数对每个请求的回应是:”Hello from the server!”

该 serve 函数还接受可选参数,例如你想要服务的端口号。这里,代码示例使用这些参数在8000端口提供服务。

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

运行中的Deno服务器

运行中的Deno服务器

如果你想把服务器扩展成一个完整的API,你可能需要添加数据库连接。这很容易做到,因为Deno社区已经创建了支持MariaDB/MySQLPostgreSQLMongoDB等流行数据库的驱动程序。

小结

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

Node.js对大多数项目来说都很好用。它有一个庞大的生态系统和一个庞大的社区,可以帮助解决各种各样的故障情况。

Deno的好处是具有额外的安全性和更好的开发者体验。同时,它最适合有经验的团队使用,这样它的好处就超过了学习一个不熟悉的运行时的时间和人力成本。

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

总而言之,Deno在Node.js的优点和Bun的实验性可能性之间提供了平衡。虽然Node.js对大多数项目来说是一个可行的选择,但Deno可能会成为网络开发未来发展的前沿。

评论留言