Deno 1.35:构建 Web 服务器的快速便捷方式
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 标准的 Request 和 Response 对象,以便与 fetch()
、Web 流和其他标准 API 无缝交互。
此外,Deno.serve()
带来了显著的性能优势。在我们的基准测试中,使用 Deno.serve()
构建的 hello-world 服务器吞吐量是类似 Node.js 服务器的两倍,同时具有更好的尾部延迟和更高效的内存使用。
任何使用 node:http
模块的 npm 包都将在底层使用此 API,以享受相同的性能优势。以下是 Node.js 和 Deno 中运行“hello-world” express
服务器的比较
这些基准测试是针对运行 Ubuntu 22.04 的裸机 Intel Xeon E-2378G 2.80Ghz 上的 Node 18.12.1 进行的。
有关此新 API 的更多信息,请参阅Deno.serve() 文档和Deno 手册。
npm 和 Node 兼容性改进
Deno 的 npm 兼容性允许您以最小的供应链风险使用您常用的包。
本月我们对 http
、https
和 zlib
模块的兼容性进行了重大改进。内置 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-js
、google-cloud-node
和各种数据库驱动程序正常工作。如果您发现有无法工作的包,请在 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 标签支持。这样您的编辑器会指出它们需要更新。旧接口计划在 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
已被添加。该模块目前提供 escape
和 unescape
API,用于对给定字符串中的特殊 HTML 字符进行转义/反转义。
import {
escape,
unescape,
} from "https://deno.land/std@0.193.0/html/entities.ts`";
escape("<html>"); // => "<html>"
unescape("<html>"); // => "<html>"
escape
默认转义 5 个字符:&
, <
, >
, "
和 '
。unescape
默认处理这 5 个字符,再加上 '
,
,以及十进制和十六进制 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 框架的最新版本。