跳至主要内容
Deno 2 终于来了 🎉️
了解更多

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 Worker 是 Web 的并行化原语。它们允许您在单独的执行环境(隔离区)中并行运行多个 JavaScript、TypeScript 或 WASM 代码。您可以通过在它们之间传递消息来在这些 Worker 和主线程之间进行通信。

Deno 从我们最初的 1.0 版本开始就支持 Web Worker,但存在一个主要限制:直到现在,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 存储 API

此版本添加了对 Web 存储 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 为此功能做出的贡献。

支持 deno D;fmt-ignore-file 指令以用于 Markdown 文件

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

要跳过对文件的格式化,可以在文件顶部的注释中使用 deno&#002D;fmt-ignore-file 指令。以前这些指令在 Markdown 文件中不起作用,但从 1.10 开始,现在支持它们。

要跳过对 Markdown 文件的格式化,请在文件顶部使用 <!-- deno&#002D;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);

WASM 线程在 Deno 中尚不可用,因为缺少对将(共享)数组缓冲区传输到 Worker 的支持。这是我们希望尽快引入的功能。要详细了解 WASM 线程,您可以阅读Alex Danilo 的这篇博文

支持远程导入映射

Deno 在 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 功能的 unstable 标志

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