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"。

关键注意事项

  1. 相对路径要带 ./:require('./mathFunctions') 是引入同目录文件;不带 ./ 的 require('lodash') 是找 node_modules 里的包;
  2. CJS 的 require 可以不写 .js 扩展名,ESM 的 import 必须写全;
  3. 两种体系别混用:同一个文件里只能选一种。CJS 文件想用 ESM 包可以用动态 await import();
  4. 导出单个函数可以直接 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 = ...。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台