vlambda博客
学习文章列表

Deno 1.6正式发布!支持将TypeScript编译成单个可执行文件,苹果M1可原生运行

作者 | Ryan Dahl
编译整理 | 王强、蔡芳芳
近日,Deno 1.6.0 正式发布。这一版本包含一些主要特性升级和许多错误修复,包括最受开发者关注的 deno compile 也取得了阶段性成果,现在 Deno 终于可以支持将 TypeScript 编译成单个可执行文件了。

以下是本次版本更新的要点一览:

  • 构建自包含的独立二进制文件:deno compile 可以将 Deno 项目构建为完全独立的可执行文件

    • https://deno.land/posts/v1.6#codedeno-compilecode-building-self-contained-standalone-binaries

  • 内置的 Deno 语言服务器:用于代码编辑器的完全集成 LSP

    • https://deno.land/posts/v1.6#built-in-deno-language-server

  • 对 Mac Arm64 的实验性支持:发布了可在苹果新款 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 开发团队希望在 Deno CLI 中提供一个好用的实用工具链,deno fmt 和 deno lint 就是其中的例子。现在,Deno 工具链终于添加了另一个开发工具:deno compile。

deno compile 对 Deno 来说,和 Node 里面的 nexe 或 pkg 的作用是一样的:从 JavaScript 或 TypeScript 源代码创建独立的自包含二进制文件。这也是 Deno 问题跟踪器上最受关注的一个问题。

它的工作机制是这样的:
$ deno compile --unstable https://deno.land/[email protected]/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。

https://github.com/denoland/deno/pull/8539

当前限制

目前,使用 deno compile 时可能会遇到一些限制。如果你遇到了以下情况,请在对应的跟踪问题中提交反馈。

  • 当前不支持 Web Worker。此特性的跟踪问题是 #8654。

    • https://github.com/denoland/deno/issues/8654

  • 你不能在动态导入中动态包含代码。此特性的跟踪问题是 #8655。

    • https://github.com/denoland/deno/issues/8655

  • 自定义 V8 标志和沙箱权限当前无法实现。此特性的跟踪问题是 #8656。

    • https://github.com/denoland/deno/issues/8656

未来计划

你可能已经注意到,与其他为 JS 创建独立自包含二进制文件的工具(如 pkg)不一样的是,deno compile 没有可用于打包资产的虚拟文件系统。Deno 开发团队表示,希望随着将来一些 TC39 提案(例如 import assertions 和 asset references)的引入,可以不再需要虚拟文件系统,因为届时资产可以在 JS 模块图中正确表示。

目前来说,deno compile 子命令不支持跨平台编译,特定平台的编译必须在该平台上进行。如果有需求,Deno 开发团队想使用一个 --target 标志,为编译时添加针对不同架构交叉编译的功能。这个跟踪问题是 #8567。

https://github.com/denoland/deno/issues/8567

由于当前二进制文件打包的工作机制,二进制文件中包含了许多不必要的代码。经初步测试,除去这些不必要的代码后,可以将二进制文件的最终大小减少约 60%(减到 20MB 左右)。目前 Deno 开发团队正在做这方面的工作。例如 #8640:

https://github.com/denoland/deno/pull/8640

内置 Deno 语言服务器

Deno 1.6 附带了一个新的 deno lsp 子命令,该子命令提供了一个实现 LSP 语言服务器协议的语言服务器。LSP 使编辑器可以与 Deno 通信,以提供各种高级功能,例如代码自动完成、linting 和悬停文档等。

这个新的 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 开发团队将发布使用 deno lsp 的新版 vscode-deno。

https://github.com/denoland/deno/issues/8643

迁移到更严格的类型检查

在 Deno 1.4 中,--unstable 引入了一些更严格的 TypeScript 类型检查,使开发团队能够将一堆代码从 JS 移到 Rust 中(从而大大提升了 TypeScript 的编译和打包性能)。在 Deno 1.5 中,默认情况下为每个人都启用了这些更严格的类型检查,并且给出了"isolatedModules": flase 的 TypeScript 编译器选项,以便开发人员选择关闭。

在这一版本中,这个选项已被移除。现在,所有 TypeScript 代码都使用"isolatedModules": true 运行。

关于此特性的更多详细信息,请参见 Deno 1.5 博客文章:

https://deno.land/posts/v1.5#stricter-type-checks-in-stable

TypeScript 4.1

Deno 1.6 附带了 TypeScript 的最新稳定版本。

有关 Typescript 4.1 中新特性的更多信息,请参见 TypeScript 4.1 发布文章。

金丝雀频道

一些高级用户想要在下一个稳定的 Deno 版本发布之前测试错误修复和新特性,针对这些用户,Deno 开发团队提供了一个 canary 更新通道。这里每天会发布多个金丝雀版本,在 Deno 存储库的 master 分支上每提交一次就更新一个版本。

https://github.com/denoland/deno/tree/master

你可以通过版本末尾的 7 字符提交哈希,以及 deno --version 输出中的 canary 字符串来识别这些发行版。

从 Deno 1.6 开始,你可以切换到金丝雀频道,运行 deno upgrade,--canary 下载最新的金丝雀版本。你可以使用 deno upgrade --canary --version 5eedcb6b8d471e487179ac66d7da9038279884df 跳转到特定的提交哈希。

警告:在金丝雀版本之间跳转或降级为稳定版本可能会损坏你的 DENO_DIR。

可以从 https://dl.deno.land 下载金丝雀版本的 zip 文件。

金丝雀尚不支持 aarch64-apple-darwin 构建。

对 Mac Arm64 的实验性支持

使用苹果搭载 M1 处理器的新 Mac 设备的用户将能原生运行 Deno 了。在发行 zip 文件中,开发团队通过 LLVM target triple aarch64-apple-darwin 来引用这个目标。

该目标仍被认为是实验性的,因为它是用 Rust nightly 构建(我们通常使用 Rust 稳定版),并且团队尚无自动化 CI 流程来构建和测试这个目标。不过 M1 上的 Deno 完全通过了测试套件,因此团队还是挺有信心的,认为它会带来比较顺滑的体验。

以 M1 为目标的 rusty_v8 v0.14.0 的二进制文件也提供了相同的警告:

https://github.com/denoland/rusty_v8/releases/tag/v0.14.0

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

延伸阅读

https://deno.land/posts/v1.6

 今日荐文


 活动推荐

12 月 12 日 13:40,华为云 AI 训练营西安站将围绕“企业级 AI 应用开发”为主题,让你与华为内部资深研究者面对面交流,更有实战演练带你构建 AI 应用,并快速上线!报名点击阅读原文。

点击阅读原文↓