Deno 1.26 发布说明
Deno 1.26 已标记并发布,包含以下新功能和更改
Cache
Web API- WebCrypto 安全曲线
--allow-sys
权限标志- npm 支持改进
- Node.js 兼容性改进
Deno
API 变更Deno.serve()
API 改进- 性能改进
- 模块下载 UI 改进
- 开发者体验改进
- TypeScript 4.8
如果您已安装 Deno,可以通过运行以下命令升级到 1.26
deno upgrade
如果您是首次安装 Deno
# MacOS and Linux
curl -fsSL https://deno.land/x/install/install.sh | sh
# Windows
iwr https://deno.land/x/install/install.ps1 -useb | iex
点击此处获取更多安装选项。
Cache
Web API
此版本中,我们添加了对 Cache API 的支持。
此 API 允许您缓存 Request/Response 对象。这在动态生成响应时非常有用。它允许您缓存 GET 请求的响应,并为类似请求从缓存中提供响应。
这是一个根据 name
查询生成响应的小示例
import { serve } from "https://deno.land/std@0.158.0/http/server.ts";
// Open a cache named v1.
const CACHE = await caches.open("v1");
serve(async (req: Request) => {
// Requests after first request are served from cache.
const res = await CACHE.match(req);
if (res) {
res.headers.set("x-cache-hit", "true");
return res;
}
const { searchParams } = new URL(req.url);
const name = searchParams.get("name");
const response = new Response(`Hello ${name}!`);
// Put response in cache.
await CACHE.put(req, response.clone());
return response;
});
缓存会持久化到文件系统。因此,重新启动 Deno 不会清空缓存。
以下 API 已实现
CacheStorage::open()
CacheStorage::has()
CacheStorage::delete()
Cache::match()
Cache::put()
Cache::delete()
与浏览器相比的一些不同之处
- 您不能向 API 传递相对路径。请求可以是 Request 或 URL 的实例,也可以是 URL 字符串。
match()
和delete()
尚不支持 查询选项。
WebCrypto 安全曲线
WebCrypto 安全曲线 规范为 WebCrypto API 添加了对 Curve25519 和 Curve448 的支持。
Deno v1.26 实现了 CFRG 曲线 Ed25519 和 X25519。
const key = await crypto.subtle.generateKey("X25519", true, ["deriveKey"]);
我们计划在未来的版本中添加对 Ed448 和 X448 的支持。
--allow-sys
权限标志
Deno 有许多 API 可以提供关于用户操作系统的信息,例如 Deno.osRelease()
、Deno.systemMemoryInfo()
。
以前,访问这些 API 需要 --allow-env
标志,这很不幸,因为它意味着您必须授予读取所有环境变量的权限才能访问有关操作系统的信息。
Deno v1.26 引入了一个新的 --allow-sys
权限标志,用于保护对这些 API 的访问,这意味着您不再需要同时公开您的环境变量。
以下 API 需要 --allow-sys
标志
Deno.hostname()
Deno.networkInterfaces()
Deno.loadavg()
Deno.getUid()
Deno.getGid()
Deno.osRelease()
Deno.systemMemoryInfo()
与其他权限标志类似,您可以通过提供 API 允许列表来精细地授予 API 访问权限,例如 --allow-sys=hostname,osRelease
。
npm 支持改进
此版本修复了许多与 npm 规范符相关的错误,并添加了多项新功能。对 npm 模块的支持仍处于实验阶段,需要 --unstable
标志。
--node-modules-dir
标志
npm 规范符将 npm 包解析到中央全局 npm 缓存。这在大多数情况下都运行良好,是理想的选择,因为它占用空间更少且不需要 node_modules
目录。尽管如此,您可能会遇到某些 npm 包期望自己从 node_modules
目录执行的情况。为了提高兼容性并支持这些包,添加了一个新的 --node-modules-dir
标志。
例如,给定 main.ts
import chalk from "npm:chalk@5";
console.log(chalk.green("Hello"));
以 --node-modules-dir
运行此脚本,如下所示…
deno run --unstable --node-modules-dir main.ts
…将在当前目录中创建一个 node_modules
文件夹,其文件夹结构类似于 pnpm。
请注意,在调用 deno run
时,所有这些都会自动完成,无需单独的安装命令。
如果您想在执行前修改 node_modules
目录的内容,您可以运行带有 --node-modules-dir
的 deno cache
命令,修改内容,然后运行脚本。例如
deno cache --unstable --node-modules-dir main.ts
deno run --allow-read=. --allow-write=. scripts/your_script_to_modify_node_modules_dir.ts
deno run --unstable --node-modules-dir main.ts
--reload=npm:
和 --reload=npm:<package>
--reload
标志会重新加载以前缓存的外部资源。此版本增加了更有针对性的 --reload=npm:
和 --reload=npm:<package>
支持。
例如,要在运行脚本时重新加载所有 npm 包,请使用 --reload=npm:
标志
deno run --unstable --reload=npm: main.ts
或者只重新加载单个包,例如 chalk
deno run --unstable --reload=npm:chalk main.ts
--compat
模式已移除
为了避免两种独立的执行模式,不稳定的 --compat
模式已被弃用,转而使用 npm 规范符。
未来改进
我们将在未来几周内继续致力于 npm 支持并实现 TypeScript 和编辑器集成。有关我们完整的 npm 规范符路线图,请参阅 https://github.com/denoland/deno/issues/15960
Node.js 兼容性改进
Deno v1.26 包含了对 Node.js 兼容层中几个先前不支持的 API 的实现。此外,整个兼容层的测试套件已更新,以与 Node.js v18.8.0 兼容。此前,测试套件的目标是 Node.js v16.13.0。进行此更改是为了准备 Node.js 18 在 10 月进入长期支持 (LTS)。
请注意,整个 Node.js 兼容层仍然需要使用 --unstable
标志。
流重构
Deno 中的 Node.js 流实现已更新为使用 readable-stream@4.1.0
npm 模块。此更改将使 Deno 能够更好地跟上重大更改和新功能。有关此决定的更多背景信息,请参阅 这篇博客文章。
在兼容层内部,stream
和 stream/promises
模块现在通过 readable-stream
实现。此次重构还引入了几个新的 API,包括 Readable.toWeb()
、Writable.toWeb()
和 Duplex.toWeb()
,它们用于将各种类型的 Node.js 流转换为 Web 流。
fs.ReadStream
和 fs.WriteStream
的实现也已更新,以提高与 Node.js 中实现的兼容性。感谢 @PolarETech 完成这项工作。
child_process
API
child_process
模块已添加对 spawnSync()
、exec()
、execSync()
和 execFileSync()
的支持。
感谢 @iuioiua 和 @PolarETech 分别贡献了 spawnSync()
和 exec()
。
process.getuid()
和 process.getgid()
在非 Windows 平台上,可以通过 process.getuid()
和 process.getgid()
访问进程的用户标识符和组标识符。在 Windows 上,此功能不存在,这些方法为 undefined
。
感谢 @iuioiua 贡献此功能。
Deno
API 更改
API 稳定化
以下 API 在此版本中已稳定,不再需要使用 --unstable
标志。
Deno.hostname()
Deno.refTimer()
Deno.unrefTimer()
Deno.stdin.setRaw()
API
不稳定的 在此版本中,不稳定的 Deno.setRaw(rid)
API 已被移除,转而使用 Deno.stdin.setRaw()
。我们计划在下一个小版本中稳定此 API。
Deno.serve()
API 改进
我们收到了很多关于新的不稳定 Deno.serve()
API 的积极反馈,它提供了一个快速的 HTTP 服务器。
在此版本中,我们修复了几个已报告的错误,例如 Windows 上的假性挂起、并发请求阻塞或部分写入问题。
我们将继续改进我们的服务器实现,并希望在 Deno v1.27 中稳定此 API。
性能改进
在过去的几个版本中,我们一直在不断进行性能改进,作为一项内部计划的一部分,旨在尽可能地寻找瓶颈并减少延迟和处理开销。我们很快会更详细地介绍这项工作,请关注博客以获取更新。与此同时,我们可以分享一些我们比较 v1.24.3 版本与此版本中最新和最佳性能的基准测试结果。
将文本编码到现有 TypedArray 中,小型负载的最大吞吐量提高了 5 倍,大型负载最高提高了 30 倍。详情请参阅 denoland/deno#15922。
写入小文件现在同步写入 (Deno.writeFileSync()
) 速度提高了 1.44 倍,异步写入 (Deno.writeFile()
) 速度提高了 1.15 倍。
CSV 解析性能最近有所下降,原因是我们更改了文本编码/解码的方式。我们正在为此做更大的改进,但在此版本中,在我们的基准测试中,Mac 上的性能提升了 1.36 倍,Linux 上提升了 1.19 倍。
URL 解析现在对于不带查询字符串的 URL 速度提高了 2.27 倍,对于带有多个查询字符串参数的更复杂 URL 速度提高了 1.37 倍。详情请参阅 denoland/deno#15663。
文件系统操作最近有许多改进,未来还会更多。这是与 v1.24.3 相比,您在此版本中应该看到的改进类型总结。在 MacOS 上,Deno.copyFileSync
现在在可能的情况下使用 APFS 的写时复制 clonefile
系统调用。详情请参阅 denoland/deno#15873。
console.log()
现在对于小型负载的速度提高了 5 倍! denoland/deno#15931。
与 v1.24.3 相比,Deno.consoleSize
等 TTY 方法的速度提高了 2.4 倍。 denoland/deno#15976。
模块下载 UI 改进
Deno 获得了新的交互式“下载…”消息显示。
在非 TTY 环境中,Deno 将回退到以前的方式,即为每个文件在单独的行上显示“下载…”。
开发者体验改进
正如 最近提到的,我们一直致力于让 Deno 提供最流畅的开发者体验。过去一段时间,我们有一个团队专注于此,他们一直在解决的领域之一是发现。Deno 和更广泛的 JavaScript/TypeScript 生态系统非常庞大且导航复杂,我们已尝试让您更容易找到所需内容。
我们最近为改善这一体验而做出的一些改变包括
- 全面改进 deno.land 上的搜索功能,提供跨 手册、第三方模块 的搜索,以及搜索 内置 API、Deno 标准库 (
std
) 和所有第三方模块中的符号的能力。 - 根据实际代码使用情况对搜索结果进行排名,并对
deno.land/x
上的第三方模块列表 进行排序。此前,这是根据 GitHub 星级排名的,这提供了对 Deno 第三方生态系统非常偏颇的看法。 deno.land
上针对 内置 API 的集成文档,对每个 API 进行分类,以帮助更轻松地发现 Deno 内置功能的广度。- 每个第三方模块都提供信息丰富的着陆页和集成的自动生成文档。例如,请查看 oak 的文档。
- 改进了搜索引擎和社交媒体索引、发现和分享文档的方式。仅仅改进
deno.land
上的搜索可能无法惠及所有试图发现 Deno 或尝试分享 Deno 信息的人。 - 我们加深了对 Deno 生态系统行为和连接方式的理解。我们一直在深入研究可用数据,以期继续发现信息空白并持续改进发现体验。
近期将推出的内容
- 文档中符号之间的自动链接,包括符号与文档之间的链接。这将使探索模块或 API 变得更容易。
- 着陆页上每个第三方模块的依赖项列表,使其更容易理解第三方模块如何连接。
- 提供更多关于第三方模块流行度、质量和维护的信息。
- 从 Deno 视角看 npm 生态系统,使在 Deno 中发现和使用 npm 包变得更容易。
- 手册的全面修订和重构,使其中包含的信息对发现和探索 Deno 的人更清晰、更具相关性。
虽然我们最近一直专注于发现方面,但我们也在制定计划,重新聚焦于进一步提升智能编辑器体验,并改进 Deno CLI 内置工具的使用体验。
TypeScript 4.8
Deno v1.26 附带最新稳定版本的 TypeScript。有关 TypeScript 新功能的更多信息,请参阅 TypeScript 4.8 博客文章