1. 什么是模块化
模块化就是把一个大文件拆成多个小文件,每个文件负责一块功能,文件之间可以互相引用。
想象一个超市:把"日用品区"、"食品区"、"文具区"分开放,而不是把所有商品堆在一起。模块化就是给代码"分区"。
为什么要模块化?
| 问题(没有模块化) | 解决(有了模块化) |
|---|---|
| 所有代码写在一个文件里,几千行 | 拆成多个文件,每个几百行 |
| 变量名冲突(都是全局的) | 每个模块有自己的作用域 |
| 想用别人写的函数,得手动拷贝 | import 引入就行 |
| 不知道哪个函数在哪 | 按功能组织,一目了然 |
ES 模块的使用方式:
在 HTML 中,使用 <script type="module"> 来加载模块。加了 type="module" 后,浏览器就知道这个 <script> 里会用 import/export。模块文件默认是延迟执行的(相当于加了 defer)。
2. 命名导出与导入
命名导出:给每个要导出的内容起个名字,导入时必须用相同的名字来接收。
导出(export)——两种方式:
// 方式1:声明时直接导出
export function add(a, b) {
return a + b;
}
export function multiply(a, b) {
return a * b;
}
export const PI = 3.14159;
// 方式2:先声明,最后统一导出
function subtract(a, b) {
return a - b;
}
const VERSION = '1.0.0';
export { subtract, VERSION };
导入(import)——三种方式:
// 导入指定的几个
import { add, multiply, PI } from './utils.js';
console.log(add(10, 5)); // 15
console.log(multiply(3, 4)); // 12
console.log(PI); // 3.14159
// 导入时重命名(避免命名冲突)
import { add as sum } from './utils.js';
console.log(sum(10, 5)); // 15
// 导入全部
import * as utils from './utils.js';
console.log(utils.add(1, 2)); // 3
console.log(utils.PI); // 3.14159
完整的可运行示例(需要本地服务器,浏览器不允许 file:// 协议加载模块):
【JavaScript入门】
这是一段很长很长的文章摘...
标题最大长度:50
命名导出/导入速查表:
| 操作 | 语法 | 说明 |
|---|---|---|
| 声明时导出 | export function fn() {} |
声明的同时导出 |
| 统一导出 | export { fn, NAME } |
最后统一列出 |
| 导入指定 | import { fn } from './a.js' |
名字要对应 |
| 重命名导入 | import { fn as myFn } from './a.js' |
避免冲突 |
| 导入全部 | import * as obj from './a.js' |
整体导入 |
⚠️ 新手易错:import { add } from 'utils.js' 会报错!路径必须写 ./utils.js(相对路径),不能省略 ./。
3. 默认导出与导入
默认导出:一个模块只能有一个默认导出。导入时可以自己起名字。
默认导出适合一个模块只导出一个主要功能(比如一个类、一个函数、一个组件)。
导出(export default):
function logMessage(message) {
console.log('[LOG]', new Date().toLocaleTimeString(), message);
}
export default logMessage; // 默认导出,一个模块只能有一个
导入(import):
import log from './logger.js'; // 不需要花括号,名字随便起
log('服务器启动了'); // [LOG] 10:30:00 服务器启动了
完整的可运行示例:
《ES6模块化》— 2026/6/12
{ title: 'ES6模块化', content: '模块化让代码更清晰...', date: '2026/6/12' }
命名导出 vs 默认导出对比:
| 特性 | 命名导出 | 默认导出 |
|---|---|---|
| 每个模块数量 | 多个 | 只能一个 |
| 导入语法 | import { name } from '...' |
import anyName from '...' |
| 导入时名字 | 必须和导出名一致 | 可以随便起 |
| 使用场景 | 导出多个工具函数/常量 | 导出一个主要功能 |
⚠️ 新手易错:默认导入不需要 {}。import log from '...' ✅,import { log } from '...' ❌(这是命名导入,名字必须匹配)。
4. 混合使用
在实际项目中,一个模块经常既有命名导出,又有默认导出。
// 默认导出(主要功能)
export default function fetchPosts() {
return new Promise((resolve) => {
setTimeout(() => {
resolve([{ title: '文章1' }, { title: '文章2' }]);
}, 500);
});
}
// 命名导出(辅助功能)
export const API_BASE_URL = 'https://api.example.com';
export function formatDate(date) {
return new Date(date).toLocaleDateString('zh-CN');
}
// 默认导入(名字随便起)
import fetchPosts from './api.js';
// 命名导入(名字必须对应)
import { API_BASE_URL, formatDate } from './api.js';
// 也可以一行搞定
import fetchArticles, { API_BASE_URL, formatDate } from './api.js';
console.log(API_BASE_URL); // https://api.example.com
console.log(formatDate('2026-06-12')); // 2026/6/12
fetchPosts().then(posts => console.log(posts));
完整的可运行示例(两个模块互相引用):
计算结果:30
{ title: '模块化真好', content: '代码拆分成多个文件...', formatted: '模块化真好\n---\n代码拆分成多个文件...', wordCount: 11 }
博客名:我的博客
5. 模块化最佳实践
推荐的文件组织方式:
统一导出的写法(utils/index.js):
// utils/index.js
export { formatTitle, formatDate, formatPrice } from './format.js';
export { isEmail, isPhone, isRequired } from './validate.js';
import { formatTitle, isEmail } from './utils/index.js';
模块化原则:
| 原则 | 说明 |
|---|---|
| 一个文件一个职责 | format.js 只管格式化,validate.js 只管验证 |
| 默认导出用于主要功能 | 一个模块的"主角"用默认导出 |
| 命名导出用于辅助功能 | 工具函数、常量用命名导出 |
统一入口 index.js |
多个文件通过 index.js 统一对外暴露 |
实践作业:将数组高阶方法的处理函数拆分为独立模块。
- 创建
postUtils.js模块,命名导出:getPopularPosts、getPostTitles、getTotalViews、findPostById - 创建
formatUtils.js模块,命名导出:formatDate、truncateText - 在
main.js中导入这两个模块,处理文章数据
热门文章: ['JavaScript入门', 'React教程']
总浏览量:5250
找到文章:{ id: 2, title: 'CSS布局技巧', ... }
JavaScript入门(2026/6/1)— 零基础学习Jav...
CSS布局技巧(2026/6/5)— Flex和Grid布...
React教程(2026/6/10)— 从零开始学习R...
本章复盘——模块化核心要点:
| 要点 | 说明 |
|---|---|
| 为什么模块化 | 拆分代码、避免全局污染、方便复用和维护 |
| 命名导出 | export { fn, NAME },导入名字必须一致 |
| 默认导出 | export default fn,一个模块一个,导入名字随便起 |
| 混合导出 | 可以同时有默认导出和命名导出 |
| HTML 使用 | <script type="module"> |
| 路径规则 | 必须用相对路径 ./ 或绝对路径 |
| 组织原则 | 一个文件一个职责,默认导出主要功能,命名导出辅助 |