背景:运行一个前端项目,在yarn install时报错,报错信息如下:
lru-cache@10.2.2: The engine "node" is incompatible with this module. Expected version "14 || >=16.14". Got "16.9.0"
lru-cache@10.2.2:引擎“node”与此模块不兼容。预期版本为“14||>=16.14”。得了“16.9.0”
因为项目在开发时,使用的就是node v16.9.0
版本,所以在选择同样的版本进行安装依赖,运行项目。
简单的解决方案
这个问题的解决办法也很简单:
按照提示我们将node
版本升级到v 16.14.2
# 安装指定版本的node
nvm insatll 16.14.2
# 查看node版本
node -v
# 如果不是想要的版本
# 查看已经安装的node版本
nvm list
# 使用某一版本
nvm use 版本号
# 重新instal依赖
yarn install
问题成功解决,项目顺利运行!!!
进阶,找到问题原因
但是…………
不能就这样,虽然是小升了一下node
的版本,但是尽量不要这样做,容易引发出新的bug
。
所以我准备找到为什么会出现这个问题。
在开发时node v16.9.0
版本下是没有问题的,并没有发生报错。
第一步:怀疑发生问题的依赖,是不是这个依赖包的版本升级了,要求node
的版本也变高了。
不过很遗憾,在查看了package.json
文件后并没有发现项目有依赖lru-cache@10.2.2
第二步:既然不是直接依赖,那就是依赖的依赖。
查看yarnlock
文件,在这里终于发现了lru-cache@10.2.2
这个依赖。
path-scurry:"^1.6.1"
dependencies:
lru-cache: ^10.2.0
问题就在这个path-scurry
上,巧了,这不是直接依赖,还需要继续找
glob@^9.3.3:
dependencies:
path-scurry "^1.6.1"
这时发现glob
的版本与Git
上的版本不一致,globs 是@^8.0.3:不需要依赖 path-scurry
,但是glob
也不在package.json
文件里。
babel-plugin-module-resolver@^5.0.0:
version "5.0.2"
dependencies:
glob "^9.3.3"
babel-plugin-module-resolve
出现在了package.json
文件里。
"devDependencies": {
"babel-plugin-module-resolver": "^5.0.0",
}
问题就在这里。
Git
服务器上的yarn.lock
文件是这样的。
babel-plugin-module-resolver@^5.0.0:
version "5.0.0"
dependencies:
glob "^8.0.3"
这个时间节点下,babel-plugin-module-resolver
的默认版本从v 5.0.0
变成了v 5.0.2
。这一变动导致子依赖的版本变动。
现在可以彻底解决这个问题,在package.json
文件里,把"babel-plugin-module-resolver": "^5.0.0"
,锁定babel-plugin-module-resolver
的版本。
"devDependencies": {
"babel-plugin-module-resolver": "5.0.0",
}
最后,yarn install
,成功解决。
从官网上追根溯源
我们去npm的官网看一下。
babel-plugin-module-resolver
中依赖的是"glob": "^8.0.3",
再来看一下"glob": "8.0.3",
这里我们可以看到并没有依赖path-scurry:"^1.6.1"
这个依赖包。
我们看一下babel-plugin-module-resolver
当前的最新版本,这里可以看出最新版本号是5.0.2
,所以我们在yarn install
或者npm install
时,安装了5.0.2
版本
从上图可以看出,babel-plugin-module-resolver:5.0.2
依赖了"glob": "^9.3.3",
在glob": "^9.3.3"
中需要依赖path-scurry
,
我们从path-scurry
中可以看出,依赖了我们的报错依赖包lru-cache
。
那么我们看一下lru-cache
官网上的代码文件
这里就可以对应上我们的报错信息了
lru-cache@10.2.2: The engine "node" is incompatible with this module. Expected version "14 || >=16.14". Got "16.9.0"