Node.js 模块查找策略(require 完整流程)
Node.js 使用 require() 导入模块时,会按固定优先级逐级查找,找不到则抛出 Cannot find module 错误。
一、整体查找顺序(4 大步骤)
| 优先级 | 步骤 | 说明 |
|---|---|---|
| 1 | 内置模块 | 直接命中核心模块,不往下走 |
| 2 | 文件查找 | 以 ./ ../ / 开头的路径 |
| 3 | 文件夹查找 | 文件找不到时把路径当文件夹处理 |
| 4 | node_modules | 非路径、非内置 → 逐级向上查找 |
二、详细查找规则
1. 内置模块(核心模块)
条件: 直接写模块名(非路径写法),且是 Node 内置模块。
直接加载,不往下查找。常见内置模块:
fs path http url querystring crypto events stream os
js
const fs = require('fs'); // 直接命中内置模块
2. 文件查找(路径以 ./ ../ / 开头)
按精确路径找文件,自动补后缀:
.js → .json → .node
都找不到则进入文件夹查找。
js
require('./a')
// 查找顺序:
// ./a → ./a.js → ./a.json → ./a.node → 把 a 当文件夹
3. 文件夹查找
把路径当作文件夹,按以下规则找入口文件:
- 看文件夹下是否有
package.json- 有 → 读取
main字段作为入口文件 - 无 → 进入下一步
- 有 → 读取
- 找
index.js→index.json→index.node - 仍找不到 → 抛出模块未找到错误
js
// ./a/package.json
{ "main": "k.js" }
require('./a') // → 加载 ./a/k.js
4. 第三方模块(node_modules)
条件: 非路径、非内置模块。
查找规则:
- 从当前目录的
node_modules开始找 - 找不到 → 向上一级目录的
node_modules找 - 一直递归到磁盘根目录
- 找到后,重复「文件查找 → 文件夹查找」
- 根目录都没有 → 报错
js
require('lodash')
// 当前目录 node_modules → 上级 → ... → 根目录 node_modules
三、极简伪代码(面试背诵版)
markdown
require(X)
1. X 是内置模块 → 加载,结束
2. X 以 ./ ../ / 开头
→ 找文件(补后缀 .js .json .node)
→ 找文件夹(package.json main / index.js .json .node)
→ 找不到 → 报错
3. 否则
→ 逐级向上找 node_modules/X
→ 找到后走文件/文件夹查找
→ 找不到 → 报错