跳到主要内容
Deno 2.4 现已发布,包含 deno bundle、字节/文本导入、OTel 稳定版等更多功能
了解更多

Deno 1.10 发布说明

Deno 1.10 已被标记并发布。它包含新功能、性能改进和错误修复。

最值得注意的是

如果您已经安装了 Deno,可以通过运行 deno upgrade 升级到 1.10。如果您是首次安装 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

deno test 的改进

Deno 1.10 对内置测试运行器进行了重大改进。

测试的隔离和并行执行:在此版本之前,Deno 在单个运行时实例中串行运行所有测试。现在,所有发现的测试模块都使用每个模块的新运行时实例进行隔离运行。deno test 现在支持 --jobs 标志,允许指定运行测试时应使用的线程数。默认情况下,所有测试仍串行运行。

可配置的测试权限:Deno 有 许多标志 允许指定程序被允许使用的权限。为了方便在不同权限集下测试您的程序,Deno.test 现在支持 permissions 选项,允许指定应用于测试用例的确切权限。

Deno.test({
  name: "write only",
  permissions: { write: true, read: false },
  async fn() {
    await Deno.writeTextFile("./foo.txt", "I can write!");
    console.log(await Deno.readTextFile("./foo.txt"));
  },
});

请注意,即使提供了 --allow-read,我们仍然会得到预期的失败

$ deno test --allow-read --allow-write --unstable test_permissions.ts
Check file:///Users/ry/src/deno/test_permissions.ts
running 1 test from file:///Users/ry/src/deno/test_permissions.ts
test write only ... FAILED (5ms)

failures:

write only
PermissionDenied: Requires read access to "./foo.txt", run again with the --allow-read flag
    at deno:core/core.js:86:46
    at unwrapOpResult (deno:core/core.js:106:13)
    at async open (deno:runtime/js/40_files.js:46:17)
    at async Object.readTextFile (deno:runtime/js/40_read_file.js:40:18)
    at async fn (file:///Users/ry/src/deno/test_permissions.ts:6:17)
    at async asyncOpSanitizer (deno:runtime/js/40_testing.js:21:9)
    at async resourceSanitizer (deno:runtime/js/40_testing.js:58:7)
    at async exitSanitizer (deno:runtime/js/40_testing.js:85:9)
    at async runTest (deno:runtime/js/40_testing.js:199:7)
    at async Object.runTests (deno:runtime/js/40_testing.js:244:7)

failures:

    write only

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out (37ms)

请记住,测试用例请求的权限不能超过使用 --allow-* 标志授予进程的权限。如果 permissions 对象中省略了某个键,则它会从相应的 --allow-* 标志继承其值。

此功能需要使用 --unstable 标志。

更好的测试运行器输出:运行测试套件时,将为每个发现的模块显示一个提示,其中包含测试数量和这些测试的来源。

running 4 tests from file:///dev/deno/cli/tests/unit/tty_test.ts
test consoleSizeFile ... ok (11ms)
test consoleSizeError ... ok (4ms)
test isatty ... ok (4ms)
test isattyError ... ok (3ms)
running 6 tests from file:///dev/deno/cli/tests/unit/rename_test.ts
test renameSyncSuccess ... ok (17ms)
test renameSyncReadPerm ... ok (5ms)
test renameSyncWritePerm ... ok (6ms)
test renameSuccess ... ok (13ms)
test renameSyncErrorsUnix ... ok (34ms)
test renameSyncErrorsWin ... ignored (1ms)
...

文档中的类型检查示例:确保文档保持最新对于所有项目都至关重要。更改 API 后很容易忘记更新代码示例,导致代码示例过时。为了防止这种情况,deno test 现在支持 --doc 标志,该标志将对文档注释中的代码示例进行类型检查。

/**
 * ```
 * import { example } from "./test_docs.ts";
 *
 * console.assert(example() == 42);
 * ```
 */
export function example(): string {
  return "example";
}

亲自尝试

$ deno test --doc https://deno.org.cn/blog/v1.10/test_docs.ts

Check file:///dev/test_docs.ts:2-7
error: TS2367 [ERROR]: This condition will always return 'false' since the types 'string' and 'number' have no overlap.
console.assert(example() == 42);
               ~~~~~~~~~~~~~~~
    at file:///dev/test_docs.ts:2-7.ts:3:16

在未来的版本中,我们计划添加对将代码示例作为常规测试运行的支持。

运行测试时监视文件更改deno test 现在支持 --watch 标志,该标志将在测试完成后保持进程活动,并监视文件更改以重新运行相关的测试用例。

与支持 --watch 标志的其他子命令一样,需要监视的文件会自动由 Deno 发现。

感谢 Casper BeyerLiam Murphy 对这些功能的贡献。

Worker.postMessage 支持结构化克隆算法

Web Workers 是 Web 的并行化原语。它们允许您在独立的执行环境(隔离区)中并发运行多段 JavaScript、TypeScript 或 WASM 代码。您可以通过相互传递消息在这些 Worker 和主线程之间进行通信。

Deno 自最初的 1.0 版本发布以来一直支持 Web Workers,但存在一个主要限制:在此之前,Worker.postMessage() 使用的是不符合规范的算法,它在内部将消息 JSON 字符串化。这个解决方案给用户带来了一些令人惊讶的陷阱,因为并非所有值和对象都能正确序列化。此版本更改了这一点,允许使用结构化克隆算法序列化的任何数据。

这是一个将递归 JavaScript 对象发送到 Worker 的示例,这在以前会抛出错误

const obj = { hello: "world" };
obj.self = obj;

const worker = new Worker(
  "data:application/javascript,self.onmessage = (e) => self.postMessage(e.data);",
  { type: "module" },
);

worker.onmessage = (e) => {
  console.log("Received event:", e.data);
};
worker.postMessage(obj);

感谢 Tim Ramlot 对此功能的贡献。

支持 Web Storage API

此版本添加了对 Web Storage API 的支持。该 API 由 localStoragesessionStorage 组成,可用于持久存储少量数据,无需直接访问文件系统。数据按源(在 Deno 中可使用 --location 设置)键控。您可以无需任何权限即可使用 localStoragesessionStorage

底层存储层和持久性对应用程序来说是不透明的,因此与安全性无关。

该 API 的工作方式与浏览器中相同:localStorage 可用于在进程重启后持久存储最多 5 MB 数据,而 sessionStorage 可用于在进程持续期间存储少量数据。

示例如下

// kv.ts

const key = Deno.args[0];

if (key === undefined) {
  // if user passes no args, display number of entries
  console.log(localStorage.length);
} else {
  const value = Deno.args[1];

  if (value === undefined) {
    // if no value is specified, return value of the key
    console.log(localStorage.getItem(key));
  } else {
    // if value is specified, set the value
    localStorage.setItem(key, value);
  }
}
$ deno run --location https://example.com ./kv.ts
0
$ deno run --location https://example.com ./kv.ts foo bar
$ deno run --location https://example.com ./kv.ts foo
bar
$ deno run --location https://example.com ./kv.ts
1

感谢 crowlKats 对此功能的贡献。

支持 Markdown 文件中的 deno-fmt-ignore-file 指令

deno fmt 是一个基于 dprint 的格式化工具,能够格式化 JavaScript、TypeScript、JSON 和 Markdown 文件。

要跳过文件的格式化,可以在文件顶部使用注释形式的 denoD;fmt-ignore-file 指令。以前这些指令在 Markdown 文件中不起作用,但从 1.10 版本开始,它们现在已受支持。

要跳过 Markdown 文件的格式化,请在文件顶部使用 <!-- denoD;fmt-ignore-file -->

启用对共享 WASM 内存的支持

此版本启用了 WebAssembly 中原子操作和共享内存的支持。此功能已在 Chrome 和 Firefox 中默认启用,现在 Deno 中也已启用。

WebAssembly.Memory 构造函数中将 shared 设置为 true,可以启用原子操作,并允许使用共享数组缓冲区作为 WASM 内存的后端存储。

const memory = new WebAssembly.Memory({
  initial: 1,
  maximum: 10,
  shared: true,
});
console.assert(memory.buffer instanceof SharedArrayBuffer);

Deno 尚未支持 WASM 线程,因为缺少将(共享)数组缓冲区传输到 Worker 的支持。这是我们希望尽快引入的功能。要了解更多关于 WASM 线程的信息,您可以阅读Alex Danilo 的这篇博客文章

支持远程导入映射

Deno 在 v1.8 版本中稳定了导入映射,此前它们已在 Chrome 89 中稳定。在 1.10 版本中,我们启用了远程导入映射的使用。这意味着导入映射现在不必存储在本地文件系统上,也可以通过 HTTP 加载

$ deno install --import-map=https://example.com/import_map.json -n example https://example.com/mod.ts

更新了插件 API

此版本更新了插件接口,允许它们利用 serde_v8 在运行时和原生插件之间进行交互。此更新提供了所有必要的实用程序,可以在不需要使用第三方代码的情况下从原生插件调度操作。此外,插件现在可以访问 ResourceTable,以在运行时基础设施中存储 Rust 对象。有关如何使用这些 API 的示例,请参阅 test_plugin 示例。插件系统仍然需要 --unstable 标志,因为它是一个实验性功能。

感谢 Elias Sjögreen 对此重构的贡献。

移除 CLI 功能的不稳定标志

Deno 的某些部分尚未稳定,并且在稳定之前可能会经历重大更改——这主要指 JavaScript API。要使用这些 API,在运行 Deno 时需要指定 --unstable 标志。然而,此标志也曾用于标记一些尚未稳定的 CLI 功能(如 deno lint)。在 1.10 版本中,我们取消了 CLI 功能使用 --unstable 标志的要求,因此,从现在开始,--unstable 标志仅控制不稳定运行时 API 的可用性。一些仍被认为不稳定的 CLI 功能在其帮助文本中会有相应的注释(UNSTABLE:)。但是,它们不再需要使用 --unstable 标志来运行子命令,例如 deno compiledeno lint