在 Node.js 中,模块之间通过 模块导出(exports) 和 模块导入(require 或 ESModule 的 import) 来进行数据和功能的共享。下面我详细总结一下两种主要的模块系统:
一、CommonJS 模块(Node.js 默认使用方式)
✅ 模块导出方式
使用 module.exports
或 exports
导出数据、函数或对象:
1. 导出单个值(函数/对象/变量):
// math.js
function add(a, b) {
return a + b;
}
module.exports = add;
2. 导出多个内容:
// math.js
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
module.exports = {
add,
subtract
};
也可以使用 exports
(注意不能直接给 exports
赋新值):
// math.js
exports.add = function(a, b) { return a + b; };
exports.subtract = function(a, b) { return a - b; };
✅ 模块引入方式
使用 require
引入模块:
// app.js
const math = require('./math');
console.log(math.add(2, 3)); // 5
如果模块只导出一个函数或对象,可以直接使用:
const add = require('./math');
console.log(add(2, 3)); // 5
二、ESModule 模块(现代方式,需使用 .mjs
后缀,或在 package.json
设置 "type": "module"
)
✅ 模块导出方式
1. 默认导出:
// math.mjs
export default function add(a, b) {
return a + b;
}
2. 命名导出:
// math.mjs
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
也可以统一导出:
function add(a, b) { return a + b; }
function subtract(a, b) { return a - b; }
export { add, subtract };
✅ 模块引入方式
1. 导入默认导出:
// app.mjs
import add from './math.mjs';
console.log(add(2, 3));
2. 导入命名导出:
// app.mjs
import { add, subtract } from './math.mjs';
console.log(add(2, 3));
三、两者混用说明(❗不推荐)
虽然 Node.js 支持 CommonJS 和 ESModule,但混用可能出现问题:
- CommonJS 可以引入 ESModule,但必须是异步的
import()
。 - ESModule 引入 CommonJS 时,只能拿到整个
module.exports
对象。
四、总结对比
特性 | CommonJS (require ) | ESModule (import ) |
---|---|---|
默认支持 | ✅ Node.js 默认支持 | ❌ 需配置或使用 .mjs |
是否同步 | ✅ 同步 | ❌ 异步 |
导出方式 | module.exports , exports | export , export default |
引入方式 | require() | import |
应用场景 | 传统 Node.js 项目 | 现代项目、前后端统一、Tree Shaking |