Node.js,如何导入和导出模块

在 Node.js 中,模块系统遵循 CommonJS 规范(默认)和 ES Modules(需配置)。以下是两种方式的详细说明:


一、CommonJS 模块系统(Node.js 默认)

ⅰ. 导出模块
1. 导出单个值:
// math.js
const add = (a, b) => a + b;
module.exports = add; // 导出单个函数

// 或导出对象
module.exports = { add };
2. 导出多个值:
// utils.js
const greet = name => `Hello, ${name}!`;
const PI = 3.14159;

// 方式1:逐个挂载到 exports 对象
exports.greet = greet;
exports.PI = PI;

// 方式2:整体导出对象
module.exports = { greet, PI };
ⅱ. 导入模块
// app.js
const add = require('./math.js'); // 导入单个函数
const { greet, PI } = require('./utils.js'); // 解构导入

console.log(add(2, 3)); // 5
console.log(greet('Alice')); // "Hello, Alice!"

二、ES Modules(ESM,需配置)

ⅰ. 启用 ESM
  • 方式1:在 package.json 中添加:
{
  "type": "module" // 所有 .js 文件视为 ESM
}
  • 方式2:文件使用 .mjs 后缀(无需配置)。
ⅱ. 导出模块
// math.mjs
export const add = (a, b) => a + b;
export const PI = 3.14159;

// 或默认导出
export default function multiply(a, b) {
  return a * b;
}
ⅲ. 导入模块
// app.mjs
import { add, PI } from './math.mjs'; // 命名导入
import multiply from './math.mjs'; // 默认导入

console.log(add(2, 3)); // 5
console.log(multiply(2, 3)); // 6

三、混合使用 CommonJS 和 ESM

ⅰ. 在 ESM 中导入 CommonJS 模块
// esm-app.mjs
import cjsModule from './commonjs-module.js'; // CommonJS 模块会被自动转换
console.log(cjsModule.greet('Bob'));
ⅱ. 在 CommonJS 中导入 ESM 模块(需动态导入)
// commonjs-app.js
(async () => {
  const esmModule = await import('./esm-module.mjs');
  console.log(esmModule.add(2, 3));
})();

四、核心注意事项

  1. 路径规则
    • require('./module'):导入当前目录下的 module.jsmodule/index.js
    • require('module'):导入 node_modules 中的核心模块或第三方模块。
  1. 循环依赖
    • 避免模块 A 依赖 B,同时 B 又依赖 A,可能导致未初始化的导出。
  1. 缓存机制
    • 模块首次加载后会被缓存,后续 require() 直接返回缓存结果。
  1. 文件扩展名
    • CommonJS:可省略 .js(如 require('./math'))。
    • ESM:必须完整指定路径(如 import './math.mjs')。

五、代码示例对比

操作

CommonJS

ES Modules

默认导出

module.exports = add;

export default add;

命名导出

exports.add = add;

export const add = (a, b) => ...;

导入默认导出

const add = require('./math');

import add from './math.mjs';

导入命名导出

const { add } = require('./math');

import { add } from './math.mjs';


六、最佳实践建议

  1. 新项目:优先使用 ES Modules(现代浏览器和 Node.js 均原生支持)。
  2. 旧项目迁移:逐步替换 requireimport,可通过工具(如 esm 包)过渡。
  3. 第三方库:检查是否支持 ESM(如 Lodash 需 lodash-es 版本)。

通过合理选择模块系统,可以更好地组织代码结构并兼容不同运行环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员流年大运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值