likes
comments
collection
share

人麻了,明明有node_modules运行还是报错找不到依赖今天要拉一个新项目做新的需求,运行项目的过程中出现了各种问题

作者站长头像
站长
· 阅读数 45

前言

今天要拉一个新项目做新的需求,运行项目的过程中出现了各种问题,依赖装不上,node版本不兼容,最后用nvm修改了node版本之后还是无法安装依赖,最后只能用最笨的办法让同事把整个node_modules打包发给我,按理说到这里问题都解决了,只要run dev一下就能运行了,结果运行的时候还是出现了问题,显示依赖不存在,这就给我看的一脸懵了,明明依赖都在,为什么还显示不存在,这终端咋睁着眼睛说瞎话,后面查了资料发现,这涉及到pnpm处理幻影依赖的原理有关。

pnpm

pnpm是处理monorepo的一种方式,支持单舱多包,pnpm显著加快了安装依赖的速度,减少了依赖包占用的电脑硬盘空间。具体的我就不介绍了,大家感兴趣的自己去看文档 pnpm.io/zh/

幻影依赖

幻影依赖(Phantom Dependencies)是指在项目的依赖树中出现了一些不存在的依赖项。这种情况通常发生在包管理器(如 npm、Yarn 等)安装依赖时,由于依赖版本冲突或其他原因导致的。

具体来说,幻影依赖的原因可能包括:

  1. 版本冲突:当项目中依赖了同一个库的不同版本时,可能会出现幻影依赖。比如项目 A 依赖 library@1.0.0,项目 B 依赖 library@2.0.0,那么在项目 A 的依赖树中可能会出现一个指向 library@2.0.0 的幻影依赖。
  2. 依赖传递:当一个依赖引入了另一个依赖,但该依赖在项目的依赖树中不存在时,也会产生幻影依赖。比如 library-A 依赖 library-B,但 library-B 并未被项目直接依赖。
  3. 安装错误:在某些情况下,包管理器的安装过程可能出现问题,导致项目的依赖树中出现不存在的依赖项。

pnpm是怎么解决幻影依赖的

这里先等等,这里还涉及到一个知识点,软链接硬链接。 先打开一个终端,随便进入到一个文件夹内,使用ls -li查看文件的详细信息

人麻了,明明有node_modules运行还是报错找不到依赖今天要拉一个新项目做新的需求,运行项目的过程中出现了各种问题

前面这一串数字叫索引节点(inode),在文件系统中,保存在磁盘分区中的文件,不管是什么类型,系统都会给他分配一个编号它是该文件或者目录在系统中的唯一标识. 后面那一串数字叫链接数,表示有多少个文件指向这一块区域.

硬链接

硬链接就是创建一个新的文件,它的inode和源文件一样,然后链接数+1,有点类似于深拷贝,删除源文件不会影硬链接。我的理解就是文件内的数据是存在内存中block区域的,inode作为它的唯一标识符,所谓的文件其实就是给它取了一个文件名,这个文件指向这块区域,硬链接就是给它创建了一个新的文件名,所以删除源文件不会对硬链接产生影响。

软链接

软链接也是创建一个新文件,inode和源文件不一样,它里面只存放了链接的文件地址(源文件),访问文件内容时通过软链接的链接地址去访问源文件,有点类似于浅拷贝,删除源文件软链接就找不到对应的文件。

知道了软链接和硬链接之后就可以继续聊了,pnpm会把所有的依赖都下载到本地的根node_modules,然后项目里的node_modules采用了软链接的方式,看到这里,相信大家就能明白为什么明明有node_modules运行项目还是会显示file not found了,因为你的本地没有相应的依赖,所以链接不到。npm和yarn不会出现这样的问题,因为他们都是硬链接,所以可能会出现依赖重复安装的情况。

结尾

最笨的方法行不通,最后只能去找到项目依赖安装失败的原因,把问题解决然后老老实实的安装依赖,今天又是当牛马的一天。写作不易,点个赞再走吧,相信这篇文章会对你有帮助的。

转载自:https://juejin.cn/post/7387805419950227496
评论
请登录