structuredClone() 是唯一能真正保留 Blob 完整性的原生深克隆方式,直接复刻二进制内容与全部元数据(type、size、name、lastModified),但需确保源为标准原生 Blob、分离存储业务元数据、克隆后重新生成 object URL,并在不支持环境降级为 new Blob()/new File()。

structuredClone() 是目前唯一能真正保留 Blob 完整性的原生深克隆方式,它不读取、不解码、不转字符串,直接复刻二进制内容与全部元数据(type、size、name、lastModified),前提是满足几个关键条件。
确保源 Blob 是标准原生实例
Blob 必须来自可信原始渠道,才能被 structuredClone 正确识别和复制:
- ✅ 支持来源:input.files[0]、dropEvent.dataTransfer.files[0]、fetch().then(r => r.blob())、new Blob([…], {type})
- ❌ 不支持来源:手动添加了 .uploadId 或 .previewUrl 的 File;用 new Proxy(blob, {}) 封装过的对象;JSON.parse() 后重建的伪 Blob
- ⚠️ 自定义字段会丢失:structuredClone 只克隆自有属性(如 name、type),不保留挂载在实例上的业务字段
业务元数据必须与 Blob 分离存储
若需同时保存文件本身和上传上下文(如 ID、分类、状态),不能把元数据塞进 Blob/File 实例里:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- ❌ 错误做法:
file.uploadId = 'abc123'; structuredClone(file)→ uploadId 消失 - ✅ 正确结构:
{ file: input.files[0], metadata: { id: 'abc123', tag: 'avatar' } } - 这样调用
structuredClone({ file, metadata })后,两者都会完整保留且相互独立
克隆后 object URL 需重新生成
URL.createObjectURL() 创建的地址绑定的是特定 Blob 实例,克隆产生的是新实例,旧地址立即失效:
- 克隆后的 Blob 仍可正常使用:
clonedFile instanceof File === true,可直接传入 FormData.append() - 但
URL.createObjectURL(originalBlob)对 clonedBlob 完全无效 - 必须单独为克隆体调用:
const url = URL.createObjectURL(clonedBlob) - 使用完毕务必清理:
URL.revokeObjectURL(url),避免内存泄漏
环境兼容性与降级处理要点
structuredClone 并非“开箱即用”,需主动检测并兜底:
- ✅ 支持环境:Chrome 98+、Firefox 97+、Safari 15.4+、Edge 98+、Node.js 18.12+(默认启用)
- 检测写法:
if (typeof structuredClone === 'function') { ... }(不要只查'structuredClone' in window) - ❌ 禁止 fallback 到 JSON.stringify():它会让 Blob 变成空对象
{},彻底丢失二进制 - 轻量降级方案:对 Blob 可用
new Blob([original], {type: original.type});对 File 还需补name和lastModified(new File([original], original.name, { lastModified: original.lastModified }))

















