Deno 在 2020 年
随着 API 的稳定性,几个大型基础设施重构,1.0 版本的发布,以及最受欢迎功能的发布,2020 年为 Deno 项目带来了很多行动。
请填写 Deno 调查,帮助我们指导 2021 年的开发。
继续阅读 Deno 的年度回顾。
一月:告别 libdeno,拥抱 rusty_v8
libdeno
是一个 C++ 库,它在 Deno 中为 V8 引擎和 Rust 代码之间的接口提供了便利。该库难以理解和开发附加功能。这种情况导致 2019 年秋季诞生了 rusty_v8
。 rusty_v8
是一个 Rust 库,它为 V8 引擎提供 API。到 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
我们还看到了构建过程的巨大改进。到目前为止,V8 是为 Deno 的每一次构建从源代码构建的。V8 是一个庞大的 C++ 项目,构建起来很容易花费超过 30 分钟。尽管使用了大量的构建缓存和其他技巧,但我们一直在努力应对它。我们添加了 rusty_v8
生成和下载 Github 发布版本上预构建的静态库的功能,使 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
APIdeno
库的 Rust API
移除的原因是我们不想承诺以当前形式支持 API,因为:缺乏底层规范(JSON/WASM 导入);或者维护负担过重(deno
库的 Rust API)。
最后,在 5 月 13 日,正好是在 Ryan 的 Deno 初始演示 之后的两周年,我们发布了 1.0 版本。
在社交媒体上,该版本获得了非常积极的评价。我们的 博客文章 被广泛分享,我们获得了许多新用户和贡献者。
但是,在我们开始着手运行时的另一个主要组成部分之前,尘埃还没有落定:使用 SWC 重写了 TypeScript 主机中的依赖关系分析。这一变化标志着我们用 Rust 重写 TypeScript 基础设施部分的努力的开始。
当月的发布
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 编译器主机实现。一个用于构建步骤,名为 deno_typescript
crate。另一个包含在 deno
二进制文件中。此外,整个过程对构建时间有重大影响:增量构建需要 2 分钟!通过使用纯 JavaScript,我们能够大幅简化内部构建依赖项和整体复杂性。由于实际的 JavaScript 代码是由 TypeScript 编译器生成的一个单文件包,因此我们对输出代码的外观几乎没有控制权。ES 模块被转换为在包中使用 SystemJS 加载器,这为最终包添加了大量的代码。
当月的发布
八月:发布新的注册中心
原始文章:https://deno.org.cn/blog/registry2
8 月 3 日,我们发布了一个新的 deno.land/x 注册中心,它使用 Webhook 与 GitHub 集成。当模块更新时,我们的系统会下载并永久保存源代码,这样我们就可以依靠不可变的源代码链接。
由于一些非公开的工作正在使用 Deno 基础设施,我们开始努力将 Deno 系统分解成更小的“op crates”,这些 crates 可以混合和匹配以生成自定义的 V8 运行时。8 月份,我们朝着这个方向迈出了第一步,并发布了 deno_web crate,它提供了一些基本的 Web API,如 Event
、TextEncoder
、TextDecoder
。
本月,基准测试系统用 Rust 重写;这标志着 Deno 项目减少构建依赖项的繁琐工作的开始。
当月的发布
九月:WebSocket API、控制台中的 CSS 样式、文件监视器、测试覆盖率
本月,我们发布了自 1.0 版本以来最大的功能更新。更多详细信息请查看 1.4.0 博客文章。
在项目的维护方面,还有一个重要的变化。发布计划已从每月发布次要版本更改为每六周发布一个新的次要版本,与 Rust 和 Chrome 项目保持一致。
当月的发布
十月:REPL 改进、打包改进、默认情况下启用 isolatedModules
本月最大的变化是在 TypeScript 编译器主机中默认情况下启用 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
12 月,我们发布了包含两个里程碑功能的 1.6 版本:自包含的二进制文件和语言服务器。deno compile
是 Deno 错误追踪中最需要的功能。
提供内置的语言服务器可以为所有能够与 LSP 协议通信的编辑器提供出色的开发体验。这导致了 vscode_code 的第三次改造,目前仍在进行中。
当月的发布
2021
我们在 2020 年见证了项目和社区的快速增长。展望 2021 年,我们对 Deno 的势头充满信心。敬请期待即将发布的激动人心的公告!
如果您有兴趣为 Deno 做贡献,或者只是想跟踪我们的进展,请查看以下内容:
填写 Deno 调查问卷。
通过添加 新的语言服务器功能 来改善 IDE 支持
通过使用 Web 平台测试套件 来确保 Web 兼容性