重试插件
重试插件为 Module Federation 提供强大的资源加载失败重试机制,当远程模块或资源加载失败时,自动进行重试以确保应用的稳定性。
功能特性
- 自动重试: 资源加载失败时自动重试,提高应用稳定性
- 域名轮换: 支持多个备用域名,自动切换到可用的域名
- 缓存破坏: 通过添加查询参数避免浏览器缓存影响重试结果
- 灵活配置: 支持自定义重试次数、延迟时间和回调函数
安装
迁移指南
从 v0.18.x 到 v0.19.x
插件配置已经简化。旧的 fetch 和 script 配置对象已被弃用:
使用方法
方式一:构建插件中使用
rspack.config.ts
方式二:运行时注册
配置参数
基础配置
retryTimes
- 类型:
number - 可选
- 重试的次数,默认为 3
retryDelay
- 类型:
number - 可选
- 重试间隔时间(毫秒),默认为 1000
高级配置
domains
- 类型:
string[] - 可选
- 备用域名列表,用于域名轮换重试,默认为空数组
addQuery
- 类型:
boolean | ((context: { times: number; originalQuery: string }) => string) - 可选
- 是否在重试时添加查询参数,默认为 false
- 当为函数时,接收重试次数和原始查询字符串,返回新的查询字符串
fetchOptions
- 类型:
RequestInit - 可选
- 自定义 fetch 请求选项,默认为空对象
manifestDomains
- 类型:
string[] - 可选
- 用于
mf-manifest.json资源的域名轮换列表(优先级高于domains)。当配置了manifestDomains时,插件在获取mf-manifest.json等清单资源的重试中,会优先按manifestDomains顺序进行域名切换;其他资源仍使用domains。
回调函数
onRetry
- 类型:
({ times, domains, url, tagName }: { times?: number; domains?: string[]; url?: string; tagName?: string }) => void - 可选
- 重试时触发的回调函数
- 参数:
times重试次数,domains域名列表,url请求URL,tagName资源类型
onSuccess
- 类型:
({ domains, url, tagName }: { domains?: string[]; url?: string; tagName?: string; }) => void - 可选
- 重试成功时触发的回调函数
- 参数:
domains域名列表,url请求URL,tagName资源类型
onError
- 类型:
({ domains, url, tagName }: { domains?: string[]; url?: string; tagName?: string; }) => void - 可选
- 重试最终失败时触发的回调函数
- 参数:
domains域名列表,url请求URL,tagName资源类型
详细说明
重试机制
插件会在资源加载失败时自动进行重试,重试次数由 retryTimes 参数控制。例如:
retryTimes: 3表示总共尝试 4 次(1次初始尝试 + 3次重试)- 每次重试前会等待
retryDelay毫秒
域名轮换
当配置了 domains 参数时,插件会在重试时自动切换到下一个域名:
重试顺序:
- 首次尝试:原始 URL
- 第1次重试:切换到
cdn2.example.com - 第2次重试:切换到
cdn3.example.com - 第3次重试:切换到
cdn1.example.com
缓存破坏
通过 addQuery 参数可以在重试时添加查询参数,避免浏览器缓存影响:
也可以使用自定义函数:
回调函数
插件提供了三个回调函数,让你可以监控重试过程:
回调函数参数说明:
times: 当前重试次数(从1开始)domains: 当前使用的域名列表url: 当前请求的URLtagName: 资源类型('fetch' 或 'script')
使用场景
1. CDN 故障容错
2. 网络不稳定环境
3. 监控和日志
注意事项
- 性能考虑: 过多的重试次数会增加加载时间,建议根据实际网络环境调整
- 域名配置: 确保
domains中的域名都指向相同的资源 - 缓存策略: 使用
addQuery时注意 CDN 的缓存策略 - 错误处理: 重试失败后,原始错误会被抛出,需要在上层进行错误处理
错误码
插件使用标准的 Module Federation 错误码:
RUNTIME_008: 资源加载失败,触发重试机制