commonjs中文件夹模块的默认入口是index.js,当require路径指向目录且无package.json#main时,node.js按index.js→index.json→index.node顺序查找;index.js无语法特殊性,纯由路径解析规则决定,其module.exports即模块对外接口。

当一个文件夹被当作模块引入时,CommonJS 会自动查找并加载其中的 index.js 文件——这是它在文件夹模块加载中的默认入口机制。
index.js 是文件夹模块的隐式主入口
CommonJS 规范规定:如果 require 的路径指向一个目录(比如 require('./utils')),且该目录下没有明确指定文件名,Node.js 就会按固定顺序尝试加载以下文件:
-
./utils/package.json中"main"字段指定的文件(若有) - 否则,依次查找:
./utils/index.js→./utils/index.json→./utils/index.node
只要找到第一个存在且可解析的文件,就停止查找并执行它。因此 index.js 是最常见、最自然的兜底入口。
它不是语法强制,而是 Node.js 的路径解析规则
index.js 本身没有特殊语法地位,它不靠关键字或声明生效,而是由 Node.js 内部的 文件定位逻辑 实现的。这个过程发生在 require 执行阶段:
- 解析相对路径,转为绝对路径
- 判断目标是否为目录
- 若为目录,拼接
/index.js并检查文件是否存在 - 存在则读取、编译、执行,并缓存结果到
require.cache
这意味着你删掉 index.js,又没配 package.json#main,require 就会报错 Cannot find module。
导出内容直接决定模块对外接口
index.js 文件里的 module.exports(或 exports.xxx)就是整个文件夹模块的对外输出。例如:
// utils/index.js
const helper = require('./helper');<br>
const logger = require('./logger');<br>
module.exports = { helper, logger };
那么 const utils = require('./utils'); 得到的就是这个对象,使用者无需关心内部结构,只需约定好 index.js 的统一出口。
与 package.json#main 共存时,后者优先
如果目录下有 package.json,且含 "main": "lib/main.js",那么即使存在 index.js,Node.js 也会优先加载 lib/main.js。这说明 index.js 是“无配置时的默认行为”,而非不可覆盖的硬编码规则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











