Node.js 模块查找策略(require 完整流程)

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. 文件夹查找

把路径当作文件夹,按以下规则找入口文件:

  1. 看文件夹下是否有 package.json
    • 有 → 读取 main 字段作为入口文件
    • 无 → 进入下一步
  2. 找 index.js → index.json → index.node
  3. 仍找不到 → 抛出模块未找到错误
js 复制代码
// ./a/package.json
{ "main": "k.js" }

require('./a')  // → 加载 ./a/k.js

4. 第三方模块(node_modules)

条件: 非路径、非内置模块。

查找规则:

  1. 从当前目录的 node_modules 开始找
  2. 找不到 → 向上一级目录的 node_modules 找
  3. 一直递归到磁盘根目录
  4. 找到后,重复「文件查找 → 文件夹查找」
  5. 根目录都没有 → 报错
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
   → 找到后走文件/文件夹查找
   → 找不到 → 报错
相关推荐
FungLeo42 分钟前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构
总要学点什么1 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
小厨勺子5 小时前
我用AIUI给Rokid眼镜做了个随身换算智能体
javascript
夕水6 小时前
我用trae重构了ew-color-picker,一个插件化架构的现代颜色选择器
前端·javascript·开源
w3296362717 小时前
飞书接单到月度结算:我用一个 DSH 插件跑通鞋类采购 WMS,附 22 项验收
pdf·node.js·飞书·后端开发·ai agent
FYKJ_20108 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
总要学点什么8 小时前
第106篇:三维特效-流动线效果——让一颗光点沿整条线一路滚到头
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
2分钟速写快排15 小时前
孔乙己的茴字有多少种写法?|AI 对话实时通信的三种实现
前端·javascript·github
濮水大叔19 小时前
Cabloy/Vona 为什么不需要 NestJS 的 Dynamic Module
typescript·node.js·nestjs
匠云创新1 天前
读完一万段要两分钟:我们把标书读取从 WPS 对象模型搬到了 docx 解析
性能优化·node.js