一个幻影依赖导致的问题

问题现象

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

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,由接入方进行安装依赖。
  • 使用工具扫描仓库是否存在其他幻影依赖的问题。
相关推荐
啃火龙果的兔子3 分钟前
前端单元测试覆盖率工具有哪些,分别有什么优缺点
前端·单元测试
「、皓子~31 分钟前
后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端+前端
前端·人工智能·微服务·小程序·go·ai编程·ai写作
就改了34 分钟前
Ajax——在OA系统提升性能的局部刷新
前端·javascript·ajax
凌冰_36 分钟前
Ajax 入门
前端·javascript·ajax
京东零售技术1 小时前
京东小程序JS API仓颉改造实践
前端
老A技术联盟1 小时前
从小白入门,基于Cursor开发一个前端小程序之Cursor 编程实践与案例分析
前端·小程序
风铃喵游1 小时前
构建引擎: 打造小程序编译器
前端·小程序·架构
sunbyte1 小时前
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ThemeClock(主题时钟)
前端·javascript·css·vue.js·前端框架·tailwindcss
小飞悟1 小时前
🎯 什么是模块化?CommonJS 和 ES6 Modules 到底有什么区别?小白也能看懂
前端·javascript·设计
浏览器API调用工程师_Taylor1 小时前
AOP魔法:一招实现登录弹窗的全局拦截与动态处理
前端·javascript·vue.js