前言
当项目从一个 JS 文件发展到几十上百个文件时,最先失控的通常不是功能,而是依赖关系和全局变量污染。模块化就是解决这两个问题的基础能力。
1. 为什么需要模块化
在没有模块化的时代,代码拆分后会遇到两个典型问题:
模块化的核心价值:
常见标准:
- CJS(CommonJS,部分中文资料会写作 CMJ):主要用于 Node.js 传统生态。
- ESM(ES Module):JavaScript 官方模块标准,现代浏览器和 Node.js 都支持(在对应配置下)。
2. CommonJS 最小示例
2.1 math.js:定义并导出
// math.js
function add(a, b) {
return a + b;
}
function isOdd(a) {
// 兼容负数,例如 -3 也是奇数
return Math.abs(a % 2) === 1;
}
module.exports = {
add,
isOdd
};
2.2 index.js:导入并使用
// index.js
const math = require('./math.js');
console.log(math.isOdd(3)); // true
console.log(math.add(2, 3)); // 5
运行方式:
node index.js
3. CommonJS 规范
补充:Node.js 会按模块解析后的路径管理缓存;删除 require.cache 中对应项后,再次 require 会重新执行模块。
4. CJS vs ESM
| 导入 | require()(运行时) | import(静态声明) |
| 导出 | module.exports / exports | export / export default |
| 加载 | 同步加载 | 原生支持异步加载(可配合 import()) |
| 浏览器原生支持 | 不支持(需构建工具转换) | 支持(现代浏览器) |
| 主要场景 | Node.js 传统生态 | 浏览器 + Node.js 现代生态 |
| 绑定特性 | 常见认知偏向“值拷贝” | 实时绑定(live binding) |
5. 常见误区
5.1 “Node 只能有一个入口文件”
更准确说法是:一次 node xxx.js 命令只有一个启动入口文件;一个项目可以有多个可执行入口(例如不同 npm scripts)。
5.2 “CJS 在浏览器可以直接用”
浏览器原生不支持 require / module.exports,通常需要构建工具(如 Vite/Webpack)转换后再运行。
5.3 “CMJ 才是标准缩写”
主流标准写法是 CJS。CMJ 在中文资料中较常见,做笔记可保留别名说明,但对外交流建议使用 CJS。
6. 总结
这篇作为专栏第 01 篇,核心目标只有一个:把模块化的动机和 CommonJS 的基础机制先学扎实。后续不管是继续看 ESM,还是看工程化工具链,都会更容易理解。
参考链接
- CommonJS Modules
- ECMAScript Modules
- JavaScript Modules
版权声明:本文首发于 CSDN,转载请注明出处。





