Deno 1.10 已发布!新增多项改进:对内置测试运行器的改进、Web Workers中支持结构化克隆等

270

Deno 1.10 Release Notes

Deno 1.10 已打 tag 并发布。它包含新的功能、性能改进和错误修复。

最值得注意的是:

如果你已经安装了Deno,你可以通过运行deno upgrade升级到1.10。如果你是第一次安装Deno,你可以使用下面列出的方法之一。

# 使用Shell(macOS和Linux)。
curl -fsSL https://deno.land/x/install/install.sh | sh

# 使用PowerShell (Windows)。
iwr https://deno.land/x/install/install.ps1 -useb | iex

# 使用Homebrew(macOS)。
brew install deno

# 使用 Scoop (Windows)。
scoop install deno

# 使用 Chocolatey (Windows):
choco install deno

deno test 的改进

Deno 1.10给内置的测试运行器带来了一次重大的改革。

测试的隔离和平行执行。在这个版本之前,Deno在一个单一的运行时实例中串行地运行所有的测试。现在,所有被发现的测试模块被隔离运行,每个模块使用一个新的运行时实例。 deno test现在支持--jobs标志,允许人们指定在运行测试时应该使用多少个线程。默认情况下,所有测试仍然是串行运行的。

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

Deno.test({
  name: "write only",
  权限。{ write: true, read: false },
  async fn() {
    await Deno.writeTextFile("./foo.txt", "我可以写!")。
    console.log(await Deno.readTextFile("./foo.txt"))。
  },
});

注意,尽管提供了--allow-read,我们还是得到了预期的失败。

$ deno test --allow-read --allow-write --unstable test_permissions.ts
检查file:///Users/ry/src/deno/test_permissions.tsfile:///Users/ry/src/deno/test_permissions.ts运行1个测试。
测试只写... 失败 (5ms)

失败。

只写
PermissionDenied: 需要对"./foo.txt "的读取权限,用 --allow-read 标志再次运行
    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)

失败了。

	只写

测试结果。FAILED。0个通过;1个失败;0个被忽略;0个被测量;0个被过滤掉(37ms)

请记住,测试案例要求的权限不能超过使用--allow-*标志授予进程的权限。如果在 "permissions "对象中省略了一个键,那么它将从各自的 "allow-*"标志中继承其值。

这个功能需要使用--unstable标志。

更好的测试运行器输出。当运行测试套件时,每个被发现的模块都会显示提示,包括测试的数量和这些测试的来源。

file://dev/deno/cli/tests/unit/tty_test.ts运行4个测试。
测试 consoleSizeFile ... ok (11ms)
测试 consoleSizeError ... ok (4ms)
测试 isatty ... ok (4ms)
test isattyError ... ok (3ms)
从file://dev/deno/cli/tests/unit/rename_test.ts运行6个测试。
测试 renameSyncSuccess ... ok (17ms)
测试 renameSyncReadPerm ... ok (5ms)
测试 renameSyncWritePerm ... ok (6ms)
测试 renameSuccess ... ok (13ms)
测试 renameSyncErrorsUnix ... ok (34ms)
测试 renameSyncErrorsWin ... 忽略 (1ms)
...

文档中的类型检查例子。确保文档保持最新对所有项目来说都是至关重要的。在改变API后很容易忘记更新代码样本,导致代码样本变质。为了防止这种情况,deno test现在支持--doc标志,它将在文档注释中键入检查代码示例。

/**
 * ```
 * import { example } from "./test_docs.ts";
 *
 * console.assert(example() == 42);
 * ```
 */
输出函数 example(): string {
  返回 "example"。
}

自己试试吧。

$ deno test --doc https://deno.com/v1.10/test_docs.ts

检查file:///dev/test_docs.ts:2-7
错误。ts2367[错误]。这个条件将总是返回'false',因为'字符串''数字'的类型没有重叠。
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是网络的并行化基元。它们允许你在不同的执行环境(隔离区)中同时运行多个JavaScript、TypeScript或WASM位。你可以在这些工作者和主线程之间通过从一个到另一个的消息传递进行通信。

自从1.0版本发布以来,Deno一直支持网络工作者,但有一个主要的限制:直到现在Worker.postMessage()使用不符合规范的算法,在内部对消息进行JSON字符串化。这个解决方案给用户带来了一些令人惊讶的隐患,因为不是所有的值和对象都被正确地序列化了。这个版本改变了这一点,允许任何可以使用[structured clone alogrithm](developer.mozilla.org/en-US/docs/…

下面是一个向Worker发送递归JavaScript对象的例子,以前会出现错误。

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

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

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

感谢Tim Ramlot贡献此功能。

对Web存储API的支持

该版本增加了对Web Storage API的支持。这个API由localStoragesessionStorage组成,可以用来持久性地存储少量数据,而不需要直接访问文件系统。数据的关键是来源(在Deno中可以用--location来设置)。你可以使用localStoragesessionStorage而不需要任何权限。

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

该API的工作方式就像在浏览器中一样。 localStorage可以用来跨进程重启持久性地存储5MB的数据,而sessionStorage可以用来在进程中存储少量的数据。

下面是一个例子。

// kv.ts

const key = Deno.args[0];

if (key == undefined) {
  // 如果用户没有传递任何args,则显示条目的数量
  console.log(localStorage.length)。
} else {
  const value = Deno.args[1];

  if (value == undefined) {
    // 如果没有指定值,返回键的值
    console.log(localStorage.getItem(key))。
  } else {
    // 如果指定了值,则设置该值
    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$ deno run --location https://example.com ./kv.ts
1

感谢crowlKats,他贡献了这个功能。

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

deno fmt是一个基于[dprint](https://dprint.dev/)的格式化器,能够格式化JavaScript、TypeScript、JSON和Markdown文件。

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

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

启用对共享WASM内存的支持

这个版本启用了对WebAssembly中原子和共享内存的支持。这个功能在Chrome和Firefox中已经默认启用,现在在Deno中也是如此。

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

const memory = new WebAssembly.Memory({
  初始:1。
  最大。10,
  shared: true,
});
console.assert(memory.buffer instanceof SharedArrayBuffer)。

在Deno中,WASM线程还不可能实现,因为缺乏对传输(共享)数组缓冲区给工作者的支持。这是我们想很快引入的一个功能。要了解更多关于WASM线程的信息,你可以阅读[Alex Danilo的这篇博文](developers.google.com/web/updates…

支持远程导入地图

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](https://crates.io/crates/serde_v8)来实现运行时和本地插件之间的接口。该更新提供了所有必要的工具,以便从本地插件中调度操作,而不需要使用第三方代码。此外,现在允许插件访问ResourceTable,以在运行时基础设施内存储Rust对象。关于如何使用这些API,请参考[test_plugin](https://github.com/denoland/deno/blob/0d319161bc19a520df653bc0c8386f14a68efbdb/test_plugin/src/lib.rs)的例子。插件系统仍然需要--unstable标志,因为它是一个实验性的功能。

感谢Elias Sjögreen,他贡献了这个重构。

删除CLI功能的不稳定标志

Deno的某些部分还不稳定,在稳定之前可能会发生破坏性的变化--这主要指的是JavaScript APIs。要使用这些API,需要在运行Deno时指定--unstable标志。然而,这个标志也被用来标记一些尚不稳定的CLI功能(如deno lint)。在1.10中,我们取消了对CLI功能使用--unstable标志的要求,因此,从现在开始--unstable标志只控制不稳定的运行时API的可用性。一些仍然被认为是不稳定的CLI特性,在其帮助文本中有适当的注释(UNSTABLE:)。但是它们不再需要使用--unstable标志来运行子命令,例如deno compiledeno lint