commonjs模块解析由node.js运行时完成,优先内置模块,再按相对/绝对路径加载文件,最后沿目录树向上查找node_modules;定位后依package.json的main字段、index文件及扩展名补全规则确定入口。

CommonJS 定位第三方库,本质是 Node.js 根据 模块标识符 从当前目录开始,沿 node_modules 目录树逐层向上查找的过程,不依赖 Webpack 或构建工具,纯由运行时决定。
路径解析优先级:先内置,再文件,最后 node_modules
当执行 require('lodash') 时,Node.js 按以下顺序判断:
- 是否为内置模块(如
fs、path)?是则直接返回,不查文件系统 - 是否为相对路径(
./或../开头)?是则按当前文件位置解析本地文件或目录 - 是否为绝对路径(以
/或盘符开头)?是则直接加载对应路径 - 否则视为第三方模块名,启动
node_modules查找流程
node_modules 查找规则:从当前文件向上递归
查找从 发起 require 的文件所在目录 开始,逐级向上遍历父目录,每层都检查是否存在 node_modules/模块名:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 假设
src/controllers/user.js执行了require('axios') - Node.js 先检查
src/controllers/node_modules/axios - 不存在,则检查
src/node_modules/axios - 再检查项目根目录下的
node_modules/axios - 若仍找不到,继续向上直到文件系统根目录;全部失败则抛出
Cannot find module
定位到包后,如何确定入口文件?
找到 node_modules/axios 目录后,Node.js 按固定逻辑确定实际加载哪个文件:
- 读取
package.json中的"main"字段(如"main": "index.js"),并加载该文件 - 若无
main,或指定的文件不存在,则尝试index.js→index.json→index.node - 若包含
"exports"字段(ESM 优先场景),CommonJS 会回退到main或默认规则,除非exports显式声明 CommonJS 入口
扩展名自动补全与目录兜底
即使你写的是 require('lodash') 这样没扩展名的调用,Node.js 也会内部尝试多个后缀:
- 先按
main字段路径加载(如./lib/index.js) - 若路径不带后缀,会依次尝试
.js→.json→.node - 如果
main指向一个目录(如"main": "dist/"),Node.js 会进入该目录,再按index.js等顺序查找
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










