模块是JavaScript中封装功能、隔离作用域、避免命名冲突和实现复用的基本单元,解决全局污染、依赖混乱与协作困难问题;ES6模块通过export/import实现静态解析与显式依赖,CommonJS则用require/module.exports支持动态加载;项目中应按功能或业务域组织模块,保持单一职责。

模块是 JavaScript 中用于封装功能、隔离作用域、避免命名冲突并实现代码复用的基本单元。它让开发者能把大程序拆分成小而专注的文件,按需加载、独立维护。
模块解决了什么问题
在早期 JavaScript 中,所有脚本默认共享全局作用域,变量和函数容易重名覆盖,依赖顺序难管理,大型项目难以协作和测试。模块机制(尤其是 ES6 的 import/export)提供了显式的依赖声明、私有作用域和静态分析能力,让代码更可靠、可预测。
ES6 模块(最常用标准)
使用 export 对外暴露内容,用 import 引入其他模块:
-
默认导出(每个模块最多一个):
export default function greet() { return 'Hello'; }
导入时可自定义名称:import sayHi from './greet.js'; -
具名导出(可多个):
export const PI = 3.14; export function add(a, b) { return a + b; }
导入需用对应名称:import { PI, add } from './math.js';或整体导入:import * as math from './math.js';
CommonJS(Node.js 传统方式)
主要在 Node.js 环境中使用,基于 require() 和 module.exports:
立即学习“Java免费学习笔记(深入)”;
-
导出:
module.exports = { PI: 3.14, add: (a, b) => a + b }; -
导入:
const math = require('./math.js'); - 它是运行时加载,支持动态路径;ES6 模块是编译时静态解析,不支持 if 判断后 import。
如何组织实际项目中的模块
按功能或业务域划分目录,保持单模块职责单一:
- 把工具函数放在
utils/,如utils/date.js、utils/http.js - 组件逻辑放
components/,每组件一个文件夹,含 JS、CSS、测试 - 状态管理相关(如 Redux slice 或 Zustand store)集中到
store/ - 入口文件(如
main.js)只做初始化,不写业务逻辑










