Deno 1.11 版本说明
Deno 1.11 已发布,包含以下新功能
- 官方 Docker 镜像
- 可中止的 fetch: 以 Web 兼容的方式中止正在进行的 fetch 请求
- 更多 Web Crypto API 支持:
crypto.subtle.digest
和crypto.randomUUID
支持已加入 deno lint
现已稳定: 代码lint 项目速度比 ESLint 快 100%- BroadcastChannel: 支持在 Web 工作线程之间广播消息的浏览器 API。
TextEncoderStream
和TextDecoderStream
: 用于流式文本的 Web 标准流组合器
如果您已经安装了 Deno,您可以通过运行以下命令升级到 1.11
deno upgrade
如果您是第一次安装 Deno,您可以使用以下方法之一
# Using Shell (macOS and Linux):
curl -fsSL https://deno.land/x/install/install.sh | sh
# Using PowerShell (Windows):
iwr https://deno.land/x/install/install.ps1 -useb | iex
# Using Homebrew (macOS):
brew install deno
# Using Scoop (Windows):
scoop install deno
# Using Chocolatey (Windows):
choco install deno
官方 Docker 镜像
现在 Dockerhub 上提供了 Deno 的官方 Docker 镜像。
- Alpine Linux: denoland/deno:alpine
- Centos: denoland/deno:centos
- Debian: denoland/deno:debian (默认)
- Distroless: denoland/deno:distroless
- Ubuntu: denoland/deno:ubuntu
要启动 deno
repl
$ docker run -it --init denoland/deno:1.11.0 repl
要进入 Docker 运行时
$ docker run -it --init --entrypoint sh denoland/deno:1.11.0
要从您的工作目录运行 main.ts
$ docker run -it --init -p 1993:1993 -v $PWD:/app denoland/deno:1.11.0 run --allow-net /app/main.ts
这里,-p 1993:1993
将容器上的端口 1993 映射到主机上的 1993,-v $PWD:/app
将主机工作目录挂载到容器上的 /app
,并且 --allow-net /app/main.ts
传递给容器上的 deno。
感谢 Andy Hayden 在过去两年中维护 Deno Docker 镜像。
更多 Web Crypto API 支持
此版本标志着我们努力将 Web Crypto API 添加到 Deno 的开始。它将加密原语公开给您的应用程序,这些原语可用于使用加密轻松构建安全系统。自 Deno 1.0 以来,我们一直支持 crypto.getRandomValues()
,但现在我们添加了对哈希和 UUID 生成的支持。
您现在可以使用 sha-256
、sha-384
、sha-512
或 sha-1
算法使用 SubtleCrypto.digest
API 安全地哈希数据,该 API 也在浏览器和 Node.js 中可用。这是一个例子
import { encodeToString } from "https://deno.land/[email protected]/encoding/hex.ts";
const data = new TextEncoder().encode("Deno 1.11 has been released!");
const digest = await crypto.subtle.digest("sha-256", data.buffer);
console.log("Digest:", encodeToString(new Uint8Array(digest)));
此外,我们还添加了对最近标准化的 crypto.randomUUID
函数的支持。它允许您根据 RFC 4122 生成 UUID v4。此功能已在 Node.js 中,并将在下个月底的 Chrome/Edge 92 中发布。
console.log("Random UUID:", crypto.randomUUID());
我们计划在下一个版本 Deno 1.12 中扩展 Web Crypto API,该版本计划于 7 月 13 日 发布。
可中止的 fetch
有时,您可能希望中止正在进行的 fetch
,例如,如果您想在请求在几秒钟后没有响应的情况下超时。此版本添加了使用 AbortSignal
中止 fetch
的支持,AbortSignal
是中止 fetch 的 Web 标准 API。这是一个关于其工作原理的示例
// To get an `AbortSignal`, you must create an `AbortController`. This is used to
// tell the `AbortSignal` when it is time to abort.
const controller = new AbortController();
// Register a timeout to abort the fetch after 5 seconds.
// In a real application you would want to cancel this timeout after the request is done.
setTimeout(() => controller.abort(), 5000);
// Fetch a URL, passing the `signal` property from the created `AbortController`.
// If the abort signal triggers while the request is being sent, or response headers
// are being received, this will reject.
const response = await fetch("https://myslowapi.com/users", {
signal: controller.signal,
});
// Parse the response. Note, that this must also complete before the abort signal
// triggers, otherwise receiving the response will be terminated and `response.json`
// will reject.
const users = await response.json();
请求可以在其生命周期的所有部分被中止,因此在发送标头到服务器、发送主体到服务器、接收回标头或接收回响应主体期间。
deno lint
现已稳定
Deno 附带一个内置的 linter,作为 deno lint
子命令提供。
它最初是在 2020 年 6 月的 v1.1.0
中引入的,但作为一项预防措施,它在使用 deno lint
时需要 --unstable
标志,以表明 linter 仍处于开发的早期阶段,可能存在错误。
在接下来的几个月里,deno_lint
经过了几轮重构,以提高其稳定性,并添加了更多规则以匹配 ESLint 中推荐的规则集。
我们仍然收到反馈,有些用户还不想使用 deno lint
,因为它不稳定。在 v1.10.0
中,我们删除了对 --unstable
标志的要求,今天我们很高兴宣布 deno lint
被认为是稳定的。但是,我们保留更改推荐规则集的权利。
感谢 Yusuke Tanaka 在几个月内贡献了无数 PR 并实施了许多规则。
deno compile
的更新
生成独立的二进制文件是 Deno 问题跟踪器中最受请求的功能,它首次出现在 v1.6
中。
所提供的功能范围有限,其中一个缺少的功能是高度请求的,即在生成的二进制文件中使用动态导入。此版本添加了使用数据 URI 的动态导入支持,这允许从磁盘或远程位置读取源文件并执行它。请记住,从文件系统或远程位置直接导入仍然不受支持。
示例
// some_source_code.js
console.log("Hello Deno!");
const sourceCode = await Deno.readTextFile("./some_source_code.js");
const dataUrl = "data:text/javascript;base64," + btoa(sourceCode);
const c = await import(dataUrl);
console.log(c.default); // Output: "Hello Deno!"
另一个高度请求的独立二进制文件功能是访问运行时编译器 API (Deno.emit()
)。我们很高兴宣布此 API 现在可以在所有生成的二进制文件中使用。
TextEncoderStream 和 TextDecoderStream
此版本添加了对两个现代 Web API 的支持:TextEncoderStream
和 TextDecoderStream
。这些流组合器可以与 ReadableStream
一起使用,以轻松地将流从字节解码为字符串或从字符串解码为字节。
这是一个示例,我们通过 TextDecoderStream
传输 fetch
响应主体流。这将原始字节流转换为字符串片段的字符串。此示例将在新行上将每个片段打印到控制台。
const response = await fetch("https://http2.golang.org/clockstream");
const body = response.body.pipeThrough(new TextDecoderStream());
for await (const chunk of body) {
console.log("!!chunk start!!", chunk, "!!chunk end!!");
}
此外,我们现在还支持标准 TextDecoder
上的 stream
选项。
BroadcastChannel
在此版本中,我们正在 --unstable
下为 BroadcastChannel
试运行支持。BroadcastChannel
可用于在工作线程之间广播包含复杂 JavaScript 对象的消息。目前,这仅限于同一进程中的工作线程,但将来,我们希望允许 BroadcastChannel
在共享源的多个进程之间进行通信(源是您可以传递给 --location
的 URL 的协议、主机名和端口)。
以下是向三名工人广播消息的示例
const c = new BroadcastChannel("foo");
const url = new URL("./worker.js", import.meta.url).href;
for (let i = 0; i < 3; i++) {
const w = new Worker(url, { type: "module" });
await new Promise((resolve) => w.onmessage = resolve); // Wait for ready.
}
c.postMessage({ hello: [1, 2, 3] });
以及worker.js
模块
const c = new BroadcastChannel("foo");
self.postMessage("ready");
c.onmessage = (e) => {
console.log("got message", e.data);
};
有关广播通道的更多详细信息,请访问MDN。
deno lsp
更新
此版本为语言服务器带来了许多新功能
测试代码透镜
LSP 现在为测试提供代码透镜,允许客户端启动执行 IDE 中识别出的特定测试的 Deno CLI。
对于 Visual Studio Code,您需要使用 3.6.0 或更高版本的vscode_deno 扩展才能利用此功能。
支持每个资源的配置
LSP 现在支持作为 LSP 协议一部分的每个资源配置。在 Visual Studio Code 中,这表现为多根工作区,它允许您为不同的文件夹设置特定配置。还可以查看vscode_deno
扩展中的工作区文件夹 文档以获取更多信息。
注册表自动发现
在 Deno 1.10 中,我们添加了对远程注册表的导入完成的支持。以前,您必须手动注册您想要在 LSP 设置中获取完成的远程注册表。在这个版本中,如果 Deno 扩展发现您正在导入的注册表支持注册表导入完成,它将提示您。您可以通过将deno.suggest.imports.autoDiscover
扩展选项设置为false
来选择退出自动发现。
支持格式化 JSON(C) 和 Markdown 文件
除了格式化 JavaScript、JSX、TypeScript 和 TSX 文件之外,LSP 现在还可以格式化 JSON、JSONC 和 Markdown 文件。
X-Deno-Warning
标头作为诊断
显示在提供源代码时,CDN 可以提供X-Deno-Warning
标头,该标头将在首次下载源代码时显示。现在 LSP 可以内联显示这些警告。例如:当使用deno.land/x
时,如果 URL 没有包含版本,则会显示警告。
在 linter 诊断中显示提示
Deno LSP 提供来自内置 linter 的诊断,在这个版本中,它将与诊断一起显示提示。
以前(1.10)
现在(1.11)
@deno-types
和三斜杠引用诊断
显示LSP 现在可以理解// @deno-types
和/// <reference />
注释,并将为这些注释提供诊断。
稳定 API 更新
接下来Deno
API 添加了对使用类型为URL
的参数而不是字符串作为参数的支持,这些参数代表文件路径(方案不为file://
的 URL 将不起作用)。
Deno.chdir
Deno.realPath
Deno.realPathSync
Deno.rename
Deno.renameSync
Deno.symlink
Deno.symlinkSync
Deno.utime
Deno.utimeSync
此更改向后兼容。
TypeScript 4.3
Deno 1.11 附带最新稳定版本的 TypeScript。有关 TypeScript 中新功能的更多信息,请参阅发布 TypeScript 4.3
Web 兼容性和生态系统更新
在每个版本中,我们都在继续努力改进 Deno 中的 API 与 Web 浏览器中的 API 之间的兼容性。
我们正在做的一件事是与 Chrome、Firefox、Safari 和 Servo 等浏览器共享一个测试套件。这个共享的 Web 平台测试套件检查所有浏览器是否都遵守相同的 Web 平台规范,因此您的代码可以在跨引擎移植。
您现在可以在我们的新 Web 平台测试仪表板上查看我们对 Web 兼容性的进展情况,网址为https://wpt.deno.land。它显示了我们在持续集成流程中执行的所有 WPT 的状态。我们还与来自 Chromium 生态系统基础设施团队的 Philip Jägenstedt 合作,在https://wpt.fyi 上获取 Deno 兼容性数据。这将允许比较不同版本的 Deno,或比较 Deno 与其他浏览器引擎。
我们还在努力使 Deno 兼容性数据显示在 MDN 上,这样您就可以直接在 Web API 文档的规范来源上找出 Deno 支持哪些 API。