- 原文地址:Deno in 2020
- 原文做者:Bartek Iwańczuk, Ryan Dahl
- 译者:@hylerrix
- 原文发布时间/翻译时间:20210115/20210122
- 本文属于《Deno 钻研之术》系列,原文翻译内容会同步更新到 Deno 中文官网中。
随着 API 的稳定化改造、若干大型基础架构的重构,以及诸多备受关注的功能开放,Deno 1.0 版本正式发布。2020 年,Deno 迎来了众多的挑战和变化。javascript
请填写这份 Deno 调查问卷来向咱们反馈以让 Deno 在 2021 年变得更好。html
下文是 Deno 的 2020 年度回顾。前端
libdeno
是一个 C++ 库,能够方便地桥接 Deno 中的 V8 引擎和 Rust 代码。此库难以理解,也难以在其上开发额外的功能。基于这种状况,最终致使了 rusty_v8
于 2019 年秋季诞生。rusty_v8
是一个为 V8 引擎提供相关 API 的 Rust crate。同年 12 月,rusty_v8
已具有全部必需的 binding 条件来替换 libdeno
。这项工做始于 2019 年年末,当时先使用 rusty_v8
重写了 libdeno
的一部分。因为 Deno 代码库中测试覆盖率的不断提升,咱们颇有信心地继续推动,并在两周内完成了这项工做。libdeno
最终在 0.29.0 版本中被彻底替换删除,此后 rusty_v8 也经历了绑定类型安全性相关的重要重构。java
本月发布的版本:0.28.0、0.28.1、0.29.0、0.30.0、0.31.0。git
精读笔记:github
参考资料:web
本月咱们完全地重构了 deno fmt
。与此以前,deno fmt
是一个简单的子命令,其在背后只是最终指向 prettier
的“deno run”的一个别名。这意味着在首次运行 deno fmt
以及每次 prettier
升级后,用户都必须下载 prettier
的最新版本。这和 Deno 承诺的内置工具开箱即用的原则很不契合。同时,prettier
真的很慢,其性能也有不少问题。正则表达式
咱们被推荐了 David Sherret 的 dprint 库——一个基于 Kang Dong Yun 的 SWC JavaScript 解析器、并由 Rust 编写的代码格式化工具。dprint
能够和 prettier
库同样的工做,但速度却要快上好几个数量级。通过了一些初步测算后,咱们决定在 deno fmt
中使用 dprint
。chrome
deno test
也有在首次运行该命令时从标准库中下载模块的问题。这致使添加了新的 Deno.test()
API,而且 deno test
CLI 子命令也让测试成为了 Deno 的一等公民。typescript
本月发布的版本:0.32.0、0.33.0、0.34.0、0.35.0。
精读笔记:
deno fmt
:Deno 内置工具之一,用来格式化 TypeScript/JavaScript 代码。早期依赖 prettier
,如今由基于 Rust 语言的 dprint 提供支持,速度和性能都有所提升。deno test
:deno 内置工具之一,开箱即用提供测试基本功能。参考资料:
阻碍 Deno 1.0 发布正式版的主要缘由是缺乏 Chrome Devtools 的支持。所以,咱们花了不少精力来增长对 V8 调试器的支持以及提升使用 Chrome Devtools 链接到 Deno 进程的能力。
CLI 中也添加了两个新的命令:deno doc
和 deno upgrade
。
咱们同时经历了构建过程的巨大改进。与此以前,Deno 中的每一次构建都会致使 V8 从源码级别进行从新构建。V8 是一个庞大的 C++ 项目,经常须要花费 30 多分钟来对其进行构建。尽管有大量的构建缓存和更多技巧,咱们也一直难以克服得更好。如今,咱们增长了 rusty_v8 在 Github 发行版上生成和下载预构建过的静态库的能力,从而容许 Deno 构建过程彻底绕过 V8 的构建。这简化并加快了 CI 的构建,同时更重要的是,这让贡献者变得能够更轻松地构建 Deno。
本月发布的版本:0.36.0、0.37.0、0.37.1、0.38.0
精读笔记:
deno doc
:内置工具之一,来从源码中生成相关的 JSDoc 文档。--json
标志能够生成 JSON 格式,也能够用来生成模块文档。deno upgrade
:内置命令,能够直接经过此命令开自升级 Deno 版本。参考资料:
本月为 1.0 的正式发布作准备,重点关注在审阅 Deno
global 全局中的 API。这致使了诸多破坏性地改动。对此咱们很谨慎:咱们将不肯定的全部 API 都须要被移到 --unstable
标志以后。
这也是 1.0 版本的重要承诺;在 2.0 发布以前,标记为稳定的 Deno API 将不会有破坏性的更改。
本月是 Deno 版本以 0.x.y 命名的最后阶段。
本月发布的版本:0.39.0、0.40.0、0.41.0、0.42.0。
精读笔记:
本月初标记删除了以下功能:
window.location
API删除的缘由是,咱们不想由于 JSON/WASM imports 缺乏底层规范支持、或者 deno crate 下有 Rust API 额外维护负担的状况下提供相关 API。
终于在 5 月 13 日——Ryan 最初发表 Deno 演讲的整整两年后,咱们正式发布了 1.0。
在社交媒体上,这个版本很是受欢迎。咱们的相关博客被广为传播。咱们也收获了大量的新用户和新贡献者。
发布后咱们紧张地回到了有关运行时重要组件的工做中:TypeScript 宿主中的依赖关系分析是使用 SWC 重写的。此次的改动标志着咱们开始着手用 Rust 来重写 TypeScript 基础架构的一些部分。
本月发布的版本:1.0.0-rc1、1.0.0-rc2、1.0.0-rc3、1.0.0、1.0.1、1.0.2、1.0.3。
精读笔记:
.json
文件能够在有 --allow-read
的状况下编写 Deno.readTextFile
或 Deno.readTextFileSync
来实现。此提议于 2018 年 10 月 21 日提出并讨论 (#1048)。import './foo.wasm'
的支持,但依然能够经过 WebAssembly API 来使用。1.0 发布后,从社区中收到最多的反馈之一就是 TypeScript 的编译和类型检查很是得慢。此后咱们着眼于改进 TSC 集成来支持增量类型检查。通过几回反复试验的 PR,咱们可以使功能正常工做,而且显著地改进了开发效率。尽管咱们经过利用 TSC 的增量 API 设法提升了类型检查的速度,但咱们仍然须要依靠它来 emit 已转义的源。TypeScript 的伟大设计原则之一是它只是一个具备附加语法的 JavaScript,所以剥离类型信息(转换为 JavaScript)是相对容易的操做。因此咱们设定了可以在 Rust 中使用 SWC 进行转移的同时,继续使用 TSC 进行类型检查的目标。
通过几个月的开发,在一个单独的仓库中,咱们添加了新的 deno lint
子命令。这是另外一个创建在 SWC JavaScript 解析器之上的项目。
本月发布的版本:1.0.4、1.0.5、1.1.0、1.1.0、1.1.2。
精读笔记:
这个月,咱们作出了一个艰难的决定:将内部运行时代码从 TypeScript 转换为 JavaScript。有几个因素致使了咱们作出这个决定:Deno 内部运行时代码的每一个构建过程当中,类型检查、快照前绑定,都是复杂而缓慢的构建步骤。咱们有两个独立的 TypeScript 编译器宿主。一个是 deno_typescript
crate 只用于构建过程,另外一个被包含在 Deno
二进制文件中。此外,整个过程对构建时间有显著影响:2 分钟的增量重建!经过使用普通的 JavaScript,咱们可以极大地简化内部构建依赖关系和整体复杂性。由于实际的 JavaScript 代码是由 TypeScript 编译器做为单个文件包生成的,因此咱们几乎没法控制输出代码的类型。ES 模块被转换为使用 bundle 的 SystemJS 加载程序,这为最终 bundle 添加了大量代码。
本月发布的版本:1.1.3、1.2.0、1.2.1、1.2.2。
精读笔记:
JavaScript 规范包括许多内置功能,从数学函数到全功能正则表达式引擎。每一个新建立的 V8 上下文从一开始就有这些可用的函数。要使其工做,必须在建立上下文时设置全局对象(例如,浏览器中的 window 对象)和全部内置功能,并将其初始化到 V8 的堆中。从头开始作这件事须要至关长的时间。
幸运的是,V8 使用了一种快捷方式来加快速度:就像解冻速食披萨同样,咱们将预先准备好的快照直接反序列化到堆中,以得到初始化的上下文。在普通台式计算机上,这能够将建立上下文的时间从 40 毫秒减小到不到 2 毫秒。在普通移动电话上,这可能意味着 270 毫秒和 10 毫秒之间的差别。
原始文章: deno.land/posts/regis…
八月三日,咱们发布了一个全新的 deno.land/x 镜像源,能够用来经过使用 WebHooks 与 Github 集成。每当一个模块被更新,咱们的系统会下载并永远保存其源代码,这样咱们就能够依赖不可变的源代码连接。
因为在使用 Deno 基础设施时进行了一些非公开工做,咱们开始努力将 Deno 系统分解成更小的“op crates”,能够混合和匹配以生成定制的 V8 运行时。8 月份,咱们朝着这个目标迈出了第一步,发布了 deno_web crate,它提供了一些基本的 Web API,好比 Event
、TextUncoder
和 TextDecoder
。
这个月,基准系统使用 Rust 重写,这标志着减小 Deno 项目的构建依赖性的单调工做的开始。
本月发布的版本:1.2.3、1.3.0、1.3.1、1.3.2。
精读笔记:
本月,咱们发布了自 1.0 以来最大的功能版本。更多细节请参见 1.4.0 发布说明文档。
另外一个重要变化是关于项目的版本维护部分。发布时间表正式改变:从每个月发布一次改成每六周发布一次新的版本,以与 Rust 和 Chrome 项目相匹配。
本月发布的版本:1.3.3、1.4.0、1.4.1、1.4.2。
精读笔记:
console.log
的样式化输出,Deno 的目标是尽量地与 Web 兼容,如今正在努力更好地在终端下支持 CSS 样式化。目前支持的 CSS 属性包括 color
、background-color
、font-weight
、font-style
、text-decoration-color
和 text-decoration-line
等,具体须要根据开发者终端的 ANSI 支持度来决定。deno run --watch
。deno test --coverage
。本月发生的最大变化是在 TypeScript 编译器宿主中默认启用 isolatedModules
选项。此设置更改了 TypeScript 的行为,以确保每一个文件均可以由 TSC 之外的工具(如 SWC 和 Babel)隔离编译(而无需知道其类型或其它模块)。这一变化对模块生态系统产生了重大影响,一度使得一些流行的模块没法使用,直到维护人员调整代码以支持 isolatedModules
。
这个月咱们还在 SWC 中采用了新的 bundle 特性,这是对原始 TypeScript 编译器转向使用 Rust 方向的又一步迈进。
本月发布的版本:1.4.3、1.4.4、1.4.5、1.4.6、1.5.0、1.5.1。
精读笔记:
isolatedModules
:用来执行其余检查以确保单独编译(例如 transpileModule 或 @babel/plugin transform typescript)是安全的。若是设置了 isolatedModules
,则全部实现文件都必须是模块(这意味着它具备某种形式的导入/导出)。若是任何文件不是模块,则会发生错误:'index.ts' cannot be compiled under '--isolatedModules' because it is considered a global script file. Add an import, export, or an empty 'export {}' statement to make it a module
。本月咱们看到了 Kitson Kelly 长达数周重写编译管道(compilation pipeline)的总结。它进一步地提升了 TypeScript 的编译速度,更最重要的是减轻了大量的技术债务。
deno_crypto op crate 也被添加。
本月发布的版本: 1.5.二、1.5.三、1.5.4。
精读笔记:
在 12 月,咱们发布了 1.6 版本,包含了两个里程碑特性:自包含的二进制文件和语言服务器。deno compile
是 deno 的 bug 追踪器中受期待的特点之一。
经过提供的内置语言服务器提升了全部可以使用 LSP 协议的编辑器的良好开发体验。它致使了对 vscode_deno 的第三次翻新,此项工做目前还在进行中。
本月发布的版本:1.6.0、1.6.1、1.6.2、1.6.3。
精读笔记:
到 2020 年,咱们在项目和社区中看到了许多的增加。这让咱们对 Deno 进入 2021 年背后的支持倍感信心。请继续关注即将推出的激动人心的公告!
若是你有兴趣为 Deno 作贡献,或者只是想了解咱们的进展,请查看如下内容:
精读笔记:
data:
、重构运行时编译器 API、支持远程模块的访问令牌、IIFE budles、支持 React 17 jsx、rusty_v8 的 ICU、使用 WPT 测试内置 Web API、标准化运行时权限 API、结构化 worker 的 clone API、WebGPU 支持、bundles 的类型定义支持、ops 下的 V8 Fast API、URL 导入支持 blob:
等。全文译完,并在每一个章节作了简单的精读笔记。本次翻译不同凡响的地方在于,专业技术难度提升了一个数量级。本文中涉及了不少专业术语甚至要懂 Deno 特性发展历程才能翻译到位的地方,在精读过程当中也都一一解决。翻译过程当中产生了“Deno 词汇表”的想法,已同步到 deno-tutorial 仓库中。
《Deno 钻研之术》的精读系列将重点围绕官方博客展开,同时每翻译完一篇文章,也会争取 PR 合并到目前的 Deno 中文官网上。欢迎对 deno-tutorial 仓库进行 star 或关注公众号 (@ningowood) 来及时接收消息,携手助力 Deno 在 2021 变得更好!