CommonJS中可导出类的实例化对象而非类本身。最常用方式是直接赋值module.exports为new实例;也可用函数实现懒加载单例;还可导出含多个实例的对象。注意不可用ES Module语法export。

CommonJS 规范中,模块导出的是一个对象(module.exports),你可以直接将类的实例赋值给它,从而实现“导出类的实例化对象”。这不是导出类本身,而是导出该类创建好的、已初始化的对象。
直接导出实例(最常用)
在模块文件中,先定义类,再 new 一个实例,最后赋值给 module.exports:
// logger.js
class Logger {
constructor(name) {
this.name = name;
this.count = 0;
}
log(msg) {
console.log(`[${this.name}] ${msg} (#${++this.count})`);
}
}
<p>// 导出一个预创建的实例
module.exports = new Logger('AppLogger');
</p>
使用时直接引入即可获得该实例:
// app.js
const logger = require('./logger');
logger.log('started'); // [AppLogger] started (#1)
导出单例:带懒加载或条件初始化
如果初始化较重,或需控制时机,可封装为函数返回实例(仍属 CommonJS 风格):
// db.js
class Database {
constructor() {
console.log('Connecting to DB...');
// 模拟连接逻辑
}
}
<p>let instance = null;
module.exports = () => {
if (!instance) {
instance = new Database();
}
return instance;
};
</p>
使用时调用一次获取实例:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
// app.js
const getDB = require('./db');
const db = getDB(); // 只首次调用才真正初始化
注意:不要混淆 export 和 module.exports
以下写法是错误的(常见误区):
class Config { /* ... */ }
export default new Config(); // ❌ ES Module 语法,Node.js 的 CommonJS 不识别
CommonJS 中只能用 module.exports 或 exports.xxx。若想同时支持两种模块系统,需额外配置(如通过 package.json 的 "type": "module" 或构建工具),但本质已不属于纯 CommonJS。
扩展:导出多个实例(较少见但可行)
如果需要多个预设实例,可导出一个对象,包含多个实例属性:
// clients.js
class APIClient {
constructor(baseURL) {
this.baseURL = baseURL;
}
}
<p>module.exports = {
prod: new APIClient('<a href="https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39">https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39</a>'),
dev: new APIClient('<a href="https://www.php.cn/link/8e5687e2d6ab87e5da2f833f3e8986a4">https://www.php.cn/link/8e5687e2d6ab87e5da2f833f3e8986a4</a>')
};
</p>
使用时解构或点取:
const { prod } = require('./clients');
prod.request(...);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










