es6 class 应作为模块默认导出的核心实现单元,聚焦单一职责;依赖须注入而非硬编码;按领域拆分为小模块;工具逻辑用 static 方法;高资源类用动态导入。

ES6 class 本身不是模块,但它天然适配模块化架构——关键在于如何组织类的定义、导出、导入与协作方式。在大型项目中,滥用 class 或割裂 class 与模块边界,反而会加剧耦合、阻碍测试和复用。真正有效的实践,是把 class 当作模块的“核心实现单元”,而非孤立语法糖。
类应作为模块的默认导出主体
一个模块聚焦一个职责,其主功能往往由一个 class 承载。此时应使用 default export 导出该 class,语义清晰且调用简洁:
- ✅ 推荐:
export default class ApiService { ... }→import ApiService from './ApiService.js'; - ❌ 避免:
export class ApiService { ... }→import { ApiService } from './ApiService.js';(命名导出易造成模块名冗余,且不利于 tree-shaking 识别主入口) - 若模块需暴露辅助工具函数或常量,可用命名导出补充,但 class 必须是默认导出:
export const TIMEOUT = 5000;<br>export default class ApiService { ... }
类内部不直接处理跨模块副作用
大型项目中,class 的职责必须收敛。它不应自行发起网络请求、操作 DOM、读取 localStorage 或触发全局事件——这些属于外部依赖,应通过构造函数或方法参数注入:
- ✅ 注入 fetch 实例:
constructor(fetcher = window.fetch) { this.fetch = fetcher; } - ✅ 注入事件总线:
constructor(eventBus) { this.bus = eventBus; } - ❌ 禁止硬编码:
fetch('/api/users')或document.querySelector(...) - 这样设计使类可被单元测试(mock 依赖)、可在不同环境复用(如 SSR 中替换 fetch)、也便于模块解耦
按领域拆分 class 模块,避免“上帝类”
不要把所有业务逻辑塞进一个 UserManager 类。应按单一职责原则,将能力垂直切分为多个小模块:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
UserRepository.js:专注数据获取与缓存(含 API 调用封装) -
UserValidator.js:专注校验规则与错误格式 -
UserPresenter.js:专注视图层数据转换(如格式化生日、头像 URL) - 主模块
UserModule.js可组合它们:import Repository from './UserRepository.js'; import Validator from './UserValidator.js';
每个类模块只暴露必要接口,内部细节完全隐藏,符合高内聚、低耦合要求。
静态成员与工厂方法优先于全局函数
当需要与类关联的工具逻辑(如解析、序列化、类型判断),应定义为 static 方法,而非单独导出函数:
- ✅
class User { static fromJson(data) { return new User(data.name, data.email); } } - ✅
class ApiError { static isNetworkError(err) { return err?.name === 'TypeError'; } } - 这样逻辑归属明确,IDE 自动补全友好,且模块路径唯一(不用再找
userUtils.js) - 若静态方法过多,说明职责可能过载,应考虑拆出独立工具类模块
配合动态导入实现按需加载与隔离
对非首屏、高资源占用或低频使用的 class(如富文本编辑器、图表渲染器),应避免在主模块中静态导入:
- ✅ 动态导入 + 工厂函数:
async loadEditor() { const { default: Editor } = await import('./Editor.js'); return new Editor(); } - ✅ 结合路由/条件加载,让 class 模块物理隔离,减少初始包体积
- 注意:动态导入返回的是 Promise,class 实例化需在
await后进行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










