重构周:重构我的 Obsidian 插件

最近,我花了一周时间彻底重构我早期开发的 Obsidian 插件。目前进度:

为什么要重构?

在重新审视我最初的 Obsidian 插件时,我发现了许多需要改进的地方:

  • 代码结构不清晰:例如,在Task Progress Bar中,渲染组件没有正确分离,使得定位核心问题变得困难
  • 实现方法不优雅:New bullet with time 的技术债务太多了,比如错误地使用 Codemirror 的监控按键行为来监控文本的更新行为
  • 整个代码库缺乏适当的错误处理
  • 大量性能优化点:Daily Notes Editor经常无法正确卸载日记实例
  • 文档不完整
  • 过时的 API 使用方式和架构模式(几乎存在于所有插件中)

随着 Obsidian API 的发展和我编程技能的提升,是时候为这些插件注入新的生命力了。

重构过程中的发现

技术债务

快速开发的代码往往会积累技术债务,而由于 2022 年我的 TypeScript 和 React 技能仍然很菜,技术债务被大大放大。当处理我三年前、甚至一年前写的代码时,我经常发现自己在想,"我当时在想什么?"——面对难以理解的代码,充满错误使用的方法,并且缺乏任何注释。有时候,我只能通过使用 console.log 来查看正在处理的数据,才能理解某些代码段的目的。

为了重构方便,使用 TypeScript

幸运的是,我一开始就使用了 TypeScript,这在重构过程中提供了许多类型参考。然而,我也发现了许多不正确的类型使用和命名错误。

模块化设计的重要性

将大功能分解为小的、可测试的模块极大地提高了代码质量。这种方法使得:

  • 测试更简单
    • 尽管 Obsidian 仍然缺乏便捷的自动化测试解决方案
  • 功能扩展更灵活
    • 这在较小的插件中不是问题,但在后期功能扩展时容易积累
  • 代码复用更容易(尽管我没有发现不同插件之间有太多适合复用的代码)

具体改进

对于每个插件,我实施了以下改进:

  1. 代码重构:采用更清晰的文件组织和模块化设计
  2. 性能优化:减少不必要的操作,优化渲染和数据处理
  3. 测试覆盖:添加单元测试和集成测试(不幸的是,覆盖率仍然较低,也许未来会优先提高该方面的花的时间)
  4. 文档更新:改进用户和开发者文档
  5. 现代化 API 使用:利用 Obsidian 最新的 API 以及 Codemirror 最新的 API

经验教训

  • 持续重构的价值:定期代码审查和改进是维持项目健康的关键
  • 用户反馈的重要性:各种 Edge case 的来源都是用户,用户是推动产品前进的最大动力
  • 测试驱动开发:使用测试来指导重构过程和功能更新

下一步计划

完成重构后,我对未来的插件开发有了更清晰的计划:

When developing any software, you are often faced with difficult choices. To help guide design decisions, this project adheres to the following principles:

  • Leave no trace: The plugin must not leave any plugin-specific configuration in the notes, such as custom front matter properties. Notes may be shared with colleagues and teams who don't use Obsidian. If the user stops using this plugin, they shouldn't have to clean up all their notes.
  • Keep it native: The plugin should look and feel like it's native to Obsidian. The plugin should also prefer native Web APIs over custom components whenever possible.
  • Stability over features: This plugin is geared towards professionals with high demands on reliability. Any bug reports and usability issues will be prioritized over new features.
  • 添加更多单元测试
  • 使用新的 Obsidian API 功能开发创新功能

当然,还有几十个插件等待我的重构注意。这些插件是许多用户日常工作流程的重要组成部分,所以我希望尽快完成所有重构行动!