前端引入的JS加载失败页面功能无法使用?JS加载失败的终极解决方案

前端引入的JS加载失败页面功能无法使用?JS加载失败的终极解决方案
在这里插入图片描述
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用
🍎 《前端技术》专栏以实战为主介绍日常开发中前端应用的一些功能以及技巧,均附有完整的代码示例
✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
👍《Spring Security》专栏中我们将逐步深入Spring Security的各个技术细节,带你从入门到精通,全面掌握这一安全技术
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

前端引入的JS加载失败页面功能无法使用,客户投诉后看我三步处理完成

1. 事故起因

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

在这里插入图片描述


JS文件加载失败是前端开发常见问题之一,既然问题找到了那么就很好解决了,这里分享一下博主的解决思路,教你轻松解决这个问题!

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

有小伙伴要问了了?为什么会出现 JS 加载失败?
由于网络请求具有不确定性,特别是在移动端和弱网环境下,JS文件加载可能因以下原因失败:

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

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

3. 解决思路

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

在这里插入图片描述
  • 自动重试:加载失败后,尝试再次发起请求
  • 多源加载:比如主域名失败后,切换备用的 CDN 地址

4. 基础监听与重试方案

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

functionloadScript(url, options ={}){const{ maxRetry =3, timeout =5000}= options;let attempt =0;returnnewPromise((resolve, reject)=>{constload=()=>{ 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(newError(`加载超时:${url}`));}}, timeout); script.onload=()=>{clearTimeout(timer);resolve();}; script.onerror=()=>{clearTimeout(timer); script.remove();if(attempt < maxRetry){ console.warn(`加载失败,正在重试 ${attempt}/${maxRetry} ...`);load();}else{reject(newError(`加载失败:${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('资源加载失败,请重新刷新页面')});

5. 多源备份加载

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

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{awaitloadScript(url); console.log("成功加载:", url);break;}catch(e){ console.warn("失败,尝试下一个源:", url);}}})();

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

6. 总结

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

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

通过JS加载重试机制可以提升我们应用的可靠性,即便因为各种原因出现加载失败的问题,都尽可能给用户进行兜底。如果你也和博主一样有类似的问题,不如花一点时间实现重试逻辑,让你的应用更加健壮可靠!

如果你在实践过程中有任何疑问或更好的扩展思路,欢迎在评论区留言,最后希望大家一键三连给博主一点点鼓励!


Read more

别再硬编码熬BPM了!低代码手把手实操,4000字技术流落地指南(避坑不踩雷)

别再硬编码熬BPM了!低代码手把手实操,4000字技术流落地指南(避坑不踩雷)

作为IT产品技术人,咱们大概率都踩过BPM搭建的坑:领导拍板要做流程自动化,后端堆代码写流程引擎、前端画表单、测试反复调试兼容性,一套下来1-2个月,上线后业务说“流程要改”,又得推翻重写,加班熬夜不说,还落得个“效率低下”的评价。        近几年低代码火得一塌糊涂,腾讯、阿里、百度等大厂纷纷入局,融资动辄数千万甚至数亿,但争议也随之而来——很多程序员嗤之以鼻,觉得“低代码是给非技术人员玩的,不够硬核”“用低代码就是摆烂,解决不了复杂场景”;也有不少人盲目跟风,选个平台拖拽几下,最后搭出来的BPM要么流程卡壳、要么数据错乱,还过不了平台审核。        今天不聊虚的,不堆砌概念,也不夸大低代码的“万能性”,更不硬广轰炸——本次实操选用JNPF快速开发平台作为演示工具(仅作实操载体,全程不堆砌平台特性,只讲核心技术和落地逻辑),手把手带大家用低代码搭建一套可直接落地的中小企业采购审批BPM系统,4000字技术流干货,穿插实操踩坑点和争议观点,带你看清:低代码搭建BPM,不是“摆烂”,而是程序员解放双手、聚焦核心业务的最优解。        先抛核心观点,

Qwen3-VL-Reranker-8B应用场景:智能家居设备多模态指令理解与执行

Qwen3-VL-Reranker-8B应用场景:智能家居设备多模态指令理解与执行 想象一下这样的场景:你下班回到家,又累又饿,厨房里一片狼藉。你对着家里的智能音箱说:“把厨房台面上那个红色的、装着剩菜的碗放进洗碗机,然后帮我热一下冰箱里那盒贴着‘周三午餐’标签的饭。” 说完你就瘫在沙发上等着。 结果呢?音箱可能只会识别出“洗碗机”和“热饭”这两个关键词,然后机械地回复:“已启动洗碗机”和“微波炉已开始加热”。至于哪个碗、哪盒饭?它根本分不清,最后要么洗错了碗,要么热错了饭。 这就是当前大多数智能家居的尴尬现状——它们能“听”到你的话,却“看”不到你的世界,更“理解”不了你话语里那些丰富的视觉线索。指令一复杂,或者涉及多个物体和具体描述,系统就懵了。 今天要介绍的 Qwen3-VL-Reranker-8B,就是为了解决这个问题而生的。它不是一个简单的语音识别或图像识别模型,而是一个“多模态重排序”引擎。简单说,它能让你的智能家居系统真正“

FPGA实现MIPI协议全解析 + MIPI协议完整时序规范

FPGA实现MIPI协议全解析 + MIPI协议完整时序规范

一、MIPI协议核心基础认知 百度网盘链接:https://pan.baidu.com/s/1rDsLAXGj8WbX82teSkhuIw?pwd=1234 提取码: 1234 包含FPGA系统学习资料,免费分享 1. MIPI协议定义与核心特点 MIPI(Mobile Industry Processor Interface,移动产业处理器接口)是由MIPI联盟制定的高速串行差分接口协议,最初为手机、平板等移动设备设计,目前广泛应用于FPGA/嵌入式的图像采集(摄像头)、显示驱动(液晶屏)、高速数据传输 场景。 核心特点: ✅ 采用差分信号传输,抗干扰能力强、EMI电磁辐射小; ✅ 支持高低速双模切换,兼顾高速大数据传输和低速控制指令传输; ✅ 串行传输,引脚数量极少(对比并行RGB的几十根引脚,MIPI仅需时钟+1~4路数据差分对),硬件设计简洁; ✅ 传输速率高:单lane(数据通道)速率可达1Gbps~

5分钟玩转Cute_Animal_For_Kids_Qwen_Image,儿童专属AI绘画一键生成

5分钟玩转Cute_Animal_For_Kids_Qwen_Image,儿童专属AI绘画一键生成 1. 引言:为什么需要专为儿童设计的AI绘画工具? 在当前AIGC快速发展的背景下,图像生成技术已广泛应用于教育、娱乐和创意表达领域。然而,大多数通用AI绘画模型生成的内容偏向写实或艺术化风格,难以满足儿童用户对“可爱”、“卡通”、“安全”内容的需求。 Cute_Animal_For_Kids_Qwen_Image 镜像正是基于这一痛点打造——它依托阿里通义千问(Qwen)视觉语言大模型,经过特定数据微调与风格优化,专注于生成适合儿童审美的动物形象图片。只需输入简单的文字描述,如“一只戴帽子的小兔子在草地上跳舞”,即可快速获得色彩明亮、造型圆润、无危险元素的卡通图像。 本篇文章将带你从零开始,全面掌握该镜像的使用方法、底层工作原理以及实际应用技巧,帮助家长、教师或开发者快速上手并部署这一儿童友好型AI绘画工具。 2. 快速上手:三步生成你的第一张儿童向AI画作 2.1 环境准备与镜像加载 首先确保你已成功加载