commonjs路径加载遵循明确解析规则:相对路径以./或../开头,从当前文件出发转绝对路径后按后缀或目录入口查找;绝对路径以/开头,直接定位且跳过node_modules搜索;两者均经历路径解析、文件定位、缓存执行三环节,常见陷阱包括漏写./、跨层级引用混乱等。

CommonJS 里路径加载不是靠“约定俗成”,而是有明确的解析规则。相对路径和绝对路径都走同一套查找逻辑,但起点不同、安全性不同、适用场景也不同。
相对路径:从当前文件出发找模块
以 ./ 或 ../ 开头的路径,Node.js 会先把它转成绝对路径,再按规则查找:
- 如果路径指向一个文件(比如
require('./utils')),Node.js 会依次尝试加后缀:.js→.json→.node - 如果路径指向一个目录(比如
require('./utils')且utils是个文件夹),就按顺序找:utils/package.json#main→utils/index.js→utils/index.json→utils/index.node - 路径中不能省略
./或../;写require('utils')就会去node_modules里找,不是当前目录
绝对路径:直接定位,不依赖上下文
以 / 开头的路径(如 require('/home/user/project/lib/helper'))会被 Node.js 当作根路径处理,直接读取对应文件或目录:
- 它跳过模块搜索路径(
node_modules查找、paths数组等),也不受当前工作目录影响 - 同样遵循后缀补全规则(
.js→.json→.node)和目录入口规则(index.js等) - 实际项目中极少用绝对路径,因为可移植性差;测试或 CLI 工具中偶尔用于规避路径歧义
路径加载背后的三个关键环节
无论相对还是绝对,CommonJS 加载都经历统一流程:
-
路径解析:把输入路径转为完整绝对路径(相对路径基于
__dirname,绝对路径直接使用) -
文件定位:判断目标是文件还是目录;是目录就查
package.json或默认入口;是文件就补后缀尝试 -
缓存与执行:首次加载时编译执行,结果存入
require.cache;后续同路径 require 直接返回缓存值
常见陷阱与建议
路径看似简单,但容易出错的地方很集中:
- 漏写
./:写成require('utils')本意是本地模块,结果去node_modules找,报错Cannot find module - 跨层级引用混乱:比如在
src/a/index.js中require('../../lib'),重构目录时极易断链 - 混用路径类型:同一项目中既有
./utils又有/full/path/utils,增加维护成本 - 建议统一用相对路径 + 明确层级;复杂项目可用
module.paths或工具(如alias配置)简化长路径
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











