模块化是 Node.js 核心特性之一,也是前后端开发中代码解耦、复用的关键手段。不同于浏览器端早期无统一模块化规范的混乱局面,Node.js 从设计之初就内置了模块化体系,让开发者能清晰地拆分代码、管理依赖。本文将从模块定义、核心规范、模块分类到实战示例,全面讲解 Node.js 模块化编程的核心知识。

1.什么是Node.js模块

在 Node.js 中,模块(Module) 是一个独立的代码文件(或目录),每个文件就是一个独立的模块,拥有自己的作用域 —— 模块内定义的变量、函数、类默认仅在模块内部可见,不会污染全局作用域。 简单来说,模块化的核心价值是:

  • 代码拆分:将复杂功能拆分为多个小模块,便于维护;
  • 作用域隔离:避免变量名冲突,解决全局作用域污染问题;
  • 依赖管理:清晰声明模块间的依赖关系,按需导入与导出功能。
2.Node.js模块化规范CommonJS

Node.js 内置支持 CommonJS 规范(也是 Node.js 早期唯一的模块化规范),这是服务端模块化的核心标准,其核心规则围绕 require()(导入模块)和 module.exports/exports(导出模块)展开。

CommonJS 核心规则:

  1. 模块导出:通过 module.exportsexports 向外暴露模块内的变量、函数 、类;
  2. 模块导入:通过 require() 函数加载其他模块,获取导出的内容;
  3. 加载机制:模块加载为同步加载(适合服务端,文件读取速度快),且模块只会被加载一次,后续重复 require 会直接读取缓存;
  4. 作用域独立:每个模块有独立的 module 对象,模块内的 this 指向模块自身(而非全局)。

核心API说明:

API作用
module.exports模块的真正导出出口,可导出任意类型(对象、函数、基本类型)
exportsmodule.exports 的引用,简化导出语法(注意:直接赋值 exports 会断开引用)
require(modulePath)导入模块,参数为模块路径(相对路径 / 绝对路径 / 内置模块名),返回模块导出的内容
3.Node.js模块分类

Node.js 中的模块主要分为三大类,覆盖开发中所有使用场景:

(1)内置模块(核心模块)

Node.js 官方内置的模块,无需安装,直接通过模块名 require 即可使用,是 Node.js 原生能力的核心。

  • 常见内置模块:fs(文件操作)、path(路径处理)、http(网络请求)、util(工具函数)、console(控制台输出)等;
  • 使用示例:
// 导入内置模块
const fs = require('fs');
const path = require('path');
// 使用模块方法
console.log(path.resolve(__dirname, 'test.txt')); // 拼接绝对路径

(2)自定义模块

开发者根据业务需求自行编写的模块,是项目中最核心的代码载体,通过相对 / 绝对路径导入。

  • 特点:路径必须以 ./(当前目录)或 ../(上级目录)开头,可省略 .js 后缀;
  • 示例:require('./utils.js')require('../config')

(3)第三方模块

通过 npm/yarn 安装的开源模块(如 expressaxios),存放在项目的 node_modules 目录中。

  • 使用方式:直接通过模块名导入,无需写路径,Node.js 会自动在 node_modules 中查找;

示例:

# 安装第三方模块
npm install lodash
// 导入并使用第三方模块
const _ = require('lodash');
console.log(_.chunk([1,2,3,4], 2)); // 输出:[[1,2], [3,4]]