尧图精选

@uppy/transloadit 插件演进全解析:从 CHANGELOG 到源码的架构与技术迭代

🕒 发布时间:2026/10/1 9:43:31 📁 来源:尧图网络
前端UI组件后端【免费下载链接】uppyThe next open source file uploader for web browsers :dog:项目地址https://gitcode.com/gh_mirrors/up/uppy点击查看免费下载本文以仓库内 packages/uppy/transloadit/CHANGELOG.md覆盖 2.0.5 → 6.0.0 全部版本记录为骨架逐条追溯uppy/transloadit插件在配置体系、实时状态通道、事件模型、类型系统与工程化方面的关键演进并结合 packages/uppy/transloadit/src 下的源码实现、测试用例 给出可验证的依据。读完本文你将理解该插件“一次 Assembly、Tus 上传、SSE 实时状态、Golden Retriever 恢复”的核心运行机制掌握assemblyOptions、事件监听、升级到 5.x/6.x 时的破坏性变更并能依据变更日志反推代码中的具体改动点。一、插件定位Uppy 与 Transloadit 之间的桥uppy/transloadit是 Uppy 官方提供的“上传即处理”插件。根据 README.md 与 package.json 的描述它可以“将文件上传到 Transloadit 以完成各类处理例如视频转码、图片缩放、压缩/解压等”。Uppy 负责浏览器端的上传体验Transloadit 是接收上传并执行处理工作流的托管后端该插件负责把两者连接起来。插件本身体现为一个uploader类型的 BasePlugin见 src/index.ts内部同时组合了三个关键构件Assemblysrc/Assembly.ts封装单个 Assembly 的生命周期负责 SSE 连接、状态轮询与状态 diffClientsrc/Client.ts轻量 HTTP 客户端负责创建/取消 Assembly、预留与导入文件、上报错误AssemblyWatchersrc/AssemblyWatcher.ts跟踪一个或多个 Assembly 的完成/失败状态暴露.promise供上传流程等待。这条“三段式”架构在变更日志的多个版本中反复被打磨正是本文要重点梳理的对象。二、配置体系的演进从分散选项收敛到assemblyOptions变更日志中与配置相关的最关键节点是3.1.02023-01-26introduceassemblyOptions, deprecate other options它把原本分散在插件上的多个选项统一收敛到assemblyOptions之下随后4.0.0-beta.22024-04-11“remove deprecated options”彻底删除被废弃的旧选项完成了配置模型的换代。当前源码中TransloaditOptions 与 defaultOptions 给出了插件可用的全部选项及默认值选项类型默认值说明servicestringhttps://api2.transloadit.comTransloadit API 服务地址errorReportingbooleantrue出错时是否上报到 transloaditstatus.comwaitForEncodingbooleanfalse是否等待编码完成结果与 finished 事件waitForMetadatabooleanfalse是否等待元数据提取完成importFromUploadURLsbooleanfalse是否由其他上传器XHR/S3先上传再把 URL 导入 AssemblyalwaysRunAssemblybooleanfalse是否在无文件时也运行 Assemblylimitnumber20上传并发与 API 请求速率上限clientNamestring \| nullnull附加到Transloadit-Client请求头中的自定义客户端标识3.5.0 新增retryDelaysnumber[][7000, 10000, 15000, 20000]Tus 上传与 API 请求的重试退避间隔毫秒assemblyOptionsAssemblyOptions \| () PromiseAssemblyOptions—提供params、fields、signature的函数或对象assemblyOptions的核心形态定义在 AssemblyOptionsexport interface AssemblyOptions { params?: AssemblyParameters | string | null fields?: Recordstring, string | number | string[] | null signature?: string | null }其中params是必填项。源码中的 validateParams 会做双重校验params为空时直接抛错如果params是 JSON 字符串则先解析再校验且要求params.auth.key必须存在否则抛出“You can find your Transloadit API key”的引导性错误。绝不能在浏览器代码中写入 Auth Secret——signature必须由你的服务端生成后随assemblyOptions()返回见 README.md 中的示例。assemblyOptions的两种用法静态对象适合模板 ID 固定的场景测试用例 test/index.test.js 中即使用该形式uppy.use(Transloadit, { assemblyOptions: { params: { auth: { key: some auth key string }, template_id: some template id string, }, }, })异步函数生产推荐服务端签名README 的典型写法const uppy new Uppy().use(Transloadit, { async assemblyOptions() { const response await fetch(/api/transloadit-params, { method: POST }) if (!response.ok) { throw new Error(Could not prepare the upload (${response.status})) } return response.json() }, })在 prepareUpload 中assemblyOptions若是函数则被await调用随后fields被重构为普通对象、params被校验再进入创建 Assembly 的流程。另外注意4.0.1的修复“do not markoptsas mandatory”——插件构造函数的opts参数不再强制必填。三、实时状态通道的变迁Socket.io → SSE 轮询兜底变更日志清楚记录了实时通道的技术换代3.2.02023-07-13implement Server-sent event API3.3.02023-09-05remove Socket.io并开始“Emit assembly progress events”。也就是说从 Uppy v3.12 起该插件不再依赖 Socket.io而是改用Server-Sent EventsEventSource接收 Assembly 实时状态同时保留HTTP 轮询作为兜底。当前实现位于 Assembly.tsconnect() 同时启动 SSE 与轮询SSE 监听的事件包括message携带assembly_finished、assembly_uploading_finished、assembly_upload_meta_data_extracted三类裸数据、assembly_upload_finished、assembly_result_finished、assembly_execution_progress、assembly_error轮询兜底每 2 秒拉取一次完整状态SSE 一旦成功建立open事件即清除轮询定时器这样“即使 SSE 失败或迟迟未建立也不会错过任何事件”。状态机由三个常量界定Assembly.tsASSEMBLY_UPLOADING → ASSEMBLY_EXECUTING → ASSEMBLY_COMPLETEDisStatus 通过statusOrder的索引比较实现“状态大于等于”判断从而保证即使执行阶段快得没被 SSE 捕捉到轮询 diff 也能按正确顺序补发executing、upload、metadata、result、finished事件见 diffStatus。这一逻辑被 test/Assembly.test.js 的“status diffing”用例逐条验证例如ASSEMBLY_UPLOADING → ASSEMBLY_COMPLETED会依次得到executing、metadata、finished三个事件。速率限制从 2.1.x 一路打磨实时通道离不开 API 限流。变更日志里有一串相关的修复与增强2.1.0ignore rate limiting errors when polling、better defaults for rate limiting2.1.1fix handling of Tus errors and rate limiting2.2.0add rate limiting for assembly creation and status polling。当前实现中RateLimitedQueue贯穿始终插件用limit选项构造队列index.tsClient与Assembly的 fetch 都通过rateLimitedQueue.wrapPromiseFunction(fetchWithNetworkError)包装。当响应状态为429时代码会执行rateLimit(2000)主动限流并重试Client.ts、Assembly.ts这与2.1.0/2.1.1中“忽略轮询时的限流错误”“更好的限流默认值”一脉相承。四、事件模型与插件状态assemblyStatus/lastAssemblyStatus的引入插件对外暴露了一整套transloadit:*事件其签名定义在 index.ts 的 UppyEventMap 扩展事件参数触发时机transloadit:assembly-created(assembly, fileIDs)Assembly 创建成功transloadit:assembly-cancel(assembly)请求取消 AssemblyWatcher 监听transloadit:assembly-cancelled(assembly)取消流程完成6.0.0 起携带更新后的状态transloadit:assembly-error(assembly, error)Assembly 报错transloadit:assembly-executing(assembly)进入执行阶段transloadit:execution-progress({ progress_combined })执行进度更新3.3.0 起transloadit:upload(file, assembly)单个文件上传到 Assemblytransloadit:result(stepName, result, assembly)单个处理结果产出transloadit:complete(assembly)Assembly 全部处理完成transloadit:import-error(assembly, fileID, error)importFromUploadURLs导入文件失败此外还有与恢复相关的restored、restore:plugin-data-changed详见第六节。6.0.0 的两个关键变化12de077Removeuppy/instagramreferences from all the packages——插件的依赖与文档中不再出现 Instagram 相关引用57f8dafAddassemblyStatusandlastAssemblyStatusto transloadits plugin state——插件状态新增两个字段。在源码中TransloaditState 注释清楚地说明了二者分工assemblyStatus是当前活跃 Assembly 的实时状态每次UPLOADING → EXECUTING → ...跳变都会更新assembly置空时自动清空lastAssemblyStatus则是最近一次非空状态的快照持久保留使 UI 在assemblyStatus清空后仍能展示“上一次上传的结果”。两者由 handleAssemblyStatusUpdate 统一写入并在写入时同步发出restore:plugin-data-changed。另一个 6.0.0 修补ca916f6是“emit updated AssemblyState intransloadit:assembly-cancelledevent”——取消 Assembly 时cancelAssembly 会优先使用this.assembly?.status取消触发后可能已更新的状态作为事件参数只有不存在时才回退到方法入参避免旧版本中取消事件携带过期状态的问题。事件顺序的保证无论走 SSE 还是轮询 diff事件的“期望顺序”都被固定为executing→n 次upload→metadata→m 次result→finished见 diffStatus 注释。transloadit:result事件本身在3.7.1与4.0.0-beta.9中被连续修复fixtransloadit:resultevent / also fix outdated assemblytransloadit:result核心是防止结果事件携带过时的 Assembly 状态onResult 还会对缺少字符串类型id的结果做防御性过滤。五、取消与重试语义的持续打磨变更日志中相当大比例的条目围绕“取消 Assembly、移除文件、重试”这些边界行为可以串成一条完整的语义演进线2.3.5cancel assemblies when all its files have been removed——文件全部移除则取消 Assembly2.3.6sendassembly-cancelledonly once——取消事件只发一次2.1.2close assembly if upload is cancelled——上传取消时关闭 Assembly3.1.4Resettuskey in the file on error, so retried files are re-uploaded——出错时清掉文件上的tus字段重试时不会复用旧的 tus 上传对应代码见 AssemblyWatcher 的 assembly-error 处理并关联 transloadit/uppy 的 issue #44123.1.5clean up event listener to prevent cancelled assemblies——清理事件监听防止已取消的 Assembly 继续触发4.0.0-beta.6do not cancel assembly when removing all files——注意这一版本又收回了“移除全部文件即取消”的激进行为改为不再自动取消4.1.0fix check if all files have been removed4.1.2 / 4.0.2fix multiple upload batches run again / fix issue withallowMultipleUploadBatches——多次上传批次与“再次上传”的修复5.5.1fixallowMultipleUploadBatchesto prevent adding/removing files while an upload is in progressPR #6156。与之配套的是插件安装时对 Uppy 能力的声明因为“Assemblies 往往包含多个文件无法单独取消单个文件”插件在 install() 中把capabilities.individualCancellation置为false并在uninstall()时恢复为true。取消语义的当前实现集中在 #onCancelAll 与 Client.cancelAssembly对 Assembly URL 发DELETE请求。批处理与allowMultipleUploadBatches从4.0.0-beta.10的“simplify plugin to always run a single assembly”开始插件被简化为始终只运行单个 Assembly。这使得上传进行中禁止再增删文件以避免产生多个 AssemblyprepareUpload 一开始就把allowNewUpload置为false直到 afterUpload 的 finally 块 才重新置为true注释明确指向 issue #5397即allowMultipleUploadBatches场景。创建 Assembly 时若发现“所有文件已被移除”则主动调用client.cancelAssembly并返回nullcreateAssembly。六、断点恢复与 Golden Retriever 的协作5.1.3是一次内部契约级的大改动Remove hacky internal eventrestore:get-data会把一个函数作为事件数据发给 golden retriever改而新增restore:plugin-data-changed在插件数据变化时发布。旧版uppy/transloadit与新版uppy/golden-retriever不再互相兼容。这同时把UppyFile拆分为LocalUppyFile与RemoteUppyFile两个接口transloadit与tus字段分别挂载在两者之上index.ts。恢复链路在源码中由 #onRestored 承担从 Golden Retriever 加载的插件数据中取出assemblyResponse重建Assembly实例与AssemblyWatcher通过#findFile按tus_upload_url、文件名大小等匹配把远端上传记录映射回本地文件并强制调用assembly.update()补拉一次状态以“检查错过的中间事件”。这正是6.0.0中assemblyStatus/lastAssemblyStatus双字段设计的意义所在——恢复期间assemblyStatus可能被清空但lastAssemblyStatus保证 UI 仍有可展示的状态。七、类型系统的强化从手写类型到transloadit/types类型体系是这条 CHANGELOG 中篇幅最重的一条主线节点如下3.6.0 / 4.0.0-beta.1migrate to TS——插件迁移到 TypeScript4.3.0use TypeScript compiler instead of Babel——构建期类型检查由 Babel 换成 tsc4.3.3Adduser_metatype toAssemblyResult4.1.0addexecution_progresstoAssemblyResponsetype5.4.0ExportAssembly,AssemblyError,Client——把三个底层类提升为公开导出5.1.0Use thetransloaditNode.js SDKs exported Assembly types instead of our inaccurate, hand-rolled ones——放弃手写类型改用官方 SDK 类型注意提示“导出名不变但类型更完整也更宽松运行时不破坏但 TypeScript 可能需要补几个类型守卫”以及附带福利“Robot 参数将获得自动补全”5.1.2Movetransloaditintodependenciesso types are resolved without users having to install it manually——类型依赖移入 dependencies用户无需手动安装 SDK 也能解析类型5.5.0Migrate fromtransloadittotransloadit/typesto get the types. No need to drag in the entire SDK——进一步瘦身只依赖纯类型包5.5.1Add type re-export forAssemblyInstructionsInput。当前源码的导出契约index.ts 末尾与 5.4.0/5.5.1 完全对应// Re-export type from transloadit/types so callers can import it from the plugin package. export type { AssemblyInstructionsInput } from transloadit/types // Low-level classes for advanced usage (e.g., creating assemblies without file uploads) export { default as Assembly } from ./Assembly.js export { AssemblyError, default as Client } from ./Client.js export { COMPANION_ALLOWED_HOSTS, COMPANION_URL }另外3.0.0-beta.4的“remove static properties in favor of exports”正是本次导出改革的起点——COMPANION_URL与COMPANION_ALLOWED_HOSTS从类静态属性改为模块导出。5.3.0则借助uppy/core新增的PluginTypeRegistry注册了Transloadit插件 ID让uppy.getPlugin(Transloadit)能直接返回具体插件类型无需手动传泛型。八、包工程化ESM 与 Export Maps工程层面的两个大版本各有明确的破坏性变更3.0.02022-08-22Switch to ESM——整个包切换为 ES Module5.0.0对应 4.0.0 同批发布Export maps for all packages——所有包引入导出映射两处破坏CSS 导入路径从uppy[package]/dist/styles.min.css变为uppy[package]/css/styles.min.css不再允许导入未显式导出的内部路径如uppy/core/lib/foo.js。同时uppy/react、uppy/vue、uppy/svelte中依赖 peer dependency 的组件被迁移到子路径避免用户被迫安装用不到的 peer 依赖。以uppy/react为例的迁移// Before import { Dashboard, StatusBar } from uppy/react; // Now import Dashboard from uppy/react/dashboard; import StatusBar from uppy/react/status-bar;5.0.1Removed main from package.json, since export maps serve as the contract for the public API——进一步以导出映射为唯一 API 契约4.1.4 / 4.2.0cleanup tsconfig / remove paths from all tsconfigs——全仓 tsconfig 清理2.0.5Refactor locale scripts generate types and docs——locale 脚本重构并生成类型与文档。九、HTTP 客户端与错误处理的加固Client在版本迭代中不断加固网络层2.1.4PropagateisNetworkErrorthrough error wrappers配合uppy/utils2.1.5improve fetch error handling2.3.0propagate error details when creating Assembly fails——创建 Assembly 失败时透传详细错误3.1.1fixassemblyOptionsoption3.1.2fix socket error message3.1.6ensurefieldsis not nullish when there are no uploaded files3.2.1use uppercase HTTP method names配合uppy/aws-s3等包统一大写方法名。当前 Client.ts 的实现要点createAssembly向${service}/assemblies发送FormData字段包括params字符串或 JSON 序列化、signature、fields展开的键值对以及num_expected_upload_filesClient.tsreserveFile / addFile服务于importFromUploadURLs模式前者按文件大小预留资源后者在文件已有uploadURL后将其导入 AssemblyClient.tsAssemblyError创建 Assembly 失败时如果响应 JSON 携带assembly.error会构造带details与assembly的AssemblyError并附带Assembly ID便于排查[Client.ts](https://link.gitcode.com/i/6c22f1a2696c2ce2d844eeea6818b0f2#L24-L38, L79-L99)错误上报submitError把错误 POST 到https://transloaditstatus.com/client_error附带endpoint、assembly_id、userAgent、客户端版本等信息errorReporting: false时跳过上报直接抛出Client.ts。十、Tus 集成的细节约束插件默认走“直接上传到 Transloadit”的路径在 install() 中自动注册uppy/tus并注入关键配置storeFingerprintForResuming: false——禁用 tus-js-client 的指纹续传。注释解释了原因Transloadit 续传需要重建 WebSocket 连接而所需状态tus URL、Assembly URL、WebSocket URL以及加入 Assembly 的全部文件不保存在 tus 指纹里而是由 Golden Retriever 管理因此禁用 tus 默认续传以避免上传到过期 AssemblyallowedMetaFields: true——把用户设置的元数据全部透传给 Transloadit最终以file.user_meta形式出现在模板中对应 4.3.3 的user_meta类型limit、rateLimitedQueue、retryDelays——与插件选项共享同一套并发与重试策略。#attachAssemblyMetadataindex.ts负责为每个文件附加 Assembly 相关的元数据assembly_url、filename、fieldname: file与 tus 配置端点、addRequestId: true便于调试。对于远端文件如来自 Dropbox、Google Drive 等当status.companion_url命中 Transloadit 官方 Companion 正则时会替换为 Assembly 专属的 Companion 地址而自托管 Companion 则保持原样。5.1.1的修复“Ensure final assembly status fetch usesassembly_ssl_url”正是为了保证最终状态请求始终走 HTTPS——对应 onAssemblyFinished 中通过getAssemblyUrlSsl获取状态 URL 的实现。十一、版本时间线速查与升级要点把 CHANGELOG 中的实质性变更按时间线归纳如下不含纯依赖 bump版本时间主题关键词2.0.52021-12locale 脚本重构、生成类型与文档2.1.x2022-01轮询限流错误处理、限流默认值、Tus 错误处理2.2.02022-05取消 Assembly 提案、创建与轮询限流2.3.x2022-05~08ESM 重构、错误详情透传、COMPANION_PATTERN导出修复、取消语义、文件移除即取消3.0.02022-08切换 ESM3.1.02023-01引入assemblyOptions、废弃旧选项3.2.02023-07实现 SSE 事件 API3.3.02023-09移除 Socket.io、发出进度事件3.5.02024-02新增clientname选项3.6.0 / 4.0.0-beta.12024-03迁移到 TypeScript4.0.0-beta.102024-06简化为始终运行单个 Assembly4.1.02024-08execution_progress类型、文件移除判断修复4.1.2 / 4.0.22024-08~09allowMultipleUploadBatches修复4.3.0—用 tsc 替代 Babel4.3.3—user_meta类型5.0.0—Export maps、CSS 导入路径变更、框架组件子路径化5.1.x—SDK 类型接入、HTTPS 状态请求、Golden Retriever 契约变更5.4.0 / 5.5.x—导出Assembly/Client/AssemblyError、改用transloadit/types6.0.0—移除 Instagram 引用、新增assemblyStatus/lastAssemblyStatus、取消事件携带最新状态升级到 5.x/6.x 的实操要点CSS 导入改为uppy/transloadit/css/styles.min.css形式的子路径若在使用uppy/react等框架封装把组件导入切换到子路径uppy/react/dashboard类型层面AssemblyResult等类型的“完整但更宽松”特性可能需要补类型守卫AssemblyInstructionsInput现在可直接从插件包导入与新版uppy/golden-retriever配合时uppy/transloadit必须同步升级到 5.1.3反之亦然因为内部恢复契约已从restore:get-data换成restore:plugin-data-changed插件状态新增assemblyStatus与lastAssemblyStatusUI 可据此区分“当前运行中”与“上一次”的 Assembly 状态。十二、如何验证与深入仓库为上述结论提供了可运行的验证途径单元测试test/index.test.js 覆盖“assemblyOptions失败不留残余进度”“Assembly 创建失败的错误包装与消息Transloadit: Could not create Assembly: ...”“暂停后恢复完成”等场景test/Assembly.test.js 覆盖状态 diff 与事件顺序源码入口src/index.ts选项、事件、主流程、src/Assembly.tsSSE/轮询/状态机、src/Client.tsHTTP 与错误上报、src/AssemblyWatcher.ts多 Assembly 完成跟踪运行测试在包目录执行yarn vitest run对应 package.json 中的test脚本示例仓库根目录 examples/transloadit 提供了本地运行 demoREADME 注明仅限测试用途生产环境请走服务端签名集成。结语透过 packages/uppy/transloadit/CHANGELOG.md 这面“镜子”可以看到一个上传处理插件在两年多时间里完成的三次范式转移配置从分散走向assemblyOptions统一、实时通道从 Socket.io 走向 SSE 轮询兜底、类型从手写走向官方transloadit/types同时伴随着取消/重试语义的反复锤炼与 Golden Retriever 恢复契约的重构。读懂这些变更不仅能帮你准确升级版本、规避破坏性改动也能让你在使用该插件时对底层机制有更可靠的预期。赞分享前端UI组件后端【免费下载链接】uppyThe next open source file uploader for web browsers :dog:项目地址https://gitcode.com/gh_mirrors/up/uppy点击查看免费下载相关推荐Uppy Google Drive 插件演进全解析从 CHANGELOG 到源码级实现Uppy Google Drive 插件演进全解析从 CHANGELOG 到源码级实现 本文以 uppy/google drive 包的 CHANGELOG前端UI组件后端Janus WebRTC Server 版本演进全解析从 CHANGELOG 看 v1.x 架构迭代与插件生态Janus WebRTC Server 版本演进全解析从 CHANGELOG 看 v1.x 架构迭代与插件生态 Janus 是一个开源的、通用目的的 WebR音视频后端即时通讯Uppy Drop Target 插件演进全解从 CHANGELOG 到源码的拖拽上传实现指南Uppy Drop Target 插件演进全解从 CHANGELOG 到源码的拖拽上传实现指南 uppy/drop target 是 Uppy 生态中负责“前端UI组件后端上一篇Bloom Control详解如何通过TCP命令实时管理API缓存下一篇5 步用 ESPHome 把电磁阀从 0 到 1 跑通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →