cover
2022年8月4日 - 2023年7月31日

我 - 又被背刺了 🤦‍♂️

事情是这样,中午一位同学在开发时突然给我发了一张截图,里面是一段报错信息,大致就是不能读取 undefinednode 属性。

picture 3

由于内部 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 来着?于是乎我又搜索一番,确定有个 resolutionsyarn 下可用,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 分钟,完美守卫住了我的下班时间。

嗯???

等等,擦!怎么提交报错了,还 TM 冲突,我明明拉的最新版本。一问才知道,项目同学刚刚把某个依赖降级了,刚推上去想看看能不能解决,我 🤦‍♂️,梦破碎的声音。

不过还有两分钟呢,我赶紧合并代码,一把梭,确认无误 push,构建,一气呵成,拿起背包转身就走,下楼后收到企业微信小心:ok 了。终于我的时间守住了,回去的路上再顺便和中午那位同学说下问题,完美的防护。🐶

别问我为啥没有 lock 文件,不是我的项目,俺只是的打杂的。🐒