跳转到主要内容

Dropup 的工作原理

Dropup 基于无头 UI(headless UI)的概念构建 - 它处理所有复杂的文件上传逻辑,同时让您完全控制视觉呈现。

架构

┌─────────────────────────────────────────────────────────────┐
│ Your React Component │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Drop Zone │ │ File List │ │ Upload Button │ │
│ │ (your UI) │ │ (your UI) │ │ (your UI) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ useDropup Hook ││
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌─────────┐ ││
│ │ │Validation │ │ State │ │ Upload │ │ Platform│ ││
│ │ │ Engine │ │ Manager │ │ Engine │ │ Adapter │ ││
│ │ └───────────┘ └───────────┘ └───────────┘ └─────────┘ ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘

核心组件

1. 状态管理器

Dropup 使用 React 的 useReducer 进行可预测的状态管理:

  • 跟踪所有文件及其状态
  • 管理拖拽状态
  • 处理上传进度
  • 提供计算值

2. 验证引擎

在添加文件之前,它们会经过验证:

const { files } = useDropup({
accept: 'image/*', // 文件类型验证
maxSize: 5 * 1024 * 1024, // 最大文件大小
minSize: 1024, // 最小文件大小
maxFiles: 10, // 最大文件数量
maxWidth: 4096, // 最大图片宽度
maxHeight: 4096, // 最大图片高度
customRules: [ // 自定义验证
(file) => file.name.length < 100 || 'Filename too long'
],
});

3. 上传引擎

上传引擎处理:

  • 简单上传(每个文件一个请求)
  • 分块上传(拆分大文件)
  • 带指数退避的重试逻辑
  • 并发上传管理
  • 进度跟踪

4. 平台适配器

Dropup 跨平台工作:

  • Web - 使用原生浏览器 API
  • React Native - 使用原生文件处理
  • SSR - 对服务器端渲染安全

数据流

User Action → Validation → State Update → Upload → Callbacks
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Select/ Accept/Reject files[] XHR/Fetch onComplete
Drop files Updated Progress onError

设计原则

1. 无头优先

没有内置 UI 组件 - 您可以构建所需的任何内容:

// 您可以完全控制 UI
<div {...getDropProps()}>
<YourCustomDropZone />
<input {...getInputProps()} />
</div>

2. 类型安全

完整的 TypeScript 支持和全面的类型定义:

import type { DropupFile, UseDropupOptions } from '@samithahansaka/dropup';

const options: UseDropupOptions = {
accept: 'image/*',
onUploadComplete: (file: DropupFile) => {
console.log(file.uploadedUrl);
},
};

3. 可摇树优化

只导入您需要的内容:

// 仅核心功能 (~10KB)
import { useDropup } from '@samithahansaka/dropup';

// 需要时添加云支持
import { createS3Uploader } from '@samithahansaka/dropup/cloud/s3';

// 需要时添加图片处理
import { compressImage } from '@samithahansaka/dropup/image';

4. 渐进增强

从简单开始,按需添加功能:

// 基本用法
const { files } = useDropup();

// 添加验证
const { files } = useDropup({ maxSize: 10_000_000 });

// 添加自动上传
const { files } = useDropup({
maxSize: 10_000_000,
upload: { url: '/api/upload' },
autoUpload: true,
});

// 添加云存储
const { files } = useDropup({
upload: createS3Uploader({ getPresignedUrl }),
});