Deno 1.6 发布说明
今天我们发布了 Deno 1.6.0。此版本包含一些主要功能和许多错误修复。以下是一些亮点:
- 构建自包含、独立的可执行文件:`deno compile` 可以将您的 Deno 项目构建成完全独立的可执行文件
- 内置 Deno 语言服务器:为代码编辑器提供完全集成的 LSP
- Mac Arm64 实验性支持:发布可在 Apple 新 M1 芯片上原生运行的二进制文件。
如果您已经安装了 Deno,可以通过运行 `deno upgrade` 升级到 1.6。如果您是首次安装 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
# Build from source using cargo
cargo install deno
新功能和变更
`deno compile`:自包含、独立的可执行文件

我们旨在 Deno CLI 中提供一套有用的实用工具链。例如 `deno fmt` 和 `deno lint`。今天我们很高兴能为 Deno 工具链添加另一个开发者工具:`deno compile`。
`deno compile` 为 Deno 所做的,就像 `nexe` 或 `pkg` 为 Node 所做的那样:从您的 JavaScript 或 TypeScript 源代码创建独立、自包含的二进制文件。这是 Deno 问题追踪器上获得最多赞的问题。
它这样工作:
$ deno compile --unstable https://deno.land/std@0.79.0/http/file_server.ts
Check https://deno.land/std@0.79.0/http/file_server.ts
Bundle https://deno.land/std@0.79.0/http/file_server.ts
Compile https://deno.land/std@0.79.0/http/file_server.ts
Emit file_server
$ ./file_server
HTTP server listening on http://0.0.0.0:4507/
与 Deno 中的所有新功能一样,`deno compile` 需要 `--unstable` 标志来表明短期内接口可能会有破坏性更改。如果您有反馈,请在 Deno Discord 中评论,或在 Deno 问题追踪器上创建功能请求问题。
有关实现细节,请参阅 #8539。
当前限制
目前,使用 `deno compile` 时可能会遇到一些限制。如果您有这些用例之一,请在相应的跟踪问题中回复。
- Web Workers 目前不支持。此功能的跟踪问题是 #8654。
- 您不能使用动态导入来动态包含代码。此功能的跟踪问题是 #8655。
- 目前无法自定义 V8 标志和沙箱权限。此功能的跟踪问题是 #8656。
未来计划
您可能已经注意到,与创建 JS 独立自包含二进制文件的其他工具(如 `pkg`)不同,`deno compile` 没有可用于捆绑资产的虚拟文件系统。我们希望随着未来 TC39 提案(如 `import assertions` 和 `asset references`)的出现,对虚拟文件系统的需求将消失,因为资产可以在 JS 模块图中直接表示。
目前,`deno compile` 子命令不支持跨平台编译。特定平台的编译必须在该平台上进行。如果有需求,我们希望在编译时添加使用 `--target` 标志进行不同架构交叉编译的功能。此功能的跟踪问题是 #8567。
由于目前二进制文件的打包方式,二进制文件中包含了很多不必要的代码。通过初步测试,我们确定在剥离这些不必要的代码后,最终二进制文件的大小可以减少约 60%(至约 20MB)。这方面的工作正在进行中(例如在 #8640 中)。
内置 Deno 语言服务器

Deno 1.6 附带了一个新的 `deno lsp` 子命令,它提供了一个实现语言服务器协议的语言服务器。LSP 允许编辑器与 Deno 通信,以提供各种高级功能,如代码补全、代码检查和悬停文档。
新的 `deno lsp` 子命令尚未功能完善,但它实现了许多主要的 LSP 功能:
- 代码补全
- 悬停提示
- 跳转到定义
- 跳转到引用
- `deno fmt` 集成
- `deno lint` 集成
Deno VSCode 扩展尚不支持 `deno lsp`。它仍然比新生的 `deno lsp` 能提供的功能更丰富。然而,我们预计随着 LSP 的成熟,这种情况将在未来几周内改变。目前,如果您想在 VSCode 中尝试 `deno lsp`,则必须安装 VSCode Deno Canary。在尝试此新扩展之前,请确保已安装 Deno 1.6。并且请务必禁用旧版本的扩展,否则诊断信息可能会重复。
要跟踪开发进度,请关注问题 #8643。当 #8643 完成后,我们将发布使用 `deno lsp` 的新版本 vscode-deno。
迁移到更严格的类型检查已完成
在 Deno 1.4 中,我们在 `--unstable` 中引入了一些更严格的 TypeScript 类型检查,这使我们能够将大量代码从 JS 迁移到 Rust(从而大幅提高 TypeScript 编译和捆绑的性能)。在 Deno 1.5 中,这些更严格的类型检查默认对所有人启用,并提供通过设置 `"isolatedModules": false` TypeScript 编译器选项来选择退出的选项。
在此版本中,此覆盖选项已被删除。所有 TypeScript 代码现在都使用 `"isolatedModules": true` 运行。
有关更多详细信息,请参阅Deno 1.5 博客文章。
TypeScript 4.1
Deno 1.6 附带最新的稳定版 TypeScript。
有关 TypeScript 4.1 中新功能的更多信息,请参阅发布 TypeScript 4.1
Canary 渠道
对于希望在下一个稳定 Deno 版本发布之前测试错误修复和功能的进阶用户,我们现在提供一个 `canary` 更新渠道。Canary 版本每天发布多次,Deno 仓库的 `master` 分支上的每次提交都会发布一个版本。
您可以通过版本末尾的 7 位字符提交哈希值以及 `deno --version` 输出中的 `canary` 字符串来识别这些版本。
从 Deno 1.6 开始,您可以通过运行 `deno upgrade --canary` 切换到 Canary 渠道并下载最新的 Canary 版本。您可以使用 `deno upgrade --canary --version 5eedcb6b8d471e487179ac66d7da9038279884df` 跳转到特定的提交哈希值。
警告:在 Canary 版本之间跳转或降级到稳定版可能会损坏您的 `DENO_DIR`。
Canary 版本的 zip 文件可以从 https://dl.deno.land 下载。
`aarch64-apple-darwin` 构建在 Canary 版本中尚不支持。
Mac Arm64 实验性支持
使用搭载 M1 处理器的新款 Apple 电脑的用户将能够原生运行 Deno。我们在发布 zip 文件中将此目标称为 LLVM 目标三元组 `aarch64-apple-darwin`。
此目标仍被认为是实验性的,因为它使用 Rust nightly 构建(我们通常使用 Rust stable),并且我们尚未有自动化 CI 流程来构建和测试此目标。尽管如此,Deno 在 M1 上完全通过了测试套件,因此我们相对有信心它会提供流畅的体验。
`rusty_v8 v0.14.0` 针对 M1 的二进制文件也已提供,并带有相同的注意事项。
`std/bytes` 的变更
作为标准库工作组努力的一部分;`std/bytes` 模块进行了重大修改。这是 Deno 标准库稳定化的第一步。
大多数 API 已重命名,以便更好地与 `Array` 上可用的 API 对齐:
- `copyBytes` -> `copy`
- `equal` -> `equals`
- `findIndex` -> `indexOf`
- `findLastIndex` -> `lastIndexOf`
- `hasPrefix` -> `startsWith`
- `hasSuffix` -> `endsWith`
完整的发行说明,包括错误修复,可在 https://github.com/denoland/deno/releases/tag/v1.6.0 找到。