跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端 JS 加载失败的处理方案与重试机制

对前端 JS 资源加载失败导致页面功能不可用的问题,分析了网络波动、CDN 故障及缓存污染等成因。提出通过监听 onerror 事件实现自动重试机制,并结合多 CDN 源备份策略提升容灾能力。最终确保关键脚本加载失败时提供降级提示,增强应用可靠性。

云间漫步发布于 2026/4/5更新于 2026/10/23108 浏览
前端 JS 加载失败的处理方案与重试机制

在这里插入图片描述

前端引入的 JS 加载失败问题处理

今天在公司被客户反馈系统功能无法使用,通过排查发现是项目中的某一个 JS 一直加载失败导致。该公共 JS 工具类放在某一个 CDN 节点上(多项目共享引入),由于 CDN 节点故障,导致加载失败,从而影响页面功能!

在这里插入图片描述

JS 文件加载失败是前端开发常见问题之一,既然问题找到了那么就很好解决了,这里分享一下解决思路。

为什么会出现 JS 加载失败?

有小伙伴要问了,为什么会出现 JS 加载失败?

由于网络请求具有不确定性,特别是在移动端和弱网环境下,JS 文件加载可能因以下原因失败:

  • 网络问题:用户的网络环境不稳定
  • CDN 故障:CDN 节点挂了,资源就直接 404
  • 缓存污染:某些浏览器或代理缓存了错误的文件

以上这些问题不可完全避免,但我们能在代码层面进一步完善尽量给用户进行兜底。

解决思路

既然是加载失败,那么是否可以提供一种重试机制,当前端加载 JS 失败了进行重试,另外由于单节点的问题,我们还可以多源备份,避免单节点故障导致的问题!

在这里插入图片描述

  • 自动重试:加载失败后,尝试再次发起请求
  • 多源加载:比如主域名失败后,切换备用的 CDN 地址

基础监听与重试方案

核心逻辑是:用 script 标签去加载资源,监听 onerror 事件,失败后重试,以下是加载重试的代码,可以根据自身的需求进行调整改动:

function loadScript(url, options = {}) {
    const { maxRetry = 3, timeout = 5000 } = options;
    let attempt = 0;
    return new Promise((resolve, reject) => {
        const load = () => {
            attempt++;
            const script = document.createElement("script");
            script.src = url + (url.includes("?") ? "&" : "?") + "retry=" + attempt;
            script.async = true;
            let timer = setTimeout(() => {
                script.remove();
                if (attempt < maxRetry) {
                    console.warn(`加载超时,正在重试 ${attempt}/${maxRetry} ...`);
                    load();
                } else {
                    reject(new Error(`加载超时:${url}`));
                }
            }, timeout);
            script.onload = () => {
                clearTimeout(timer);
                resolve();
            };
            script.onerror = () => {
                clearTimeout(timer);
                script.remove();
                if (attempt < maxRetry) {
                    console.warn(`加载失败,正在重试 ${attempt}/${maxRetry} ...`);
                    load();
                } else {
                    reject(new Error(`加载失败:${url}`));
                }
            };
            document.head.appendChild(script);
        };
        load();
    });
}

使用方式

loadScript("https://cdn.yourname.com/app.js", { maxRetry: 3, timeout: 3000 }).then(() => {
    console.log("脚本加载成功");
}).catch((err) => {
    console.error("脚本加载最终失败:", err);
    // 加载重试依旧失败可以提示用户,比如提示用户刷新
    // alert('资源加载失败,请重新刷新页面')
});

多源备份加载

上面我们提到了,由于我们是单节点一旦节点故障就会出现加载失败的问题,既然如此我们还可以准备多个地址:

const cdnList = ["https://cdn1.yourname.com/app.js", "https://cdn2.yourname.com/app.js", "https://cdn3.yourname.com/app.js"];
(async () => {
    for (const url of cdnList) {
        try {
            await loadScript(url);
            console.log("成功加载:", url);
            break;
        } catch (e) {
            console.warn("失败,尝试下一个源:", url);
        }
    }
})();

这样,即使某个 CDN 节点彻底挂了,也能通过备用源恢复。

总结

通过本文的介绍,相信已经掌握了 JS 加载失败的重试方案,总结一下无非就是解决以下几个问题:

  • 加载失败的重试:失败重试,次数通常 2 - 3 次足够,过多重试会影响用户体验
  • CDN 容灾:准备多个 CDN 地址,主地址失败时自动切换
  • 提供降级方案:关键资源重试加载依然失败时显示友好提示(比如演示代码中弹出警告框告知刷新)

通过 JS 加载重试机制可以提升应用的可靠性,即便因为各种原因出现加载失败的问题,都尽可能给用户进行兜底。实现重试逻辑,让应用更加健壮可靠。

目录

  1. 前端引入的 JS 加载失败问题处理
  2. 为什么会出现 JS 加载失败?
  3. 解决思路
  4. 基础监听与重试方案
  5. 多源备份加载
  6. 总结

更多推荐文章

查看全部
  • 基于 Rokid AR 眼镜的健康管理应用开发实践
  • 基于 Spring Cloud 与 AI 的分布式智能推荐系统构建
  • C++ 双指针实战:有效三角形个数与和为 S 的两个数字
  • 算法:双指针法求解有效三角形个数
  • Git Cola 图形界面工具使用指南:可视化版本控制
  • 双指针算法进阶:从三角形计数到四数之和
  • Cursor 的代理配置:填一次就生效
  • RAG 应用构建与优化:解决检索召回与上下文窗口问题
  • DeepSeek 深度使用指南:提示词技巧与本地知识库搭建
  • 双指针算法:有效三角形的个数
  • 万方AIGC检测降重工具选择指南
  • 大模型产品化,不过是三支舞
  • Docker 镜像导出导入与容器快照操作指南
  • 西门子 S7-1200FC PLC 与松下机器人 Profinet 通信及外部控制实战
  • 豆包 AI 视频及图片无水印保存方法
  • Windows 7系统安装 OfficeAI 提示 “需要 Windows 服务包 1 或更高”解决方法
  • FPGA 实现高速数字信号处理的核心技术与工程实践
  • 字节跳动豆包大模型家族与火山方舟 2.0 发布详解
  • Windows 11 安卓与 Linux 子系统技术解析
  • 基于 Rust 与 DeepSeek 构建高性能 Text-to-SQL 数据库代理服务

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online