Deno 1.14 发布说明
Deno 1.14 已标记并发布,包含以下特性和更改
- Web Crypto API 增补
deno lint
和deno fmt
的自定义选项- URLPattern
- 原生服务端 WebSocket API 稳定化
- Worker 之间零拷贝 ArrayBuffer 传输
- 文件锁定 API
- 操作系统信号 API 的更改
fetch
中的双向 TLS 支持DENO_AUTH_TOKENS
中的基本认证支持- URL 解析速度现在提升了 3 倍
- 现在可以为子进程指定
gid
和uid
- 更快的
std/http
模块 - VSCode 扩展更新
- TypeScript 4.4
- V8 9.4
如果您已经安装了 Deno,可以通过运行以下命令升级到 1.14
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
新特性
Web Crypto API 增补
此版本引入了许多新的 Web Crypto API
crypto.subtle.exportKey()
:- HMAC 密钥现在可以以 JWK 和“raw”格式导出。
- RSA 密钥现在可以以 pkcs#8 格式导出。
crypto.subtle.importKey()
:- HMAC 密钥现在可以以 JWK 和“raw”格式导入。
- RSA 密钥现在可以以 pkcs#8 格式导入。
- PBKDF2 密钥现在可以以“raw”格式导入。
crypto.subtle.generateKey()
:- 现在支持生成 RSA-OAEP 密钥。
- 现在支持生成 ECDH 密钥。
- 现在支持生成 AES 密钥。
crypto.subtle.deriveBits()
:- 现在支持 PBKDF2 派生。
- 现在支持 HKDF 派生。
crypto.subtle.verify()
:- 现在支持 ECDSA 签名验证。
crypto.subtle.encrypt()
:- 现在支持 RSA-OAEP 加密。
crypto.subtle.decrypt()
:- 现在支持 RSA-OAEP 解密。
我们正持续努力改进 Web Crypto API。我们希望能在今年年底前完成所有 API。您可以订阅此跟踪问题以获取进度通知。
感谢 Divy Srivastava 在 Deno 中 Web Crypto 实现方面所做的重要工作。
deno lint
和 deno fmt
的自定义选项
Deno 过去曾拒绝 deno lint
和 deno fmt
的可配置性。我们相信生态系统受益于规范的代码样式和 linting 规则。在过去一年中,我们收到了许多用户的请求,希望能调整 deno lint
和 deno fmt
使用的选项,以满足特定、合理的需求。此版本允许配置 deno lint
和 deno fmt
。
我们仍然建议大多数用户使用默认选项。这些选项适用于大多数团队和项目。默认情况下,deno lint
将启用所有推荐的 lint 规则运行。
现在可以使用 --rules-exclude
、--rules-include
和 --rules-tags
来排除规则,或者包含不在推荐
集中的特定规则(例如 ban-untagged-todo
)。
deno fmt
的样式规则基于 prettier。只有五个选项可以用于调整样式规则
--options-indent-width
(默认值:2)- 用于缩进的空格数。--options-line-width
(默认值:80)- 最大行宽。--options-prose-wrap
(默认值:always)- 散文换行设置。--options-single-quote
(默认值:false)- 是否使用单引号。--options-use-tabs
(默认值:false)- 是否使用制表符代替空格进行缩进。
这些选项现在也可以在 --config
指定的文件中配置。我们设计这个标志的目的是让同一个文件可以与 deno run --config
、deno fmt --config
和 deno lint --config
一起使用。也就是说,我们正在扩展 tsconfig.json
文件。
之前
{
"compilerOptions": {
"allowJs": true,
"lib": ["deno.window"],
"strict": true
}
}
之后
{
"compilerOptions": {
"allowJs": true,
"lib": ["deno.window"],
"strict": true
},
"lint": {
"files": {
"include": ["src/"],
"exclude": ["src/testdata/"]
},
"rules": {
"tags": ["recommended"],
"include": ["ban-untagged-todo"],
"exclude": ["no-unused-vars"]
}
},
"fmt": {
"files": {
"include": ["src/"],
"exclude": ["src/testdata/"]
},
"options": {
"useTabs": true,
"lineWidth": 80,
"indentWidth": 4,
"singleQuote": true,
"proseWrap": "preserve"
}
}
}
我们计划在未来的版本中,允许在配置文件中指定更多现有标志,并提供配置文件的自动发现,从而进一步改善使用 Deno 的体验。在 1.14 版本中,您必须手动指定配置文件,没有自动检测功能。
请注意,现在使用配置文件不是必需的,将来也不会是必需的。Deno 仍然在默认选项和没有配置文件的情况下表现最佳。配置文件中指定的所有选项也可以通过命令行标志设置(例如 deno fmt
的 --options-use-tabs
)。使用配置文件应被视为“按需”功能,而不是用户在设置项目时首先要做的。
有关配置文件中允许选项的详细说明,请参阅手册页或JSON Schema 文件。
VSCode 扩展通过 deno.config
设置内置支持此文件。
URLPattern
此版本引入了一个新的不稳定的 Web 平台 API,用于将 URL 与模式进行匹配。URLPattern
是流行库 path-to-regexp
的内置替代方案。
模式语法与 path-to-regexp
非常相似。URLPattern
的独特之处在于它不仅能匹配路径,还能单独匹配 URL 的每个部分(协议、主机名、路径名、查询字符串、哈希等)。
const pattern = new URLPattern({ pathname: "/books/:id" });
console.log(pattern.test("https://example.com/books/123")); // true
console.log(pattern.test("https://example.com/books/123/456")); // false
console.log(pattern.test("https://example.com/books")); // false
console.log(pattern.exec("https://example.com/books/123").pathname); // { input: "/books/123", groups: { id: "123" } }
此 API 不稳定(需要 --unstable
才能使用),但在稳定化之前不太可能发生重大变化。除非出现新的阻碍,否则我们将在 Deno 1.15 中稳定此 API,与 Chrome 95 中的稳定化同步。
详细文档将在几天内于 MDN 上提供。您可以在此处查看 MDN 文档的预览。
感谢 Jake Archibald 提出了最初的 API 提案,感谢 Ben Kelly 负责规范工作,以及感谢 @crowlKats 在 Deno 中的实现。
原生服务端 WebSocket API 的稳定化
原生服务端 WebSocket 支持已在 Deno 1.12 中添加,但当时只在 --unstable
标志后可用。
在实际测试 API 并获得用户反馈后,Deno.upgradeWebSocket()
API 已在 1.14 中稳定化,不再需要 --unstable
标志。
Worker 之间零拷贝 ArrayBuffer 传输
此版本引入了在 worker 之间传输 ArrayBuffer 的能力,而无需复制。这可以显著加快大型缓冲区的传输速度。
要传输缓冲区而不是复制它,请在调用 postMessage()
时在 transfer
选项中指定缓冲区。
文件锁定 API
此版本引入了四个新的不稳定 API,可用于文件锁定
Deno.flock
Deno.flockSync
Deno.funlock
Deno.funlockSync
这些 API 对于像 sqlite
这样的项目至关重要,以提供正确的数据库同步。
感谢 Tilman Roeder 实现了此功能。
操作系统信号 API 的更改
1.14 版本彻底修改了不稳定的操作系统信号 API。Deno.Signal
枚举已更改为信号字符串标识符的联合类型,允许信号 API 也使用字符串标识符,而不再需要传递 Deno.Signal
成员。
之前
for await (const _ of Deno.signal(Deno.Signal.SIGTERM)) {
console.log("got SIGTERM!");
}
之后
for await (const _ of Deno.signal("SIGTERM")) {
console.log("got SIGTERM!");
}
此外,包含用于创建不同信号流的辅助方法的 Deno.signals
命名空间已完全移除。进行这些更改是为了使信号 API 稳定化,我们预计这很快就会实现。
fetch
中的双向 TLS 支持
此版本在 fetch()
中引入了对双向 TLS 的支持。双向 TLS(有时称为客户端认证)是一种对客户端进行服务器认证的方式。一些常见用例包括
- 对 Kubernetes API 服务器进行客户端认证
- 对 Cloudflare Access 等零信任平台进行客户端认证
现在可以通过自定义 Deno.HttpClient
来为 fetch
指定客户端证书和私钥。
const client = Deno.createHttpClient({
certChain: Deno.readTextFileSync("./cert.pem"),
privateKey: Deno.readTextFileSync("./key.pem"),
});
const resp = await fetch("https://example.com/", { client });
感谢 Sean Michael Wykes 和 Eric Lindvall 实现了此功能。
DENO_AUTH_TOKENS
中的基本认证支持
Deno 允许从需要认证的私有仓库和服务器获取代码,方法是在 DENO_AUTH_TOKENS
环境变量中提供 Bearer 令牌。
从 1.14 版本开始,DENO_AUTH_TOKENS
也接受基本认证,从而可以从更多服务器获取代码。
要指定基本认证数据,请使用 username:password@host
语法,例如
DENO_AUTH_TOKENS=testuser123:testpassabc@127.0.0.1:4554
基本认证数据和 Bearer 令牌可以像这样混合在环境变量中
DENO_AUTH_TOKENS=a1b2c3d4e5f6@deno.land;testuser123:testpassabc@127.0.0.1:4554
感谢 @BasiqueEvangelist 实现了此功能。
URL 解析速度现在提升了 3 倍
几周前,我们收到了一些报告,称我们的 URL 解析速度比 Chrome 等其他引擎慢得多。这是一个影响相对较大的性能问题,因为 URL 解析在 Web 服务器应用程序中是一个非常常见的操作。
我们很高兴地报告,我们的 URL 解析速度现在比 1.13 版本快了 3 倍。这是一个显著的改进,但我们仍在研究未来进一步优化这个热点路径的方法。
gid
和 uid
现在可以为子进程指定 子进程 API 获得了一个备受期待的功能,它允许为派生的进程指定用户 ID 和组 ID。
Deno.run({
cmd: [
"echo",
"Hello from root user",
],
uid: 0,
});
Deno.run({
cmd: [
"echo",
"Hello from root group",
],
gid: 0,
});
此功能不稳定,因此需要 --unstable
标志。目前它仅在 Unix 系统上受支持,在 Windows 上会被忽略。
感谢 @crowlKats 实现了此功能。
std/http
模块
更快的 标准库的 0.107.0 版本对 http
模块进行了重大改进。
在 v1.13 中原生 HTTP 绑定稳定化后,http/server.ts
模块被重写以使用新稳定的 API。结果,性能得到了显著提升,并且提供了一个更友好的 API,可以处理创建可靠 HTTP 服务器的繁琐部分;例如错误处理和连接多路复用。
感谢 Craig Morten 实现了这些更改。
VSCode 扩展更新
官方的 Deno VSCode 扩展获得了一系列更新,包括
- 使用测试代码透镜时更好的配置支持
- 捆绑的扩展减少了安装大小并提高了启动时间
- 调试配置的改进
- 支持
deno.json
/deno.jsonc
配置文件
TypeScript 4.4
Deno 1.14 附带最新的稳定版 TypeScript。有关 TypeScript 新功能的更多信息,请参阅TypeScript 4.4 博客文章
V8 9.4
此版本包含一个新版本的 V8,其中包括许多错误修复,以及一个重要的新功能:类静态初始化块。类可以通过静态初始化块来组织每个类评估时应运行一次的代码。
class C {
// This block will run when the class itself is evaluated
static {
console.log("Why is it always raining in Deno land?");
}
}
有关静态初始化块的解释器可在 V8 博客上找到。另请参阅 V8 9.4 发布说明。