最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端引入的JS加載失敗原因分析與解決方案

 更新時(shí)間:2025年09月13日 09:28:30   作者:Micro麥可樂  
這篇文章主要為大家詳細(xì)介紹了前端引入的JS出現(xiàn)加載失敗的原因分析與解決方案,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1. 事故起因

今天在公司被客戶反饋系統(tǒng)功能無法使用,通過排查發(fā)現(xiàn)發(fā)現(xiàn)是項(xiàng)目中的某一個(gè)JS一直加載失敗導(dǎo)致,該公共JS工具類放在某一個(gè)CDN節(jié)點(diǎn)上(多項(xiàng)目共享引入),由于CDN節(jié)點(diǎn)故障,導(dǎo)致加載失敗,從而影響頁面功能!

JS文件加載失敗是前端開發(fā)常見問題之一,既然問題找到了那么就很好解決了,這里分享一下博主的解決思路,教你輕松解決這個(gè)問題!

2. 為什么會(huì)出現(xiàn) JS 加載失敗

有小伙伴要問了了?為什么會(huì)出現(xiàn) JS 加載失?。?/p>

由于網(wǎng)絡(luò)請(qǐng)求具有不確定性,特別是在移動(dòng)端和弱網(wǎng)環(huán)境下,JS文件加載可能因以下原因失?。?/p>

  • 網(wǎng)絡(luò)問題:用戶的網(wǎng)絡(luò)環(huán)境不穩(wěn)定
  • CDN 故障:CDN節(jié)點(diǎn)掛了,資源就直接 404
  • 緩存污染:某些瀏覽器或代理緩存了錯(cuò)誤的文件

以上這些問題不可完全避免,但我們能在代碼層面進(jìn)一步完善盡量給用戶進(jìn)行兜底。

3. 解決思路

既然是加載失敗,那么是否可以提供一種重試機(jī)制,當(dāng)前端加載JS失敗了進(jìn)行重試,另外由于單節(jié)點(diǎn)的問題,我們還可以多源備份,避免單節(jié)點(diǎn)故障導(dǎo)致的問題!

自動(dòng)重試:加載失敗后,嘗試再次發(fā)起請(qǐng)求

多源加載:比如主域名失敗后,切換備用的 CDN 地址

4. 基礎(chǔ)監(jiān)聽與重試方案

核心邏輯是:用 script 標(biāo)簽去加載資源,監(jiān)聽 onerror 事件,失敗后重試,以下是加載重試的代碼,小伙伴們可以根據(jù)自身的需求進(jìn)行調(diào)整改動(dòng):

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(`加載超時(shí),正在重試 ${attempt}/${maxRetry} ...`);
          load();
        } else {
          reject(new Error(`加載超時(shí):${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('資源加載失敗,請(qǐng)重新刷新頁面')
});

5. 多源備份加載

上面我們提到了,由于我們是單節(jié)點(diǎn)一旦節(jié)點(diǎn)故障就會(huì)出現(xiàn)加載失敗的問題,既然如此我們還可以準(zhǔn)備多個(gè)地址:

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("失敗,嘗試下一個(gè)源:", url);
    }
  }
})();

這樣,即使某個(gè) CDN 節(jié)點(diǎn)徹底掛了,也能通過備用源恢復(fù)

6. 總結(jié)

通過本文的介紹,相信小伙伴已經(jīng)掌握了JS加載失敗的重試方案,總結(jié)一下無非就是解決以下幾個(gè)問題:

加載失敗的重試:失敗重試,次數(shù)通常2 - 3次足夠,過多重試會(huì)影響用戶體驗(yàn)

CDN容災(zāi):準(zhǔn)備多個(gè)CDN地址,主地址失敗時(shí)自動(dòng)切換

提供降級(jí)方案:關(guān)鍵資源重試加載依然失敗時(shí)顯示友好提示(比如演示代碼中彈出警告框告知刷新)

通過JS加載重試機(jī)制可以提升我們應(yīng)用的可靠性,即便因?yàn)楦鞣N原因出現(xiàn)加載失敗的問題,都盡可能給用戶進(jìn)行兜底。如果你也和博主一樣有類似的問題,不如花一點(diǎn)時(shí)間實(shí)現(xiàn)重試邏輯,讓你的應(yīng)用更加健壯可靠!

到此這篇關(guān)于前端引入的JS加載失敗原因分析與解決方案的文章就介紹到這了,更多相關(guān)JS加載失敗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解JS如何進(jìn)行變量解構(gòu)

    詳解JS如何進(jìn)行變量解構(gòu)

    JavaScript中,可以使用解構(gòu)賦值的方式來對(duì)數(shù)組或者對(duì)象進(jìn)行變量解構(gòu),下面小編就來為大家詳細(xì)介紹一下JavaScript實(shí)現(xiàn)數(shù)組或者對(duì)象解構(gòu)的方法吧
    2023-11-11
  • JS實(shí)現(xiàn)導(dǎo)航欄樓層特效

    JS實(shí)現(xiàn)導(dǎo)航欄樓層特效

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)導(dǎo)航欄樓層特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 探究JavaScript中的五種事件處理程序方式

    探究JavaScript中的五種事件處理程序方式

    本篇文章主要介紹了JavaScript中的五種事件處理程序方式,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-12-12
  • 解決微信小程序中的滾動(dòng)穿透問題

    解決微信小程序中的滾動(dòng)穿透問題

    這篇文章主要介紹了解決微信小程序中的滾動(dòng)穿透問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 如何使用不同的方法在 JavaScript 中添加兩個(gè)向量

    如何使用不同的方法在 JavaScript 中添加兩個(gè)向量

    這篇文章主要介紹了如何在 JavaScript 中添加向量(Vector)類,使用不同的方法在 JavaScript 中添加兩個(gè)向量,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • uniapp自定義tabbar的方法(支持中間凸起、角標(biāo)、動(dòng)態(tài)隱藏tab和全端適用)

    uniapp自定義tabbar的方法(支持中間凸起、角標(biāo)、動(dòng)態(tài)隱藏tab和全端適用)

    一個(gè)項(xiàng)目有多個(gè)角色,比如醫(yī)生和患者,tabBar跳轉(zhuǎn)的路徑不一樣,但是在pages.json中無法配置多個(gè)tabBar,這時(shí)候就要自定義tabBar了,下面這篇文章主要給大家介紹了關(guān)于uniapp自定義tabbar(支持中間凸起、角標(biāo)、動(dòng)態(tài)隱藏tab和全端適用)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • layui頁面級(jí)彈出框的實(shí)現(xiàn)

    layui頁面級(jí)彈出框的實(shí)現(xiàn)

    本文主要介紹了layui頁面級(jí)彈出框的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • JS實(shí)現(xiàn)網(wǎng)頁右側(cè)帶動(dòng)畫效果的伸縮窗口代碼

    JS實(shí)現(xiàn)網(wǎng)頁右側(cè)帶動(dòng)畫效果的伸縮窗口代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)頁右側(cè)帶動(dòng)畫效果的伸縮窗口代碼,通過JavaScript基于時(shí)間函數(shù)實(shí)現(xiàn)頁面元素樣式漸變效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • 微信小程序?qū)崿F(xiàn)電子簽名功能

    微信小程序?qū)崿F(xiàn)電子簽名功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)電子簽名功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • js的正則test,match,exec詳細(xì)解析

    js的正則test,match,exec詳細(xì)解析

    本篇文章主要是對(duì)js的正則test,match,exec進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01

最新評(píng)論

景泰县| 苗栗市| 香格里拉县| 墨江| 出国| 威海市| 江门市| 岐山县| 马关县| 武川县| 望都县| 柏乡县| 繁峙县| 江孜县| 阿图什市| 彭山县| 佛坪县| 积石山| 松桃| 连江县| 堆龙德庆县| 宣化县| 布拖县| 吉林市| 黔西县| 饶阳县| 溆浦县| 玛多县| 洛南县| 普兰店市| 建水县| 绥棱县| 汉寿县| 广西| 阿克陶县| 呼玛县| 钟祥市| 沛县| 潢川县| 商都县| 富裕县|