恋の歌的logo
Auto
归档 标签

使用pnpm来代替yarn1解决幻影依赖

发表于2021-12-10 10:22
更新于2023-02-13 18:28
分类于编程
总字数535
阅读时长 ≈2 分钟

前言 🔗

之前在使用 vuepinia 的时候出现的问题

使用 pnpm 来代替 yarn1 解决幻影依赖

正文 🔗

什么是 Phantom dependencies 幻影依赖 🔗

一个库使用了不属于其 dependencies 里的 Package 称之为 Phantom dependencies(幻影依赖、幽灵依赖、隐式依赖)

为什么会产生 Phantom dependencies 幻影依赖 🔗

在之前,我个人都是使用 yarn1 来进行依赖安装

yarn1 有个特性, 他会把依赖扁平到 node_modules

举个例子,如果现在我安装了依赖 A , 依赖 A 依赖了依赖 B

那么,依赖 B 并不会安装到依赖 A 文件夹的 node_modules 中,即 node_modules/A/node_modules/B

而是安装到根 node_modules 中,即 node_modules/B

Phantom dependencies 幻影依赖带来的问题 🔗

package.json 中并没有安装依赖 B, 但是在代码中却可以引用到 B 导出的功能

并且打包并不会造成错误,因为依赖 B 确实存在 node_modules 目录下

但是如果此时删除依赖 A ,那么项目中使用到依赖 B 的代码就会报错, 因为依赖 B 一同被删除了

代码复现 🔗

我们新建一个 vite + vue3 的项目,然后把初始的依赖给安装了

这时 node_modules 长这样

可以看到这时候已经出现幻影依赖了,像 rolluppostcssesbuild 等都是不存在 package.json

但是代码中却可以引用到

并且运行正常

问题解决 🔗

知道出现这个问题的原因是 yarn1 本身扁平依赖之后

我们需要换一个包管理器,这里选择了 pnpm

pnpm 依然会扁平化依赖,但是却不会直接出现在根 node_modules

而是 node_modules/.pnpm

在安装完依赖之后,我们可以看到 node_modules 下非常干净

重新运行项目,发现已经无法启动了,提示找不到特定的依赖,幻影依赖这个问题,就被解决了

#npm
#yarn
#pnpm
#node_modules
哦呐该,如果没有评论的话,瓦达西...