事情是这样,中午一位同学在开发时突然给我发了一张截图,里面是一段报错信息,大致就是不能读取 undefined
的 node
属性。
由于内部 CLI
工具(内部多个项目的开发、构建都需使用 CLI)是我负责的,所以就来找我问问啥情况,因为目前就他一个人出现这个状况,我也没太在意,就问他怎么出现的,据他所说是他的某同事本地安装了两个包,然后他将其删除了,然后就出现这个状况了。
于是乎我就去看了他项目的代码,然后发现他项目里很多 import 了其中某个删除包的代码。虽然上面的报错信息看起来并不是包不存在的报错,但他这删了包不删引用的操作着实吓到我了。于是乎我吐槽一番让他把包或者引用修改完了再试试。然后隔了好久他也没再提过这个问题,我以为解决了也没放在心上。
下班倒计时
然而,下班前半小时,突然另一位同学找到我,说他在 CI/CD
发布时报错了(CI/CD
中使用 CLI
进行构建),我上去看了下日志,居然是一个报错 🤦♂️,这。。。不是想让我加班么。不可能,嘿嘿决不妥协。
于是乎我赶紧先尝试本地复现,报错信息虽然是我写的某个模版文件里的代码报错,但是我确信和该文件无关(就是这么自信 🐒),应该是依赖的问题。一番操作无果后又删除 lock
文件、node_modules
后,重新安装,终于使用 npm
安装后成功复现(yarn
安装无法复现,node_modules
不删直接用 npm
安装也无法复现,离谱,由于时间有限没有深究)。基本可以断定,肯定是某个依赖包升级又给我玩背刺了。🤦♂️ 此时距离下班只剩下 12 分钟时间紧急(npm install
实在太慢了,还经常报错,浪费了宝贵的几分钟)。
倒计时 12 分钟
然后我变就盯上了上面截图中的报错日志,想从日志中定位。
at plainFunction (.../node_modules/@babel/helper-wrap-function/lib/index.js:69:17) at wrapFunction (.../node_modules/@babel/helper-wrap-function/lib/index.js:128:5) at _default (.../node_modules/@babel/helper-remap-async-to-generator/lib/index.js:47:35) 复制代码
看到报错栈从 @babel/helper-wrap-function
中出现,于是我打开这个文件,定位到了这段代码:
function plainFunction(path, callId, noNewArrows, ignoreFunctionLength) { let functionId = null; let node; if (path.isArrowFunctionExpression()) { path = path.arrowFunctionToExpression({ noNewArrows }); node = path.node; } else { node = path.node; } // ... } 复制代码
没毛病了,应该就是这里的 path
出问题了,于是我去看了看这个包的更新日志。
7.18.10 2 days ago 7.18.9 16 days ago 复制代码
好家伙,2 天前更新,应该没跑了,为了确信我又点进 GitHub
,果然找到了一条相关的 issue。可以定案了,就是这货更新搞的鬼,不是我的锅(松口气)。
倒计时 8 分钟
问题确定了,解决方案就好说了,直接锁定该包的版本就是了(别问我为什么这个项目没有 lock
文件,我不知道,不是我干的,逃。。。)。
可是。。。 我 TM
忘了怎么锁定来着(用的太少早就忘了),好像是 resolution
来着?于是乎我又搜索一番,确定有个 resolutions
,yarn
下可用,npm
不知道,不管了先试试。结果不出所料,无效。行吧只能去 package.json
描述找找了,终于找到了这个: [overrides](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides)
,就是他了。
于是我赶紧在 package.json
中添加了:
"overrides": { "@babel/helper-wrap-function": "7.18.9" } 复制代码
然后本地 npm i
确定版本锁定生效,美滋滋的提交了,此时距离下班还有 3 分钟,完美守卫住了我的下班时间。