# 幽灵依赖是什么?
为什么会发生幽灵依赖?
# 1. npm/Yarn 的扁平化 node_modules
结构
- npm v3+ 和 Yarn 会将依赖的依赖(子依赖)平铺在项目根目录的
node_modules
中。 - 例如:项目安装
A
,而A
依赖B
,最终目录结构如下:
node_modules/
├── A/ # 直接依赖
└── B/ # 子依赖(本不应被项目直接访问)
1
2
3
2
3
- 此时,如果代码中直接
require('B')
,虽然能运行(因为B
在node_modules
根目录),但B
并未在package.json
中声明,这就是幽灵依赖。
# 2. Monorepo 中的依赖提升
- 在 Monorepo(如 Lerna、Yarn Workspaces)中,子包的依赖可能会被提升到根目录的
node_modules
,导致子包直接引用未声明的依赖。