Deno 1.10已经被标记并发布。它包含新功能、性能改进和错误修复。
最值得注意的是:
- 对内置test runner的改进。
- Web Worker中支持的结构化克隆。
- 添加了Web存储API。
- 支持远程导入映射。
如果您已经安装了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测试现在支持--job标志,该标志允许用户指定在运行测试时应该使用多少线程。默认情况下,所有测试仍是串行运行的。
测试的可配置权限:Deno有许多标志,允许指定程序允许使用的权限。为了简化程序在不同权限集下的测试,Deno.test现在支持权限选项,该选项允许指定要应用于测试用例的确切权限。
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-* 标志.如果Permission对象中省略了某个键,则它将从相应的--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.com/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会自动发现需要监视的文件。
感谢卡斯珀·拜尔和利亚姆·墨菲,他们贡献了这些特写。
Worker.postMessage 支持结构化克隆算法
Web Worker是Web的并行化原语。它们允许您在独立的执行环境(隔离)中同时运行多位JavaScript、TypeScript或WASM。通过将消息从一个工作线程传递到另一个工作线程,您可以在这些工作线程和主线程之间进行通信。
从我们最初的1.0版本开始,Deno就一直支持Web Worker,但有一个主要的限制:到目前为止,Worker.postMessage()使用的是内部使用JSON字符串的消息的非规范兼容算法。这个解决方案给用户带来了一些令人惊讶的陷阱,因为并非所有的值和对象都被正确序列化。此版本改变了这一点,允许使用结构化克隆算法序列化任何数据。
下面是向Worker发送递归JavaScript对象的示例,这在以前会引发错误:
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);
感谢蒂姆·拉姆洛特,他贡献了这个特性。
支持Web存储API
此版本增加了对Web存储API的支持。该接口由localStorage和sessionStorage两部分组成,可用于持久化存储少量数据,无需直接访问文件系统。数据是按来源设置的(在Deno中可以用--location设置)。您可以使用localStorage和sessionStorage,而不需要任何权限。
底层存储层和持久性对应用程序是不透明的,因此与安全无关。
API的工作方式与浏览器中类似:localStorage可用于在进程重新启动时持久存储最多5MB的数据,而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 specifed, 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文件。
要跳过文件的格式化,可以在文件顶部以注释形式使用Deno-fmt-Ignore-file指令。以前,这些指令在Markdown文件中不起作用,但现在从1.10开始支持它们。
要跳过格式化Markdown文件,请在文件顶部使用 \。
启用对共享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线程化还不可能实现,因为不支持将(共享的)数组缓冲区传输到工作进程。这是我们很快要推出的一项功能。要了解更多关于WASM线程的信息,您可以阅读Alex Danilo的这篇博客文章。
支持远程导入map。
Deno在Chrome89中稳定了导入地图之后,在Deno v1.8中稳定了导入map。在1.10中,我们启用了远程导入map。这意味着导入map现在不必存储在本地文件系统上,它们还可以通过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示例。插件系统仍然需要--unstant标志,因为它是一个试验性特性。
感谢Elias Sjögreen,他贡献了这次重构。
删除CLI功能的不稳定标志。
Deno的某些部分还不稳定,在稳定之前可能会经历突破性的变化--这主要指的是JavaScript API。要使用这些API,需要在运行Deno时指定--unstallent标志。然而,这个标志也被用来标记一些还不稳定的CLI特性(比如deno lint)。在1.10中,我们取消了对CLI特性使用--unstable 标志的要求,因此,从现在开始--unstable 标志只控制不稳定的运行时API的可用性。一些仍然被认为不稳定的CLI功能在其帮助文本中有适当的注释(不稳定:)。但是,它们不再需要使用--unstable 标志来运行子命令,例如,deno compile, deno lint.
网友评论