跳到主要内容
Deno 2.4 发布,带来 deno bundle、字节/文本导入、OTel 稳定版等新特性
了解更多

2020年 Deno 回顾

2020年,Deno 项目动作频频,包括 API 稳定化、多项大型基础设施重构、1.0 版本发布以及推出了最受用户期待的功能。

请填写 Deno 调查问卷,帮助我们指引 2021 年的开发方向。

请继续阅读 Deno 的年度回顾。

一月:再见 libdeno,你好 rusty_v8

libdeno 是一个 C++ 库,它在 Deno 中为 V8 引擎和 Rust 代码提供接口。该库难以理解且难以开发额外功能。这种情况导致了 rusty_v8 在2019年秋季诞生。rusty_v8 是一个为 V8 引擎提供 API 的 Rust crate。到12月,rusty_v8 已经具备了替换 libdeno 所需的所有绑定。这项工作始于2019年末,当时 libdeno 的第一部分被用 rusty_v8 重写。得益于 Deno 代码库中不断增长的测试覆盖率,我们有信心向前推进,并在两周内完成了这项工作。libdeno 在 0.29.0 版本中被完全移除,此后 rusty_v8 对绑定的类型安全性进行了重大重构。

本月版本发布

二月:deno fmt 现在使用 dprint,新增 deno test 子命令

本月我们对 deno fmt 进行了大幅改动。在此之前,deno fmt 只是一个简单的子命令,其底层只是指向 prettier 的 “deno run” 别名。这意味着,在首次运行 deno fmt 和每次升级后,用户都必须下载最新版本的 prettier 模块。这种情况感觉不对劲,因为 Deno 承诺开箱即用提供这些工具。prettier 的速度也相当慢,性能表现有待提高。

我们通过 David Sherret 了解到 dprint,它是一个用 Rust 编写的代码格式化工具,基于 Kang Dong Yun 的 SWC JavaScript 解析器。dprint 可以像 prettier 模块那样格式化代码,但速度快了几个数量级。经过一些初步测试后,我们决定在 deno fmt 中使用 dprint

deno test 在首次运行时也有下载标准库模块的要求。这导致新增了 Deno.test() API 和 deno test CLI 子命令,使 Deno 中的测试成为了一等公民。

本月版本发布

三月:V8 调试器,deno doc,deno upgrade

缺少 Chrome Devtools 支持是 1.0 版本发布的主要障碍。我们投入了大量精力来增加对 V8 调试器的支持,以及使用 Chrome Devtools 连接 Deno 进程的能力。

CLI 新增两个子命令

  • deno doc
  • deno upgrade

我们还看到构建过程有了巨大改进。在此之前,每次构建 Deno 时,V8 都是从源代码构建的。V8 是一个庞大的 C++ 项目,构建起来轻轻松松就能超过 30 分钟。尽管使用了大量构建缓存和其他技巧,但它始终是我们必须面对的难题。我们为 rusty_v8 添加了在 GitHub release 中生成和下载预构建静态库的功能,这使得 Deno 构建能够完全跳过 V8 的构建。这简化并加快了 CI 中的构建速度,但最重要的是,它让贡献者能够更轻松地构建 Deno。

本月版本发布

四月:为大稳定版破坏所有 API

本月我们专注于审查 Deno 全局 API,为 1.0 版本发布做准备。这导致了许多破坏性更改。我们采取了保守策略,因此任何不确定的 API 都被移至 --unstable 标志后。

这是 1.0 版本发布的主要承诺;Deno 中标记为稳定的 API 在 2.0 版本发布之前不会有破坏性更改。

本月标志着 Deno 最后一个 0.x.y 版本的发布。

本月版本发布

五月:Deno 1.0 发布

本月初,多项功能被移除

  • JSON 导入
  • WASM 导入
  • window.location API
  • deno crate 的 Rust API

移除的原因是我们不希望承诺支持当前形式的 API,这或是因为:JSON/WASM 导入缺少底层规范;或是因为 deno crate 的 Rust API 会增加额外的维护负担。

最终在5月13日,也就是 Ryan 最初 Deno 演示 的整整两年后,我们发布了 1.0 版本。

在社交媒体上,这个版本受到了广泛好评。我们的 博客文章 被广泛分享,我们获得了许多新用户和贡献者。

然而,尘埃尚未完全落定,我们又开始着手处理运行时的另一个主要组件:TypeScript host 中的依赖分析被使用 SWC 重写。这一改变标志着我们将部分 TypeScript 基础设施用 Rust 重写的努力的开始。

本月版本发布

六月:增量类型检查和 deno lint

1.0 版本发布后,社区收到的主要抱怨之一是 TypeScript 编译和类型检查速度极慢。因此,我们着手改进 TSC 集成以支持增量类型检查。经过多次试错性的 PR 后,我们成功使功能正常运行并显著改善了开发循环时间。尽管我们通过利用 TSC 的增量 API 提高了类型检查速度,但我们仍然依赖它来发出转译后的源代码。TypeScript 的一个重要设计原则是它只是带有额外语法的 JavaScript,因此剥离类型信息(转译为 JavaScript)是一个相对简单的操作。因此,我们设定了目标,即能够在 Rust 中使用 SWC 进行转译,同时继续使用 TSC 进行类型检查。

经过几个月在单独仓库中的秘密开发后,新增了一个 deno lint 子命令。这是又一个基于 SWC JavaScript 解析器构建的项目。

本月版本发布

七月:将内部运行时代码从 TypeScript 转换为 JavaScript

本月我们做出了一个艰难的决定,将我们的内部运行时代码从 TypeScript 转换为 JavaScript。导致这一决定的因素有几个:每次构建 Deno 内部运行时代码时,其构建过程都复杂而缓慢,代码在 快照化 之前需要进行类型检查和打包。我们有两个独立的 TypeScript 编译器 host 实现。一个仅用于构建步骤,称为 deno_typescript crate。另一个包含在 deno 二进制文件中。此外,整个过程对构建时间有显著影响:增量重建需要 2 分钟!通过使用普通的 JavaScript,我们大大简化了内部构建依赖项和整体复杂性。因为实际的 JavaScript 代码是由 TypeScript 编译器生成为单个文件包的,所以我们对输出代码的外观几乎没有控制权。ES 模块在包中被转换为使用 SystemJS loader,这为最终的包增加了大量代码。

本月版本发布

八月:新注册表发布

原文:https://deno.org.cn/blog/registry2

8月3日,我们发布了一个新的 deno.land/x 注册表,该注册表使用 webhook 与 GitHub 集成。当模块更新时,我们的系统会下载并永久保存源代码,以便我们能够依赖不可变的源代码链接。

由于正在进行一些非公开的 Deno 基础设施使用工作,我们开始努力将 Deno 系统拆分为更小的“op crates”,它们可以混合搭配以生成自定义 V8 运行时。八月,我们迈出了第一步,发布了 deno_web crate,提供了 EventTextEncoderTextDecoder 等一些基本的 Web API。

本月,基准测试系统用 Rust 重写;这标志着 Deno 项目减少构建依赖项的繁琐工作的开始。

本月版本发布

九月:WebSocket API、控制台 CSS 样式、文件监视器、测试覆盖率

本月我们发布了自 1.0 以来最大的功能版本。更多详情请参阅 1.4.0 博客文章

项目维护方面还有一项重要变化。发布计划进行了调整,从每月一次小版本发布,改为每六周发布一次新的小版本,与 Rust 和 Chrome 项目保持一致。

本月版本发布

十月:REPL 改进、打包优化、isolatedModules 默认启用

1.5.0 博客文章

本月发生的最大变化是默认启用 TypeScript 编译器 host 中的 isolatedModules 选项。此设置改变了 TypeScript 的行为方式,确保每个文件都可以通过 TSC 以外的工具(如 SWC 和 Babel)独立转译(不依赖类型和/或其他模块的知识)。此更改对模块生态系统产生了重大影响,导致一些流行的模块在维护者调整代码以适应 isolatedModules 之前无法使用。

本月我们还在 SWC 中采用了新的打包功能,这是朝着使用 Rust 替代原始 TypeScript 编译器方向迈出的又一步。

本月版本发布

十一月:TSC 编译器基础设施大重构

本月,Kitson Kelly 持续数周的编译流水线重写项目画上了句号。它进一步提高了 TypeScript 转译的速度,但最重要的是解决了大量的技术债。

新增了 deno_crypto op crate

本月版本发布 1.5.2, 1.5.3, 1.5.4

十二月:自包含二进制文件和 LSP

1.6.0 博客文章

12月,我们发布了 1.6 版本,其中包含两项里程碑功能:自包含二进制文件和语言服务器。deno compile 是 Deno bug 追踪器中最受用户期待的功能。

提供内置语言服务器可以为所有支持 LSP 协议的编辑器带来出色的开发体验。这导致了 vscode_code 的第三次改造,目前仍在进行中。

本月版本发布

2021

2020年,我们看到 Deno 项目和社区都取得了长足发展。展望2021年,我们对 Deno 的发展势头充满信心。敬请期待即将发布的一些激动人心的公告!

如果您有兴趣为 Deno 贡献力量或只是想了解我们的进展,请关注以下内容: