跳至主要内容
Deno 2 终于来了 🎉️
了解更多
Deno 1.35

Deno 1.35:构建 Web 服务器的快速便捷方式

Deno 的愿景是让编程尽可能简单,这就是为什么运行时附带了 强大的工具链原生 TypeScript 支持Web 标准 API,这样您就可以跳过配置和学习新的 API 集,并立即提高效率。

今天的次要版本发布让我们更接近这个愿景

除了上述功能外,此版本还包括许多其他改进和错误修复



Deno.serve() 现在已稳定

备受期待的新 Web 服务器 API,Deno.serve() 现在已稳定。它提供了一个更简单的 API,同时显著提高了性能。

Deno.serve() 允许开发人员使用一行代码设置 Web 服务器

Deno.serve((req) => new Response("hello world"));

与早期的 API,Deno.serveHttp() 相比,后者需要设置连接上的异步迭代器,以及随后的 HTTP 事件处理(在异步 IIFE 中)

async function handleHttp(conn: Deno.Conn) {
  (async () => {
    for await (const r of Deno.serveHttp(conn)) {
      r.respondWith(new Response("Hello World"));
    }
  });
}

for await (const conn of Deno.listen({ port: 8000 })) {
  handleHttp(conn);
}

Deno.serve() 使用 Web 标准 RequestResponse 对象,以便与 fetch()、Web 流和其他标准 API 无缝交互。

此外,Deno.serve() 提供了切实的性能优势。在我们的基准测试中,使用 Deno.serve() 构建的 hello-world 服务器的吞吐量是类似的 Node.js 服务器的两倍,尾部延迟更低,内存使用效率更高。

Deno 1.35.0 vs Node 18.12.1 HTTP performance

任何使用 node:http 模块的 npm 包都将在后台使用此 API,以享受相同的性能优势。以下是对 Node.js 和 Deno 中运行“hello-world”express 服务器的比较

Deno 1.35.0 vs Node 18.12.1 express performance

这些基准测试是在运行 Ubuntu 22.04 的裸机 Intel Xeon E-2378G(2.80Ghz)上针对 Node 18.12.1 进行的。


有关此新 API 的更多信息,请参阅 Deno.serve() 文档Deno 手册

对 npm 和 Node 兼容性的改进

Deno 的 npm 兼容性允许您使用您喜欢的软件包 在供应链风险最小的情况下

本月,我们在 httphttpszlib 模块的兼容性方面取得了重大改进。内置 Node.js 模块的完整更改列表包括

  • fs.FileHandle
  • http.ClientRequest.upgrade
  • http.IncomingMessageForClient.complete
  • http2
  • https.createServer
  • process.reallyExit
  • v8.setFlagsFromString
  • zlib.brotliCompress
  • zlib.brotliCompressSync
  • zlib.brotliDecompress
  • zlib.brotliDecompressSync
  • zlib.createBrotliCompress
  • zlib.createBrotliDecompress

每个版本都增加了对更多 npm 包的支持。以下是一些备受期待的包,由于对之前提到的 API 的改进,它们现在可以与 Deno 协同工作

下个月,我们将重点关注 @grpc/grpc-jsgoogle-cloud-node 和各种 DB 驱动程序的实现。如果您发现某个包无法正常工作,请在 denoland/deno 存储库 中报告问题。

Deno API 更改

以下 API 已添加到 Deno 命名空间

  • Deno.AtomicOperation
  • Deno.errors.FilesystemLoop
  • Deno.errors.IsADirectory
  • Deno.errors.NetworkUnreachable
  • Deno.errors.NotADirectory
  • Deno.InspectOptions.breakLength
  • Deno.InspectOptions.escapeSequences
  • Deno.KV.enqueue

此外,这些 API 不再需要 --unstable 标志

  • Deno.ConnectTlsOptions.alpnProtocols
  • Deno.ListenTlsOptions.alpnProtocols
  • Deno.serve
  • Deno.StartTlsOptions.alpnProtocols

您可以通过访问 API 参考 来详细了解这些 API。

Web API 更改

此版本带来了对 Headers.getSetCookie()ReadableStream.from() API 的支持,而 URLSearchParams.delete()URLSearchParams.has() 现在支持 value 参数。

语言服务器改进

此版本通过修复 npm 包和导入映射的自动导入长期存在的问题,为 LSP 带来了巨大的生活质量改进。

npm: 说明符的自动完成现在可以正常工作

导入映射说明符的自动完成也是如此

对标准库的更改

semver 的重写

在此版本中,标准库的 semver 模块已从头开始重写,以减少内部复杂性并清理公共接口。该模块最初是 npm:semver 的移植,但它具有许多不希望有的特性,例如:有状态的 SemVer 类或过度加载的 API。

在此版本中,每个 semver 实例都成为一个不可变的纯 JavaScript 对象。现在大多数 API 只接受一组输入类型。旧接口通过 @deprecated JSDoc 标记来支持。这样,您的编辑器就会指出需要更新的内容。计划在 [email protected] 中删除旧接口。

import { lte, parse } from "https://deno.land/[email protected]/semver/mod.ts";

lte(parse("1.2.3"), parse("1.2.4"));

lte("1.2.3", "1.2.4"); // This is deprecated now

感谢 Justin ChaseJesse JacksonMax DuvalAsher GomezTim Reichen 为此更改做出贡献。

添加 html/entities

在此版本中,添加了新的标准模块 html。该模块目前具有 escapeunescape API,它们对给定字符串中的特殊 HTML 字符进行转义/反转义。

import {
  escape,
  unescape,
} from "https://deno.land/[email protected]/html/entities.ts`";

escape("<html>"); // => "&lt;html&gt;"
unescape("&lt;html&gt;"); // =>  "<html>"

escape 默认情况下会转义 5 个字符,分别是 &<>"'unescape 默认情况下会处理这 5 个字符,以及 &apos;&nbsp; 和十进制和十六进制 HTML 实体。此外,还可以选择启用处理所有已知的 HTML 实体。有关更多详细信息,请参阅 模块文档

感谢 Lionel Rowe 为此功能做出贡献。

添加 http/user_agent

在此版本中添加了 http/user_agent。该模块根据给定的 用户代理 字符串检测操作系统、CPU、设备和浏览器类型。该模块的设计灵感很大程度上来自 npm:ua-parser-js

import { UserAgent } from "https://deno.land/[email protected]/http/user_agent.ts";

const ua = new UserAgent(
  "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
);

console.log(ua.os); // => { name: "Linux", version: "x86_64" }
console.log(ua.cpu); // => { architecture: "amd64" }
console.log(ua.engine); // => { name: "Blink", version: "51.0.2704.103" }
console.log(ua.browser); // => { name: "Chrome", version: "51.0.2704.103", major: "51" }

感谢 Kitson Kelly 为此功能做出贡献。

V8 11.6 和 TypeScript 5.1.6

最后,Deno v1.35 附带了 V8 11.6 和 TypeScript 5.1.6




查看 Fresh 1.2,这是我们下一代 Web 框架的最新版本。