網站第三方腳本載入失敗:讓核心內容先能用

第三方聊天、推薦或統計腳本載入失敗,不應讓整篇文章只剩轉圈圈。訪客來讀內容,至少要能看到正文、用普通連結前往下一頁,並知道附加功能現在能不能用。

先分清哪些功能是核心,哪些只是加強。網站需要登入或付款才能完成的動作,不能用假成功提示替代;但文章閱讀、聯絡方法與基本導覽,通常可以先保留在原始HTML裡。

先看停用附加腳本後,還剩什麼

挑一個自有測試頁,記下訪客最常做的動作,例如閱讀教學、打開分類或找到聯絡方法。只阻擋準備檢查的附加腳本,再重新整理。若正文消失,或普通連結也必須等那支腳本建立,核心入口就過度依賴它。

本文的文章頁案例,正文與連結先在HTML裡,附加導覽再透過一個獨立腳本啟用。阻擋該腳本後,文章仍在、原生details仍能展開、普通連結仍能移到說明;側邊只改成「暫時無法使用」與替代入口。

附加導覽腳本被阻擋時,文章摘要、原生展開說明與普通連結仍可操作
附加服務失敗只影響自己的區塊,閱讀入口仍然保留。

這是可操作的文章頁範例,不是第三方產品後台。正式網站要按自己的工具和主題檢查,不能因範例保留了連結,就推成所有付款、搜尋或會員功能都有替代路徑。

把基本內容先寫在HTML

連結要有真正的href,不要只留一個onclick。按鈕用於展開或觸發動作;前往另一頁的入口則使用連結。即使附加程式沒有執行,訪客仍能辨識下一步。

<article>
  <h2>網站導覽說明</h2>
  <p>先整理主要分類與聯絡入口。</p>
  <a href="/guides/navigation/">閱讀完整說明</a>
</article>
<aside>
  <p id="extra-status" role="status">
    附加服務載入中,可先使用文章連結。
  </p>
  <div id="extra-widget"></div>
</aside>

範例網址要換成自己存在的頁面。不要先用CSS把所有正文隱藏,等第三方成功才移除class;這樣即使HTML已經有內容,腳本失敗仍會把文章藏住。先讓正文可讀,再逐步增加附加互動。

載入失敗與執行失敗,要各有出口

外部script資源載不回來,可以由error事件處理;載回來後初始化函式拋錯,則需要對初始化另做處理。兩者不是同一件事。script的load事件發生,不能單憑它就顯示整個服務已正常運作。

const status = document.querySelector('#extra-status');
const script = document.createElement('script');
const showFallback = () => {
  status.textContent = '附加服務暫時無法使用,請用文章連結。';
};
script.src = '/assets/optional-widget.js';
script.onload = () => {
  try {
    if (!window.OptionalWidget) throw new Error('missing widget');
    window.OptionalWidget.mount(document.querySelector('#extra-widget'));
    status.textContent = '附加服務已就緒。';
  } catch (error) {
    showFallback();
  }
};
script.onerror = showFallback;
document.head.append(script);

這段用示例物件說明邊界,並非所有工具都叫OptionalWidget。使用真實服務時,依它的正式初始化方法和錯誤回傳調整。若初始化本身是非同步,還要處理它的Promise拒絕;同步try/catch不會自動接住稍後才發生的非同步錯誤。

回饋區寫的是附加服務狀態,不要擋住整篇文章,也不要讓每次重試都彈出全頁視窗。失敗原因留在維護紀錄;訪客需要知道的是目前可用入口與下一步,不必看到一串程式堆疊。

defer與async不是失敗備援

調整script載入方式可以影響解析與執行時機,但不會自動建立替代內容。即使加了defer,腳本404、被阻擋或初始化失敗,原本依賴它的功能仍可能不能用。

async也不保證依你寫在HTML裡的順序執行。若兩支腳本有依賴關係,先查工具要求的載入順序與初始化入口;不要只為了看起來比較快,就把每個script都加async。

這篇範例只用一個可選的資源,沒有處理跨來源驗證、登入或付款。若服務有完整性或安全政策要求,照既有規則核對,不要為了讓它載入而停用正式安全限制。

替代入口也要真的能用

聊天服務失敗時,若提供聯絡頁,那一頁就必須存在,且內容能說清楚其他聯絡方法。推薦功能失敗時,可以保留分類或文章列表;不能放一個看起來能點、卻只會再呼叫同一支失效腳本的按鈕。

只處理可替代的任務。涉及帳號權限、付款或資料寫入時,讓失敗保持失敗,保留可恢復資訊並提供正確支援入口。不要用前端回饋偽裝已付款、已送信或已提交資料。

等待很久也要能先做別的事。可讓服務區說明仍在等待,同時保持正文可用;超時策略則按實際工具安排。移除script元素或停止畫面轉圈,不一定能取消已經開始的下載與執行,別把它當成通用取消機制。

修正後,分開試三種情況

先試正常載入,確認加強功能仍能初始化;再阻擋那一支資源,確認fallback文字與連結;最後讓初始化拋錯,確認載入成功但功能失敗時也有出口。不要只把整個瀏覽器的JavaScript關掉,就當作已測過單一資源失敗。

檢查過程只用自有測試資源,不需要干擾真正的第三方服務。保留頁面HTML、資源URL、阻擋條件與看到的結果,交給維護者時才能指明是哪一段依賴。

用Tab走過基本連結和替代入口,也試連結目的地。修改只限自己的附加區塊,保留原始設定;若核心功能被影響,先回復這次改動,再重新畫出依賴關係。

統計腳本失敗與文章不能讀,是不同結果。頁面仍可用,不代表統計已收到事件;服務區顯示就緒,也不代表收件、搜尋或其他後端功能已完成。按具體任務核對,才知道備援真正保住了什麼。

參考資料

原文鏈接:https://wntheme.com/third-party-script-failure-fallback/,轉載請註明出處。
0

評論0

顯示驗證碼
沒有帳號?註冊  忘記密碼?