跳至主要内容

引入 API 历史记录 (GSoC 2024)

·阅读时间:7 分钟

Electron API 的历史更改现在将在文档中详细说明。


您好 👋,我是 Peter,2024 年 Google Summer of Code (GSoC) Electron 项目的贡献者。

在 GSoC 项目期间,我为 Electron 文档及其函数、类等实现了 API 历史记录功能,其方式类似于 Node.js 文档:允许在 API 文档 Markdown 文件中使用简单但功能强大的 YAML 架构,并在 Electron 文档网站上以良好的方式显示它。

详情

API 历史记录文档系统 / YAML 架构

在 Markdown API 文档中,函数/类等的历史记录现在以 YAML 代码块的形式放置在该项的标题之后,该代码块由 HTML 注释封装。

#### `win.setTrafficLightPosition(position)` _macOS_

<!--
```YAML history
added:
- pr-url: https://github.com/electron/electron/pull/22533
changes:
- pr-url: https://github.com/electron/electron/pull/26789
description: "Made `trafficLightPosition` option work for `customButtonOnHover` window."
deprecated:
- pr-url: https://github.com/electron/electron/pull/37094
breaking-changes-header: deprecated-browserwindowsettrafficlightpositionposition
```
-->

* `position` [Point](structures/point.md)

Set a custom position for the traffic light buttons. Can only be used with `titleBarStyle` set to `hidden`.

我相信像 Node.js 文档一样使用 YAML 是最佳方法,因为它易于阅读。API 历史记录并不十分复杂,理想情况下应该尽可能易于编写和阅读。

上面显示的最终设计实际上与我提出的设计有很大不同

<!--
```YAML history
added: v10.0.0
deprecated: v25.0.0
removed: v28.0.0
changes:
- version: v13.0.0
pr-url: https://github.com/electron/electron/pull/26789
description: Made `trafficLightPosition` option work for `customButtonOnHover` window.
```
-->

一个很大的变化是去除了版本号

"[...] 我们想提请注意关于该提案的一个相当重大的变化,它是在我们审查提案时讨论中提出的。[...]

[我们] 决定,使用 [最少] 缺点的方法将是仅使用 PR URL(指向 main 的根 PR)而不是像提案中那样使用硬编码版本字符串。

这可以作为单一的事实来源,然后可以用来推导出精确的版本号,如果将更改回移植到其他分支,则无需对 main 进行进一步的文档更改。"

— David Sanders (@dsanders11) 通过 Slack

我们也没有在 API 历史记录中包含删除内容,因为当从 Electron 中删除 API 时,也会从文档中删除它。

JavaScript 实现

我最初计划创建一个新的 @electron/docs-api-history-tools npm 包,其中将包含用于提取、验证/整理和转换文档文件中的 API 历史记录的脚本。

在编码阶段开始前大约一周,并在与我的导师进行了一些讨论后,我意识到这可能没有必要

"大家好,在我们的简报后,我一直在考虑这个项目:考虑到提取逻辑将不得不以不同的方式在 e/websitee/lint-roller 中处理,因为它们的依赖关系,也许没有必要为 API 历史记录内容创建一个单独的包?"

已提出已修改
proposedrevised

— Piotr Płaczek (我) 通过 Slack

我们最终决定不继续我的最初想法

"@Piotr Płaczek 我认为这很好!我认为如果我们发现无论如何都需要在两个实现之间共享大量代码,我们始终可以在以后的迭代中重构为一个单独的模块🙂"

— Erick Zhao (@erickzhao) 通过 Slack

相反,我们将这些不同的工具分散到与它们最相关的 Electron 存储库中

Electron 文档网站的 UI 和样式

我最初提议了一个简单的表格来显示 API 历史记录数据

设计原型(已关闭)设计原型(已打开)
demo1demo2

这是最终实现的设计

demo3

与原型几乎相同。最重要的补充是使用了 SemVer 范围,选择它们是为了更好地传达功能存在的版本(感谢 Samuel Attard (@MarshallOfSound) 的建议!)。

这很重要,因为更改经常会在受支持的 Electron 发布线上回移植,例如,修复程序可能会进入 Electron v32.0.0、v31.1.0 和 v30.2.0。这意味着它不存在于 v31.0.0 中,用户可能会错误地根据它存在于 v30.x.x 版本中而推断出这一点。

使用/样式指南

我添加了一个使用/样式指南,专门用于为新功能编写 API 历史记录文档。我详细描述了 YAML 架构的正确用法,提供了典型/有用的示例等。您可以在 此处 找到它。

迁移指南

由于现有的 API 需要迁移到新的文档系统,我创建了一个迁移指南。它包含了开发者迁移旧 API 时通常需要执行的步骤:查看重大更改、浏览过去的版本、可能需要查看旧的提交等等。然后指导开发者按照使用/样式指南为每个先前存在的类/函数等添加 API 历史文档。

遗憾的是,我想不出一种有效自动执行此操作的方法。这可能是一个非常适合 AI/ML 工程师的任务;但是,我不具备这些技能,并且过于担心意外地将幻觉引入到 API 历史中。即使自动化了,最终可能仍然需要由人工来验证信息😕。这项任务可能需要手动完成,逐个文件地进行,就像 Node.js 文档中所做的那样

交付成果

  • api-history.schema.json

  • lint-markdown-api-history.ts

    • 用于检查根据自定义 YAML(技术上是 JSON)架构编写的 YAML API 历史的脚本。
      • 有用的错误消息
      • 全面的文档/代码注释
      • 广泛的Jest Vitest 测试
      • 良好的性能
    • 实现于:electron/lint-roller#73
    • 使用于:electron/electron#42982
  • preprocess-api-history.ts

    • 执行简单的验证,以防错误的 API 历史记录设法进入存储库。还剥离了包含 API 历史块的 HTML 注释标签,因为Docusaurus无法解析它们。
    • 实现/使用于:electron/website#594
  • transformers/api-history.ts

    • 用于将 Markdown 文档文件中的 YAML API 历史块转换为Markdown/HTMLReact 表格(ApiHistoryTable.tsx)的脚本。
    • 实现/使用于:electron/website#594
  • ApiHistoryTable.tsx

    • 用于在文档网站上显示解析后的 API 历史数据的 React 表格组件。
      • 使用遵循网站其余部分设计的样式。
      • 响应式、可访问且总体上编写良好的 HTML、CSS 和 JS。
    • 实现/使用于:electron/website#594
  • styleguide.md

    • 新 API 历史文档系统的使用/样式指南部分。
      • 易于理解
      • 写得很好
      • 包含示例
    • 实现/使用于:electron/electron#42982
  • api-history-migration-guide.md

    • 新 API 历史文档系统的迁移指南。
      • 易于理解
      • 写得很好
      • 包含示例
    • 实现/使用于:electron/electron#42982

结论

我很享受开发此功能的过程,并从代码审查和与团队讨论其各种实现细节中获得了宝贵的经验。

我相信在文档中添加 API 历史记录将使使用 Electron 的开发人员的生活更加轻松,尤其是那些试图将其现有应用程序从几年前的 Electron 版本迁移的开发人员。

我还要衷心感谢我的导师

...以及 Electron 团队的其他成员,感谢他们回答我的问题并抽出时间为我的拉取请求提供反馈。我非常感谢。