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

今天发布的版本使我们更接近这一愿景:

  • 一种快速便捷的方法构建 Web 服务器,Deno.serve() 现在已经稳定了
  • 通过改进 NPM 支持使备受期待的包能够被使用

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

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 标准请求和响应对象,与 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

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

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

改进了 npm 和 Node 点兼容性

Deno 的 npm 兼容性允许您以最小的供应链风险使用您的首选软件包。

本月,我们对 http, httpszlib 模块的兼容性进行了重大改进。内置 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 以及各种数据库驱动程序正常工作。如果发现包不起作用,请在 denoland/deno 存储库中报告问题。

Deno 接口更改

以下 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 参数。

LSP 改进

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

npm: 说明符的自动完成功能现在已经可以正常工作了:

import maps 说明符的自动完成也是如此:

对标准库的更改

重写 semver

在此版本中,semver 标准库的模块已被从头开始重写,以降低内部复杂性并清理公共接口。该模块最初是作为 npm:semver 的移植开始的,但它有很多不需要的特性,例如有状态的 SemVer 类和过度重载的 API。

在此版本中,每个 semver 实例都变成了一个不可变的纯 JavaScript 对象。大多数 API 现在只接受一组输入类型。JSDoc 标记 @deprecated 以支持旧接口。这样,您的编辑器将指出它们需要更新。计划在 std@0.200.0 中删除旧接口。

import { lte, parse } from "https://deno.land/std@0.193.0/semver/mod.ts";
  
lte(parse("1.2.3"), parse("1.2.4"));

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

感谢Justin Chase,Jesse Jackson,Max Duval,Asher Gomez,Tim Reichen为这一变化做出了贡献。

添加 html/entities

在此版本中,添加了新的标准模块 html 。该模块当前具有 escapeunescape API,用于转义/取消转义给定字符串中的特殊 HTML 字符。

import {
    escape,
    unescape,
  } from "https://deno.land/std@0.193.0/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/std@0.193.0/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 框架的最新版本。