no-unused-binary-expressions:从代码审查细节到生态系统改进 - ESLint - 可插拔 JavaScript 代码检查器

四年前在工作进行代码审查时,惊讶于Flow未对不必要的空值检查发出警告。上个月,TypeScript 5.6发布,带有禁止无用空值和真值检查的验证规则,在 GitHub 上的前 800 个 TypeScript 仓库中发现了近 100 个现有错误。

这两个事件相关联,因为四年前代码审查中的那个时刻促使作者编写了no-constant-binary-expressions规则,该规则可捕获各种错误,如期望空对象为假值、混淆!的优先级、混淆??||的优先级等。此规则又启发了新添加的 TypeScript 验证。

回顾事件时间线:

  • 2020 年 5 月:作者在工作中审查拉取请求时注意到可空值被设为非空值,但作者留下了处理不可能为null情况的if条件,开始思考 Flow 为何未指出,随后向 Flow 团队询问,得到 Flow 像 TypeScript 一样不健全的答案,且曾因检查错误导致问题而移除了检查,Brad Zacher 看到后提出基于语法的方法更安全。
  • 2020 年 8 月:作者将语法验证方法实现为内部 ESLint 规则,并在 Meta 的单体仓库中运行,发现识别出数百个现有错误。
  • 2020 年 10 月:Brad Zacher 建议作者将其作为 ESLint 的新核心规则提出,作者提交后得到认可。
  • 2021 年 11 月 - 2022 年 4 月:作者为开源重写该规则,因对 JSX 和风格等问题的不同立场花费大量精力。
  • 2022 年 7 月:作者决定写一篇关于新规则的博客文章,ESLint 团队正在重新设计网站并寻找更多博客内容,邀请作者在官方博客上发表。
  • 2023 年 11 月:博客文章登上 Hacker News 首页,可能是有人分享了作者发布的关于从 ESLint v9.0.0 开始在eslint:recommended中默认启用该规则的推文。
  • 2024 年 4 月:该规则在ESLint v9.0.0中默认启用,因在eslint:recommended中启用新规则是破坏性更改而等待新的主版本。
  • 2024 年 7 月:TypeScript 团队寻找扩展检查特定类型常量条件的想法时发现博客文章和代码,将其验证扩展到包括 ESLint 规则执行的大多数检查,在顶级 800 个 TS 仓库中发现 94 个实际错误,成功后在tsc中默认启用检查。
  • 2024 年 9 月:TypeScript 5.6发布默认验证以禁止常量空值和真值检查。

促成代码审查中的小观察推动有意义的生态系统范围改进的关键因素包括:Meta 的内部文化、单体仓库、文化的自主性、ESLint 的可插拔架构、ESLint 团队的开放性和支持、积极的沟通以及不满足于仅指出代码审查中的无用空值检查等。

未来展望:TypeScript 和 Flow 可内部跟踪已知健全的类型并报告错误,其他不健全语言可采用此方法,死代码消除技术可用于前端检测和报告错误。

结论:此努力跨越多年和多个组织,每个组织根据其优势和位置发挥了不同但关键的作用,共同推动了相关工作,活跃的思想交流是合作的关键。感谢[Brad Zacher]等的贡献。

阅读 11
0 条评论