可使用 import() 返回的 Promise 配合 catch 或 try/catch 捕获加载失败并切换备用 CDN 重试;需封装可重试函数,提取主域名、预设备用列表、控制次数与延迟,优先重试网络类 TypeError,跳过 SyntaxError 等;结合构建工具注入域名变量实现多环境适配,并提供加载提示、优雅降级及错误监控。

可以使用 import() 返回的 Promise 配合 catch() 或 try/catch 捕获加载失败,并在异常时切换备用 CDN 域名重试。关键在于把动态导入封装成可重试的函数,避免硬编码路径、合理控制重试次数和延迟。
捕获 import() 失败并区分错误类型
import() 抛出的错误通常是 TypeError(如网络中断、CORS)、SyntaxError(模块解析失败)或 NetworkError(部分环境)。建议先检查 error.name 和 error.message,优先重试网络类错误,跳过语法或逻辑错误:
- 用
error.name === 'TypeError' && /failed|network|fetch/.test(error.message)判断是否值得重试 - 对
SyntaxError或RangeError直接 reject,不重试 - 注意:某些浏览器可能将 CORS 失败包装为
TypeError,需结合 URL 和上下文判断
实现带备份域名的自动重试函数
把模块路径中的主域名提取出来,预设一组备用域名(如 ['cdn-a.example.com', 'cdn-b.example.com', 'cdn-c.example.com']),每次失败后按顺序切换。推荐封装为通用函数:
- 接收原始路径(如
'https://cdn-a.example.com/lib/chart.js')和备用域名列表 - 内部维护当前尝试的索引,递归调用自身,最多重试 2–3 次
- 每次重试前加
await new Promise(r => setTimeout(r, 300))避免雪崩请求 - 示例路径替换:
url.replace(/^https?:\/\/[^/]+/, `https://${fallbackHosts[i]}`)
配合构建工具处理路径可配置性
硬编码域名不利于多环境部署。建议在打包时注入变量,例如用 Webpack 的 DefinePlugin 或 Vite 的 define 注入 __CDN_HOSTS__ 数组;或通过 import.meta.env 读取环境变量。这样运行时只需:
const hosts = import.meta.env.PROD ? __CDN_HOSTS__ : ['localhost:5173']- 避免在代码里写死
cdn-a.example.com,提升可维护性 - 开发环境可直接 fallback 到本地服务,便于调试
优雅降级与加载状态提示
重试期间用户应感知加载状态,失败后也需提供兜底方案:
- 在重试前显示“资源加载中…”提示,重试次数超限后显示“加载失败,请检查网络”
- 可预置轻量级备用模块(如纯 JS 实现的简化版图表库),用
import('./fallback-chart.js')作为最终 fallback - 记录错误到监控系统(如 Sentry),带上当前 host、重试次数、原始 URL,便于定位 CDN 问题

















