作者:平白設計編輯部|發布與最後查證:2026-09-29|適用:台灣(中華民國)|技術資訊,不保證搜尋排名
開學季過後,行銷團隊常會加入新的 LINE 客服外掛或熱點圖工具。這些第三方腳本若直接塞在 head 且未加延遲屬性,預設同步載入會阻塞主執行緒,拉長總阻塞時間。本文盤點外部腳本的載入策略,說明 defer 與 async 差異,並提供將非關鍵程式移至閒置時執行的具體做法。這屬於技術檢查,不保證 PageSpeed 分數或搜尋排名。
文章重點
- 第三方腳本預設同步載入會阻塞主執行緒,拉長互動延遲。
- TBT 是 Core Web Vitals 中反映主執行緒被佔用的關鍵指標。
- defer 依序在解析後執行,async 下載完立即執行,兩者適用情境不同。
- 非首屏必要腳本可改用 defer 或透過 Intersection Observer 動態載入。
開學季新增腳本為何拖慢網頁
開學一個月後,行銷團隊通常會急著上線新的 LINE 客服外掛、熱點圖工具或問卷彈窗。這些第三方腳本多半要求你把一段 script 標籤貼進 head,而且預設沒有加上任何延遲屬性。瀏覽器遇到這種同步腳本時,會暫停 HTML 解析,先下載並執行它,導致後續內容全部卡住。
當多個外掛同時採用同步載入,主執行緒就會被反覆佔用。使用者點擊按鈕或捲動頁面時,瀏覽器還在忙著跑分析代碼,畫面看起來沒反應。這種情況在行動裝置上特別明顯,因為手機的處理器效能有限,阻塞時間會被進一步放大。
要確認問題源頭,可以打開 Chrome DevTools 的 Performance 面板,觀察 Long Tasks 是否集中在第三方網域。另外,跑一次 Lighthouse 報告,查看「減少第三方程式碼影響」段落,就能列出哪些外部腳本吃掉最多主執行緒時間。

TBT 與互動延遲的關係
Total Blocking Time(TBT)指的是首次內容繪製到可互動時間之間,所有長任務超過五十毫秒的部分總和。簡單說,就是主執行緒被卡住、無法回應使用者操作的累計時間。這個指標直接對應到使用者感受到的「卡頓」。
在 Core Web Vitals 體系裡,TBT 雖然是實驗室指標,卻能有效預測實際互動體驗。第三方腳本是 TBT 飆高的常見元兇,因為它們往往包含大量初始化邏輯,例如建立 WebSocket 連線或掃描 DOM 結構,這些動作都需要佔用主執行緒。
降低 TBT 的核心思路不是刪除功能,而是把非必要的執行時機往後挪。就像網站改版後需要檢查基礎設定一樣,你可以參考改版後 favicon 路徑怎麼抽樣的做法,逐一盤點每個資源的載入優先順序,確保關鍵內容先呈現。
<script src="https://example.com/chatbot.js" defer></script>
<script src="https://example.com/analytics.js" async></script>
<script>
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const s = document.createElement('script');
s.src = 'https://example.com/heavy-widget.js';
document.body.appendChild(s);
observer.disconnect();
}
});
});
observer.observe(document.getElementById('trigger-zone'));
</script>
defer 與 async 的差異與選擇
script 標籤的 defer 屬性會讓瀏覽器在背景平行下載檔案,但等到 HTML 解析完成後才依序執行。這表示多個 defer 腳本會按照它們在文件中的出現順序跑,不會互相搶佔執行緒,適合有依賴關係的程式庫。
async 屬性同樣允許背景下載,但一旦下載完成就立刻插入執行緒執行,不管 HTML 解析到哪了。多個 async 腳本的執行順序無法預測,因此只適合彼此獨立、不依賴 DOM 完整性的追蹤代碼或統計像素。
選擇原則很明確:如果腳本需要操作 DOM 或有先後依賴,用 defer;如果是純資料回報、跟畫面無關的獨立分析工具,用 async。兩者都比預設的同步載入好,能避免阻塞 HTML 解析,讓首屏內容更快顯示出來。

用 Intersection Observer 延後載入
即使加了 defer,某些重量級外掛(如聊天機器人視窗)仍會在頁面載入完畢後立刻執行,擠壓其他互動任務。更好的做法是根本不在初始 HTML 裡引入它,而是等使用者真正需要時才動態載入,把主執行緒的空檔留給核心內容。
Intersection Observer API 可以監聽特定元素是否進入可視範圍。例如把觸發按鈕放在頁尾,當使用者往下捲動接近該區域時,才透過 JavaScript 動態建立 script 標籤並插入聊天機器人的來源網址。這樣首屏的 TBT 幾乎不受影響。
這種按需載入的策略也適用於嵌入式影片、社群貼文牆或地圖元件。實作時記得搭配 fallback,確保網路較慢的使用者仍能手動點擊載入。順帶一提,檢查第三方嵌入是否影響中繼資料時,可參閱改版後 og:locale 怎麼抽樣的流程來驗證。
標籤管理工具的順序控制
許多公司使用 GTM 或其他標籤管理工具集中派發第三方腳本。這類平台本身提供了觸發條件設定,可以讓你在「視窗載入完成後」或「閒置時」才啟動特定標籤,而不必手動改寫每一段程式碼,大幅降低維護成本。
在標籤管理工具裡,建議把分析類追蹤碼設為非同步觸發,並限制其執行優先級。對於需要操作畫面的外掛,則安排在主要內容渲染完畢後再依序啟動。這樣既能滿足行銷需求,又不會讓所有腳本在同一瞬間爭搶主執行緒。
定期審查已安裝的標籤清單同樣重要。過期的活動追蹤碼或已停用的 A/B 測試工具若未移除,仍會消耗效能。每次改版或季度檢視時,應像核對改版後 web manifest 怎麼抽樣那樣,逐項確認每個外部腳本是否仍有存在必要。
| 載入方式 | 執行時機 | 適用情境 |
|---|---|---|
| 同步(無屬性) | 下載時阻塞解析 | 極少使用,僅限關鍵阻斷邏輯 |
| defer | HTML 解析完成後依序執行 | 需操作 DOM 或有依賴的腳本 |
| async | 下載完立即執行,順序不定 | 獨立追蹤碼、統計像素 |
| 動態插入 | 由 JS 條件觸發後才載入 | 聊天機器人、非首屏重組件 |
| 標籤管理觸發 | 依平台設定的事件啟動 | 集中管理的行銷與分析標籤 |
可以先做
- 開啟 Lighthouse 檢查第三方程式碼影響段落,列出高耗時腳本。
- 將非首屏必要的外掛 script 加上 defer 或 async 屬性。
- 用 Intersection Observer 把聊天機器人改為捲動後才載入。
- 在標籤管理工具中調整觸發條件,錯開執行時機。
不要當成已完成
- 不要以為加了 defer 就一定能提升 PageSpeed 分數或排名。
- 不要把相互依賴的腳本全設為 async,會導致執行順序錯亂。
- 不要忽略已停用的追蹤碼,它們仍會佔用主執行緒資源。
- 不要將此技術檢查視為最終成效保證,仍需持續觀測。
常見問題
defer 和 async 哪個對 SEO 比較好?
兩者都能改善載入效能,但選擇取決於腳本特性。需要操作 DOM 的用 defer,獨立追蹤碼用 async。重點是避免同步阻塞,而非追求單一屬性的排名優勢。
Lighthouse 裡的 TBT 數據代表什麼?
TBT 是總阻塞時間,反映主執行緒被長任務佔用的累計毫秒數。數值越高,使用者點擊或捲動時感受到延遲的機率越大,是評估互動體驗的重要實驗室指標。
聊天機器人一定要一進頁面就載入嗎?
不一定。若機器人按鈕在頁尾,可用 Intersection Observer 等使用者捲動到附近才動態載入腳本,這樣能顯著降低首屏的 TBT,同時不影響功能使用。
用了 GTM 還需要手動加 defer 嗎?
GTM 容器本身建議用適當方式載入,而容器內的個別標籤則透過平台的觸發條件來控制時機,不需要也不建議手動在每個標籤上加 HTML 屬性。
重點摘要
- 第三方腳本同步載入會阻塞主執行緒,拉長 TBT。
- defer 適合有依賴的腳本,async 適合獨立追蹤碼。
- 非首屏元件可改用 Intersection Observer 動態載入。
- 定期清理標籤管理工具中過期或冗餘的外部腳本。
