
在 Node.js 中,require() 只能加载具体文件(如 ./moduleFolder/file.js),不能直接加载文件夹;若需通过文件夹路径导入,必须在该文件夹中提供入口文件(如 index.js)并导出所需内容。
在 node.js 中,`require()` 只能加载具体文件(如 `./modulefolder/file.js`),不能直接加载文件夹;若需通过文件夹路径导入,必须在该文件夹中提供入口文件(如 `index.js`)并导出所需内容。
Node.js 的模块加载机制要求 require() 的参数必须指向一个可解析的 JavaScript 文件(或 JSON、CJS 文件)。当你写 require("./moduleFolder") 时,Node.js 并不会自动遍历该文件夹查找类或导出对象——它会按以下顺序尝试定位入口:
- ./moduleFolder/index.js(优先)
- ./moduleFolder/index.json
- ./moduleFolder/package.json 中 main 字段指定的文件
- 若均不存在,则抛出 Cannot find module 错误。
因此,你当前的结构:
moduleFolder/
├── file.js → 导出 { module }
└── file2.js → 导出 { more }
无法通过 require("./moduleFolder") 直接访问 module 和 more 类——因为缺少统一入口。
✅ 正确做法:在 moduleFolder/ 下新增 index.js:
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
// moduleFolder/index.js
const { module } = require('./file');
const { more } = require('./file2');
// 统一导出,支持解构或点语法调用
module.exports = {
module,
more
};
然后在 test.js 中即可简洁使用:
const mymodule = require('./moduleFolder');
const instance1 = new mymodule.module('something');
const instance2 = new mymodule.more(true);
console.log(instance1.foo()); // "Hey, this is my module!"
console.log(instance2.foo()); // "Hey, this thing have been enabled"
⚠️ 注意事项:
- 发布到 npm 后,用户仍需遵循相同规则:require("your-module") 会自动查找 node_modules/your-module/index.js 或 package.json#main 指定的入口;
- 不要依赖 require("your-module/folder/file") 作为公共 API —— 这属于内部实现细节,易断裂;应通过 index.js 显式声明稳定导出;
- 若使用 ES Modules(.mjs 或 type: "module"),请改用 export / import 语法,并注意路径必须带扩展名(如 ./file.js)。
总结:文件夹本身不是模块,入口文件才是。合理设计 index.js 是构建可维护、易用的 npm 模块的关键一步。










