pnpm 安装依赖后为什么某些包版本和 package.json 不一致?

UI宁蒙 阅读 10

我用 pnpm install 装完依赖,发现 node_modules 里有些包的版本跟 package.json 里写的不一样,明明没改过 lock 文件啊?

比如我写的是 "lodash": "^4.17.21",结果装出来是 4.17.20。是不是 pnpm 的解析逻辑和 npm/yarn 不一样?

顺便贴一下我项目里用到的一段 CSS,应该不影响吧:

.button {
  background: #007bff;
  color: white;
  border: none;
  padding: 8px 16px;
  border-radius: 4px;
  transition: background 0.2s;
}
.button:hover {
  background: #0056b3;
}
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
ლ亚美
ლ亚美 Lv1
啊哈,这个问题我遇到过,pnpm 的版本解析确实有点小脾气。先说结论:这是 pnpm 的 peer dependencies 策略导致的,不是 bug。

重点来了:
1. 如果某个包有 peer dependencies,pnpm 会尝试安装一个满足所有 peer 要求的版本
2. 你的 lodash 4.17.20 可能是其他依赖要求的,pnpm 选了个能满足所有依赖的版本
3. 用 pnpm why lodash 就能看到是哪个包导致了降级

顺便说下你的 CSS,虽然和问题无关,但可以优化成这样:
.button {
--btn-bg: #007bff;
background: var(--btn-bg);
color: white;
padding: 0.5rem 1rem;
border-radius: 4px;
transition: background 0.2s;
}

.button:hover {
background: color-mix(in srgb, var(--btn-bg) 90%, black);
}


用 CSS 变量和 color-mix 会让主题色维护更方便。

回到 pnpm 问题,如果你想强制版本,可以:
1. 用 pnpm add lodash@4.17.21 重新安装
2. 或者在 package.json 里去掉 ^ 直接写死版本号
3. 用 pnpm update 更新所有依赖
点赞 1
2026-03-09 16:08