模块化是 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 核心规则:
- 模块导出:通过
module.exports或exports向外暴露模块内的变量、函数 、类; - 模块导入:通过
require()函数加载其他模块,获取导出的内容; - 加载机制:模块加载为同步加载(适合服务端,文件读取速度快),且模块只会被加载一次,后续重复
require会直接读取缓存; - 作用域独立:每个模块有独立的
module对象,模块内的this指向模块自身(而非全局)。
核心API说明:
| API | 作用 |
| module.exports | 模块的真正导出出口,可导出任意类型(对象、函数、基本类型) |
| exports | module.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 安装的开源模块(如 express、axios),存放在项目的 node_modules 目录中。
- 使用方式:直接通过模块名导入,无需写路径,Node.js 会自动在
node_modules中查找;
示例:
# 安装第三方模块
npm install lodash
// 导入并使用第三方模块
const _ = require('lodash');
console.log(_.chunk([1,2,3,4], 2)); // 输出:[[1,2], [3,4]]