我 - 又被 npm 背刺了 🤦‍♂️

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 事情是这样,中午一位同学在开发时突然给我发了一张截图,里面是一段报错信息,大致就是不能读取 undefined 的 node 属性。

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

网络异常,图片无法展示
|

由于内部 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 分钟,完美守卫住了我的下班时间。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
JavaScript 内存技术
40 # npm 的使用
40 # npm 的使用
65 0
|
2月前
|
JSON JavaScript 开发工具
NPM 使用介绍
10月更文挑战第2天
181 0
|
6月前
|
缓存 前端开发 JavaScript
npm 详解
npm 详解
180 2
|
7月前
|
存储 缓存 JavaScript
npm详解
npm详解
66 0
|
7月前
|
JavaScript 前端开发 Java
npm使用
npm使用
|
7月前
|
缓存 开发工具 git
npm使用介绍
npm使用介绍
|
7月前
|
存储 JavaScript 前端开发
什么是npm?
什么是npm?
|
7月前
|
JavaScript
什么是npm?能干什么?
什么是npm?能干什么?
|
关系型数据库 MySQL 开发工具
|
存储 JavaScript 安全
npm的介绍
npm的介绍
309 0