Node.js 如何引入(include)其他文件里的函数?
Node.js 引入其他文件的函数:CommonJS 用 module.exports 导出 + require 引入;ES Module 用 export/import。本文给出两种模块体系的完整写法与混用注意事项。
CommonJS:module.exports 导出,require() 引入。ES Module:export 导出,import 引入。
CommonJS 写法(传统默认)
// mathFunctions.js —— 导出
function add(a, b) { return a + b; }
function subtract(a, b) { return a - b; }
module.exports = { add, subtract };
// app.js —— 引入使用
const math = require('./mathFunctions'); // 注意:相对路径必须带 ./
console.log(math.add(5, 3)); // 8
console.log(math.subtract(8, 3)); // 5
也可以解构引入:const { add } = require('./mathFunctions');
ES Module 写法(现代推荐)
// mathFunctions.js
export function add(a, b) { return a + b; }
export function subtract(a, b) { return a - b; }
// app.js
import { add, subtract } from './mathFunctions.js'; // ESM 必须写扩展名
console.log(add(5, 3));
启用 ESM:文件用 .mjs 后缀,或在 package.json 里设 "type": "module"。
关键注意事项
- 相对路径要带
./:require('./mathFunctions')是引入同目录文件;不带./的require('lodash')是找 node_modules 里的包; - CJS 的 require 可以不写 .js 扩展名,ESM 的 import 必须写全;
- 两种体系别混用:同一个文件里只能选一种。CJS 文件想用 ESM 包可以用动态
await import(); - 导出单个函数可以直接
module.exports = myFunction,引入方拿到的就是函数本身。
常见问题(FAQ)
Q:require 一个文件会执行里面的代码吗?
会,模块顶层代码在首次 require 时执行一次,结果被缓存——之后每次 require 拿到的是同一份导出对象(单例)。
Q:报 Error: Cannot find module?
依次检查:相对路径有没有 ./、文件名大小写(Linux 区分)、扩展名是否写对。
Q:循环 require(A 引 B、B 引 A)会怎样?
Node 允许但其中一个拿到的是"半成品"导出。尽量重构掉循环依赖(提取公共模块)。
Q:想导出常量/对象而不只是函数?
一样:module.exports = { config, helperFn, CONSTANT },或 ESM export const config = ...。