大文件切片上传采用模块化设计,划分为Chunker、Scheduler、Uploader、Merger、Storage五模块,通过依赖注入、事件总线和配置驱动实现职责清晰、可测试、可复用、可替换。

大文件切片上传的调度与分发模块,本质是协调“切片生成→上传排队→并发控制→状态同步→合并触发”这一链条。JavaScript 模块化不是为了拆代码而拆,而是让每个环节职责清晰、可测试、可复用、可替换。
用 ES Module 划分核心职责边界
不把所有逻辑塞进一个 upload.js 里。按能力域拆成独立模块,通过命名明确意图:
- Chunker.js:只负责读取 File/Blob、按固定 size(如 2MB)切片、生成唯一 chunkId、计算 hash(可选)
- Scheduler.js:维护上传队列,支持优先级、暂停/恢复、失败重试策略(如指数退避),不直接调用 fetch
- Uploader.js:封装单个切片的 HTTP 上传(含 AbortController、超时、重试、进度事件),接收 chunk 和 metadata
- Merger.js:监听所有切片完成事件,向服务端发起 merge 请求,校验最终文件 hash
- Storage.js:抽象本地状态存储(如 IndexedDB 或 localStorage),存 chunk 状态、uploadId、断点位置
用 Class + Dependency Injection 实现可组合调度
Scheduler 不应硬编码使用哪个 Uploader 或 Storage。用构造函数注入依赖,方便单元测试和替换实现:
例如:
class UploadScheduler {
constructor({ uploader, storage, maxConcurrent = 3 }) {
this.uploader = uploader;
this.storage = storage;
this.maxConcurrent = maxConcurrent;
this.queue = [];
}
async add(file) {
const chunks = await Chunker.split(file);
await this.storage.saveChunks(file.id, chunks);
this.queue.push(...chunks);
this.#start();
}
}
这样就能轻松切换:开发时用 MockUploader,生产用带 token 刷新的 AuthUploader;断网测试时换 StubStorage。
用事件总线或回调解耦状态分发
切片上传成功、失败、进度变化、合并完成……这些状态不靠层层 callback 传递,也不让 Scheduler 直接操作 UI。统一用轻量事件机制:
- 定义标准事件类型:
chunk-upload-start、chunk-upload-progress、upload-pause、merge-success - Scheduler 内部触发事件(可用
CustomEvent+dispatchEvent,或简单发布订阅) - UI 层(React/Vue 组件)只订阅关心的事件,更新进度条、按钮状态、错误提示
避免模块间强引用,也便于后期接入日志、埋点、通知等横切关注点。
利用顶层模块聚合与配置驱动行为
入口文件(如 BigFileUpload.js)不做业务逻辑,只做“组装”和“配置”:
import { UploadScheduler } from './Scheduler.js';
import { AxiosUploader } from './adapters/AxiosUploader.js';
import { IndexedDBStorage } from './storage/IndexedDBStorage.js';
export function createUploader(options = {}) {
const uploader = new AxiosUploader({
baseURL: options.apiBase,
getToken: options.getToken,
});
const storage = new IndexedDBStorage('bigfile-cache');
return new UploadScheduler({
uploader,
storage,
maxConcurrent: options.concurrency ?? 4,
});
}
使用者只需传入 token 获取方式、API 地址、并发数,就得到一个开箱即用的上传实例——模块化真正价值在此:降低使用门槛,而非增加理解成本。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











