修复由 ProChat 依赖引起的构建错误

2024-04-27 Views react tech

记录一次 debug 经历以及学习到的经验教训

引入

前段时间一个风和日丽的下午,本地某一次提交推代码的时候 CI 挂了,报错信息如下:

  • error message:
Import trace for requested module:
 ../../node_modules/@ant-design/pro-editor/es/Highlight/hooks/useShiki.js 
 ../../node_modules/@ant-design/pro-editor/es/Highlight/index.js 
 ../../node_modules/@ant-design/pro-editor/es/index.js
 ../../node_modules/@ant-design/pro-chat/es/ActionIcon/index.js
 ../../node_modules/@ant-design/pro-chat/es/index.js
 ./components/Chat/Window/index.tsx
 ./components/Chat/index.ts
 ./components/index.ts

解决历程

At first

一开始的时候没有仔细分析,而是下意识凭经验,认为是 ProChat 版本的问题。于是看了一下 ProChat 的版本历史,好巧不巧,正好发现那两天 ProChat 疯狂发版,一两天之内发了十几个 patch version + minor version,而且都查不到 changelog ,“佐证”了我当时的想法,于是推断:某一个版本对依赖包造成了破坏式更改!
接下来按照这个思路尝试往前回滚小版本,尝试了很多 ProChat 的其他版本等等,没有取得理想效果。

反思

前述方法遇阻时也同步结合了一些常规方法,使用搜索引擎、ask GPT、查看 ProChat 源码 等等,但还是陷入了一时半会的瓶颈。后来冷静了一下之后我从头分析起这个问题:

  • 从 error message 来看,ProChat 引用了 ProEditor ,后者报错;
  • 再结合查看 ProChat 源码,发现其对 ProEditor 的依赖版本指定的是 latest, 顿感不妙;
  • 考虑到 项目中并没有直接依赖 ProEditor ,遂查找了一下 package-lock.json 的 git change history,果然发现端倪:
    • 在 0418 一个融进主分支的 commit 中,ProEditor的版本发生了破坏式更新:0.40.0 => 1.1.1,该更新修改了部分依赖导致构建失败;

解决方案:

  • 短期:在package.json 中显式声明:
    "overrides": {"@ant-design/pro-editor": "0.40.0"}
  • 中期:完善项目 CI
    • 本地 push 前会构建,所以这种导致构建失败的应该无法提交
    • gitlab 加个自动构建,MR 通过后自动运行一下,输出测试覆盖率与报告
  • 长期:replace ProChat with lobe-ui
    • 一开始使用 ProChat 很大程度是出于对 antd 出品的信任,这次在 debug 过程中发现 ProChat 使用人数少、版本维护混乱,文档更新不及时,更不用说依赖版本号设置为 latest 这种不专业的行为了,准备弃坑
    • 初定社区里评价较好的 lobe-ui ,择机重构

经验教训

  • Read The Fucking Error Message!
    • 虽然是很基础的道理,但还是经常经验主义,比如这一次,一开始对报错信息一扫而过,判定是 ProChat 包版本的问题,马上去check ProChat on npm/github/docs,正好发现他发包混乱,repo 和官网对应不齐,更加坚信了自己的判断,于是开始尝试不同的 ProChat 版本能不能修复,一度考虑 升级ProChat 大版本(btw,这个大版本发布非常随意,只有npm version history有记录,repo和 docs 里都没有反映)并修改业务代码进行适配,要不是发现文档里没对 breaking change 进行说明进而适配不下去,可能也就这么实践了,但也正是这时候到了晚上集体打球的时间点,中间的缓冲给了我重新思考的机会,才有后续
  • 依赖慎用 latest
    • 正好前两天看到了一个梗图,讽刺的就是 依赖 latest 导致 docker 每次构建不一致进而导致飞船坠毁,要是没看到那张梗图,说不定这次还会花更多时间
  • 不要过于迷信大团队的背书,多多自己验证,看看社区反馈

赏 支付宝扫码打赏 微信打赏

△