Deno 1.6正式发布!支持将TypeScript编译成单个可执行文件,苹果M1可原生运行
以下是本次版本更新的要点一览:
构建自包含的独立二进制文件: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 芯片上原生运行的二进制文件。
# 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 开发团队希望在 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 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
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 构建。
使用苹果搭载 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 模块已做了大修。这是稳定 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 应用,并快速上线!报名点击阅读原文。
点击阅读原文↓