主题
node_modules
node_modules 目录结构
- npm 从 npm 3 开始,使用 扁平化(flatten)安装 依赖。
- node_modules 目录下的包尽可能放在顶层,避免重复安装相同版本的依赖。
- 可能会导致 幽灵依赖(hoisted dependencies) 问题:
- 某个包 A 依赖于 B,但 B 可能被提升到了 node_modules 根目录,使得即使 package.json 没有 B,也能 require('B'),但依赖结构变化后可能会导致 B 丢失。
- npm 7+ 开始默认使用 package-lock.json 和 workspaces 进行优化。
bash
node_modules/
lodash/ # 直接安装的依赖
react/
react-dom/
A/ # A 依赖 B
node_modules/
B/ # A 需要的 B 版本被放在 A 内部(避免版本冲突)寻找策略
使用路径(相对路径、绝对路径)写法导入模块,例如:require(./a)。
- 文件查找
- 首先根据路径寻找
a文件, - 若找不到,会寻找
a.js、a.json文件。
- 首先根据路径寻找
- 文件夹查找
- 若找不到,会进入
a文件夹,寻找package.json文件中的main字段的指定文件。 - 若找不到
package.json文件或者其main字段文件不存在,则会在a文件夹下寻找index.js、index.json文件。
- 若找不到,会进入
使用非路径写法导入模块,例如:require(xxx)。
- 内置模块
- 首先去寻找内置模块,如:fs、path、http ……
- 第三方模块
- 若找不到,会认为是第三方模块,会从
node_modules文件夹中寻找。并且在node_modules中寻找的时候,也是遵循 文件查找 和 文件夹查找 的逻辑的。 - 若该层的
node_modules的没有找到,则会去上层的node_modules文件夹中寻找。
- 若找不到,会认为是第三方模块,会从
