Common.js是Node.js采用的模块化规范,通过require导入模块、module.exports导出接口,实现作用域隔离与依赖管理,其同步加载机制适合服务器环境,每个文件视为独立模块,解决了JS原生缺乏模块系统的问题,成为Node生态核心标准。
在JavaScript生态系统中,CommonJS是一个影响深远的模块化规范,它为开发者提供了一种标准化的代码组织方式,尤其在服务端开发领域发挥了关键作用,以下是关于CommonJS的全面解析:
CommonJS的诞生背景
2009年,随着Node.js的推出,JavaScript开始进军服务端开发领域,传统浏览器环境通过<script>
标签加载代码的方式无法满足服务器端对模块化、依赖管理和代码复用的需求,CommonJS规范应运而生,定义了模块加载、导出和依赖管理的标准方法。

核心机制解析
模块定义
每个文件被视为独立模块,拥有私有作用域,模块通过module.exports
或exports
对象对外暴露接口:
// math.js
const add = (a, b) => a + b;
module.exports = { add };
模块加载
使用require()
函数同步加载依赖:

// app.js
const math = require('./math');
console.log(math.add(2, 3)); // 输出5
缓存机制
模块首次加载后会被缓存,后续调用require()
直接返回缓存结果,提升性能。
解决的问题与优势
- 依赖管理
明确声明模块间的依赖关系,避免全局被墙。
- 代码复用
支持跨文件共享功能模块。
- 作用域隔离
每个模块拥有独立作用域,变量不会冲突。
- 同步加载
适用于服务器端的本地文件系统读取。
典型应用场景
- Node.js开发
Node.js原生支持CommonJS,成为后端服务、工具链开发的标准。
- 浏览器端构建
通过Webpack、Browserify等工具转换为浏览器可执行格式。
- npm生态
支撑数百万npm包的模块化体系。
局限性分析
特点 |
说明 |
同步加载 |
不适合浏览器端直接使用 |
动态引入 |
不利于静态分析优化 |
非原生浏览器支持 |
需构建工具转换 |
与ES6模块的对比
- 加载方式
CommonJS为同步加载,ES6模块支持静态解析。
- 语法差异
ES6使用import/export
语法,支持命名导出和默认导出。
- 执行时机
CommonJS模块在运行时解析,ES6模块在编译时处理依赖。
- 兼容性
ES6模块逐渐成为现代JavaScript的官方标准。
现代开发中的定位
尽管ES6模块已成为主流标准,CommonJS仍在以下场景保持重要地位:
- Node.js生态维护历史项目
- 需要动态加载模块的特殊需求
- 工具链开发中与旧系统兼容
最佳实践建议
- 新项目优先选用ES6模块
- 使用构建工具实现模块格式转换
- 混合开发时通过
.mjs
/.cjs
扩展名区分格式
- 定期评估项目对模块系统的需求
引用说明
本文技术细节参考:

- Node.js官方文档(https://nodejs.org/docs/latest/api/modules.html)
- ECMAScript 2025语言规范(ECMA-262 14th Edition)
保持持续更新,最后修订时间:2025年10月)