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

Deno 1.4 版本说明

今天我们发布了 Deno 1.4.0,这是我们迄今为止最大的功能发布。以下是一些亮点

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

新功能和更改

WebSocket API

此版本添加了对 web 标准 WebSocket API 的支持,该 API 可在所有现代浏览器中使用。它可用于通过 WebSocket 协议与远程服务器通信。

以下是一个简短的示例,说明它的工作原理

// Start the connection to the WebSocket server at echo.websocket.org
const ws = new WebSocket("ws://echo.websocket.org/");

// Register event listeners for the open, close, and message events
ws.onopen = () => {
  console.log("WebSocket ready!");

  // Send a message over the WebSocket to the server
  ws.send("Hello World!");
};
ws.onmessage = (message) => {
  // Log the message we receive:
  console.log("Received data:", message.data);

  // Close the websocket after receiving the message
  ws.close();
};
ws.onclose = () => console.log("WebSocket closed!");
ws.onerror = (err) => console.log("WebSocket error:", err.error);

// When running this the following is logged to the console:
//
// WebSocket ready!
// Received data: Hello World!
// WebSocket closed!

您可以在本地尝试它:deno run --allow-net=echo.websocket.org https://deno.org.cn/blog/v1.4/websocket.js

此版本还从 std/ws 中删除了 websocket 连接方法。改用 WebSocket API

deno run --watch

Deno 现在有一个集成的文件监视器,可用于在任何依赖项更改时重新启动脚本。

要使用它,像往常一样运行您的脚本,但添加 --watch 标志。您还需要添加 --unstable 标志,因为此功能尚不稳定。

$ echo "console.log('Hello World!')" > mod.ts
$ deno run --watch --unstable mod.ts
Check file:///home/deno/mod.ts
Hello World
Watcher Process terminated! Restarting on file change...
# now run `echo "console.log('File watching works!')" > ./mod.ts` in a different terminal
Watcher File change detected! Restarting!
Check file:///home/deno/mod.ts
File watching works!
Watcher Process terminated! Restarting on file change...

watch 标志不接受要监视的目录或文件的参数。相反,它会自动确定脚本的所有本地导入,并监视它们。

目前文件监视仅支持 deno run,但将来还会添加到 deno test 和可能的其他子命令中。

deno test --coverage

您现在可以使用 deno test--coverage 标志查找未被测试覆盖的代码。启用后,将在所有测试运行完成后打印每个文件的代码覆盖率摘要。您还需要添加 --unstable 标志,因为此功能尚不稳定。

$ git clone [email protected]:denosaurs/deno_brotli.git && cd deno_brotli
$ deno test --coverage --unstable
Debugger listening on ws://127.0.0.1:9229/ws/5a593019-d185-478b-a928-ebc33e5834be
Check file:///home/deno/deno_brotli/.deno.test.ts
running 2 tests
test compress ... ok (26ms)
test decompress ... ok (13ms)

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (40ms)

test coverage:
file:///home/deno/deno_brotli/mod.ts 100.000%
file:///home/deno/deno_brotli/wasm.js 100.000%

目前唯一可用的输出格式是文本摘要。将来会添加其他输出格式,例如 lcovjson

--unstable 中更严格的类型检查

对于所有使用 --unstable 的用户,isolatedModulesimportsNotUsedAsValues TypeScript 编译器选项现在默认情况下将被启用。我们将来会为所有人默认启用这些标志。这些标志在 TypeScript 编译器中启用了某些更严格的检查,这可能会导致一些您以前从未见过的错误

ERROR TS1205: Re-exporting a type when the '--isolatedModules' flag is provided requires using 'export type'.

ERROR TS1371: This import is never used as a value and must use 'import type' because the 'importsNotUsedAsValues' is set to 'error'.

这些错误发生在导入或重新导出接口或类型别名时。要修复错误,请将您的导入和重新导出更改为使用 import typeexport type。示例

// Bad
import { MyType } from "./mod.ts";
export { MyType } from "./mod.ts";

// Good
import type { MyType } from "./mod.ts";
export type { MyType } from "./mod.ts";

deno info 改进

此更新对用于执行依赖项分析的 deno info 工具进行了重大改进。它现在更快且错误更少。此外,现在还会显示依赖项的文件大小,这使得确定哪些依赖项向您的项目添加了大量代码变得非常容易。

a screenshot of running `deno info https://deno.land/x/brotli/mod.ts`, which prints the a module graph for the `https://deno.land/x/brotli/mod.ts` module

在 console.log 中使用 CSS 样式

大多数现代浏览器支持使用 CSS 为 console.log 消息设置样式。为了尽可能地兼容 web,Deno 现在也支持 console.log 的 CSS 样式。

要设置消息的样式,请在您的消息中添加 %c 格式参数,并将要应用的样式指定为 console.log 的参数

console.log("%cStop!", "color:red;font-weight:bold");
// This will print a bold red `Stop!` to the console.

Deno 支持 colorbackground-colorfont-weightfont-styletext-decoration-colortext-decoration-line CSS 属性。对这些属性以及自定义 rgb、hex 和 hsl 颜色的支持取决于您的终端对 ANSI 的支持。

运行 `deno run https://deno.org.cn/blo/blogg/v1.4/rainbow.js` 的屏幕截图,该截图将带有 Deno 1.4 的彩虹打印到控制台 查看源代码:https://deno.org.cn/blog/v1.4/rainbow.js

在此版本中,我们添加了对最终规则的支持,这些规则是使 deno lint 规则与推荐的 eslinttypescript-eslint 规则集保持一致所需的。这意味着 deno lint 应该能够捕获 @eslint/recommended@typescript-eslint/recommended 可以捕获的所有错误。(以快几个数量级的性能。)这是 deno lint 稳定化的一个重要步骤。

deno doc 更新

deno dochttps://doc.deno.land 在此版本中也获得了一系列新功能和修复。添加了对 export { foo }; 语法的支持(在声明之后导出语句),并且现在支持使用相同名称的多个符号的重新导出。

要试用这些新功能,只需浏览 https://doc.deno.land 上的任何模块。它已经使用新版本进行了更新。

deno.land/std 中的更改

在此版本中,writeJsonwriteJsonSyncreadJsonreadJsonSync 函数已从 https://deno.land/std/fs 中删除。您可以轻松地用以下函数替换它们

- const accounting = await readJson("accounting.json");
+ const accounting = JSON.parse(await Deno.readTextFile("accounting.json"));

- const accounting = readJsonSync("accounting.json");
+ const accounting = JSON.parse(Deno.readTextFileSync("accounting.json"));

- await writeJson("hello_world.json", { "hello": "world" });
+ await Deno.writeTextFile("hello_world.json", JSON.stringify({ "hello": "world" }));

- writeJsonSync("hello_world.json", { "hello": "world" });
+ Deno.writeTextFileSync("hello_world.json", JSON.stringify({ "hello": "world" }));

deno_core Rust API 的更改

Deno 的基础子系统 `deno_core` 随着我们改进 CLI 不断发展。在 0.57.0 中,我们已将 `CoreIsoate` 和 `EsIsolate` 合并到名为 `JsRuntime` 的单个结构体中。此外,还公开了更易于创建操作的工具。查看 示例,了解这些 API 如何协同工作。

VS Code 扩展更新

最近,Deno 的 VS Code 扩展 发布了一些主要的功能更新。以下是一个简要总结。

远程 URL IntelliSense

扩展的一个很棒的新功能是针对 deno.land 导入的 IntelliSense。它为您提供 deno.land/x 上模块名称、所有版本及其完整目录列表的自动完成建议。所有这些都无需实际下载模块源代码,而是由 deno.land/x 的最新更新 提供支持。

内联 deno lint 诊断

deno lint 现在已与扩展完全集成。要启用它,只需在扩展中将 `deno.unstable` 和 `deno.lint` 设置设置为 `true`。执行此操作后,您将获得代码的实时内联诊断。


完整的发布说明(包括错误修复)可在 https://github.com/denoland/deno/releases/tag/v1.4.0 找到。

HN 评论