一个幻影依赖导致的问题

问题现象

日常监控告警发现一个新的错误告警,开始跟进这个错误的排查。

vbnet 复制代码
(0, n.isAxiosError) is not a function

排查过程

  1. 根据监控日志,定位错误的代码,发现isAxiosError为undefined的报错,在仓库查找出错的代码位置
  1. 出错的代码内容,发现是某次组件改造的时候,在common包里面引入axios,但是并没有在package.json声明依赖。

  2. 接下来有一个疑问:这么明显的错误,为什么打包的时候没有报错,如果依赖没有安装,照道理代码编译的时候就会抛出错误,中断编译。

  3. 尝试修改了引入不存在的包依赖,这时候是会报错找不到对应的包。

  4. 进一步在common增加打印,发现是有axios这个依赖,但是没有isAxiosError的方法。

    查看axios的版本是0.18.1 ,这个版本里面没有isAxiosError 的方法,所以导致报错。翻了下axios的版本发布记录,发现axios是在0.21.1 的版本才增加isAxiosError的方法。github.com/axios/axios...

  5. 进一步的疑问:为什么会命中0.18.1的版本,这个0.18.1的版本是怎么引入的?

  • 分析common包的引入方式:
  • common 使用 workspace协议,且在package.json中设置了"dependencyMeta": {"injected": true} ,解决peer dependencies依赖找不到的问题,injected为true,可以理解为把这个包运行一次 pnpm pack,然后再把 tar 包安装到 node_modules 硬链引入,相当于把这个包发包了然后再当作 npm 包安装一次,可以享受到整个项目的依赖提升。
  • 怀疑是幻影依赖,蹭到了其他 npm 包的 axios
  1. debugger查看在common引用axios的依赖查找路径。发现在对应目录temp/node_modules/.pnpm/node_modules下找到axios的依赖。

  2. .pnpm下面为什么还有个node_modules?

至此,了解到原因,就是因为幻影依赖的问题,项目可以正常打包,是因为common刚好蹭到其他依赖的axios包,只不过蹭到了一个低版本的axios。没有对应的方法,这个需要等到运行的时候才会发生报错。

改进手段

  • 由于历史项目,不能直接hoist=false; 最终的解决方式在common增加axios依赖;或者设置peerDependencies,由接入方进行安装依赖。
  • 使用工具扫描仓库是否存在其他幻影依赖的问题。
相关推荐
大家的林语冰7 小时前
前端周刊:axios 疑遭朝鲜黑客“钓鱼“;CSS 新函数上线;npm 上线深色主题;Oxlint 兼容表;ESLint 支持 Temporal......
前端·javascript·css
哀木8 小时前
一个简单的套壳方案,就能让你的 Agent 少做重复初始化
前端
问心无愧05138 小时前
ctf show web入门27
前端
小村儿8 小时前
给 AI Agent 装上"长期记忆":Karpathy 的 LLM Wiki 思想,我做成了工具
前端·后端·ai编程
竹林8188 小时前
用ethers.js连接MetaMask实现Web3钱包登录:从踩坑到稳定运行的完整记录
前端·javascript
heyCHEEMS9 小时前
如何用 Recast 实现静态配置文件源码级读写
前端·node.js
心连欣9 小时前
从零开始,学习所有指令!
前端·javascript·vue.js
review445439 小时前
大模型和function calling分别是如何工作的
前端
东东同学9 小时前
耗时一个月,我把 Nuxt 首屏性能排障经验做成了一个 AI Skill
前端·agent
冴羽10 小时前
超越 Vibe Coding —— AI 辅助编程指南
前端·ai编程·vibecoding