使用第三方嵌入功能的最佳做法

概略說明如何使用技術,有效載入熱門的第三方嵌入內容。

Addy Osmani
Addy Osmani
Katie Hempenius
Katie Hempenius
Leena Sohoni
Leena Sohoni

許多網站都會使用第三方嵌入功能,將網頁的某些部分委派給其他內容供應者,藉此創造引人入勝的使用者體驗。最常見的第三方內容嵌入範例為影片播放器、社群媒體動態消息、地圖和廣告。

第三方內容可能會對網頁效能造成許多影響。這可能會造成轉譯阻斷、與其他重要資源爭用網路和頻寬,或是影響 Core Web Vitals 指標。第三方內嵌內容在載入時也可能會導致版面配置位移。本文將討論載入第三方嵌入項目時可使用的效能最佳做法、高效率的載入技術,以及有助於減少熱門嵌入項目的版面配置位移工具。

什麼是嵌入

第三方嵌入內容是指在你的網站上顯示的任何內容,包括:

  • 不是由您撰寫
  • 由第三方伺服器提供

顯示多個非螢幕內嵌內容,可延遲載入

嵌入在下列項目中的經常用:

  • 體育、新聞、娛樂和時尚相關網站會使用影片來輔助文字內容。
  • 擁有活躍 Twitter 或社群媒體帳戶的機構,會將這些帳戶的動態消息嵌入自家網頁,以吸引更多使用者或與他們接觸。
  • 餐廳、公園和活動場地網頁通常會嵌入地圖。

第三方嵌入項目通常會在網頁上的 <iframe> 元素中載入。第三方供應商通常會提供 HTML 程式碼片段,這些 <iframe> 通常會提取由標記、指令碼和樣式表組成的網頁。有些供應商也會使用動態插入 <iframe> 的程式碼片段,以便擷取其他內容。這可能會導致第三方嵌入大量內容,並延遲顯示第一方內容,進而影響網頁效能。

第三方嵌入網站的效能影響

許多熱門嵌入項目都包含超過 100 KB 的 JavaScript,有時甚至會達到 2 MB。執行期間需要更多時間載入,而且主執行緒處於忙碌狀態。LighthouseChrome 開發人員工具等效能監控工具可協助評估第三方嵌入項目對效能造成的影響

減少第三方程式碼的影響 Lighthouse 稽核結果會顯示網頁使用的第三方供應商清單,以及大小和主執行緒的封鎖時間。您可以在 Chrome 開發人員工具的「Lighthouse」分頁下方進行稽核。

建議您定期稽核嵌入項目和第三方程式碼的效能影響,因為內嵌原始碼可能會有所異動。您可以藉此機會移除多餘的程式碼。

降低第三方程式碼的影響

載入資料的最佳做法

第三方嵌入項目可能會對效能造成負面影響,但也有重要的功能。如要有效使用第三方嵌入功能並降低其對效能造成的影響,請遵循下列規範。

指令碼排序

在設計良好的網頁中,主要的第一方內容會是網頁的重點,而第三方嵌入內容則會占據側欄,或顯示在第一方內容之後。

為獲得最佳使用者體驗,主要內容應快速載入,並在任何其他輔助內容前面顯示。舉例來說,新聞頁面上的新聞文字應先載入,然後才嵌入 Twitter 動態消息或廣告。

第三方嵌入項目可能會因為要求載入第一方內容而出現問題,因此第三方指令碼標記的位置相當重要。指令碼會影響載入序列,因為 DOM 建構會在執行指令碼時暫停。將第三方指令碼標記放在主要第一方標記之後,並使用 asyncdefer 屬性以非同步方式載入。

<head>
   <title>Order of Things</title>
   <link rel="stylesheet" media="screen" href="/assets/application.css">
   <script src="index.js"></script>
   <script src="https://example.com/3p-library.js" async></script>
</head>

延遲載入

由於第三方內容通常會在主要內容之後載入,因此網頁載入時,可能不會在可視區域中顯示。在這種情況下,下載第三方資源的作業可能會延後,直到使用者捲動至網頁的該部分為止。這不僅有助於改善初始頁面載入作業,還能降低使用者在固定資料方案和網路連線速度緩慢的情況下,下載資料的費用。

延遲載入內容,直到實際需要為止,稱為「延遲載入」。視需求和嵌入類型而定,您可以使用不同的延遲載入技術。

瀏覽器延遲載入「<iframe>

如果是透過 <iframe> 元素載入的第三方嵌入項目,您可以使用瀏覽器層級的延遲載入功能,延後載入螢幕外 iframe,直到使用者捲動接近這些 iframe 為止。<iframe> 的 loading 屬性可在所有新式瀏覽器中使用。

<iframe src="https://example.com"
       loading="lazy"
       width="600"
       height="400">
</iframe>

載入屬性支援下列值:

  • lazy:表示瀏覽器應延後載入 iframe。當瀏覽器靠近可視區域時,便會載入 iframe。如果 iframe 適合延遲載入,請使用此選項。
  • eager:立即載入 iframe。如果 iframe 不是延遲載入的理想選擇,請使用此選項。如未指定 loading 屬性,此為預設行為,但精簡模式除外。
  • auto:瀏覽器可決定是否延遲載入這個頁框。

不支援 loading 屬性的瀏覽器會忽略該屬性,因此您可以套用瀏覽器層級的延遲載入做為漸進式強化。支援此屬性的瀏覽器可能會以不同的方式實作 距離檢視區範圍門檻 (iframe 開始載入的距離)。

以下提供幾種可以延遲載入不同類型嵌入 iframe 的方法。

  • YouTube 影片:如要延遲載入 YouTube 影片播放器 iframe,請在 YouTube 提供的嵌入程式碼中加入 loading 屬性。延後載入 YouTube 嵌入內容,可在初始頁面載入時節省約 500 KB 的空間。
<iframe src="https://www.youtube.com/embed/aKydtOXW8mI"
   width="560" height="315"
   loading="lazy"
   title="YouTube video player"
   frameborder="0"
   allow="accelerometer; autoplay; clipboard-write;
            encrypted-media; gyroscope; picture-in-picture"
   allowfullscreen>
</iframe>
  • Google 地圖:如要延遲載入 Google 地圖 iframe,請在 Google Maps Embed API 產生的 iframe 嵌入程式碼中加入 loading 屬性。以下是含有 Google Cloud API 金鑰預留位置的程式碼範例。
<iframe src="https://www.google.com/maps/embed/v1/place?key=API_KEY&q=PLACE_ID"
   width="600" height="450"
   style="border:0;"
   allowfullscreen=""
   loading="lazy">
</iframe>

Lazysizes 程式庫

由於瀏覽器會使用與可視區域之間的嵌入距離,除了有效連線類型和精簡模式等信號外,也能以判斷 iframe 的載入時機,因此瀏覽器延遲載入可能會不一致。如果您需要進一步控制距離閾值,或希望在不同瀏覽器中提供一致的延遲載入體驗,可以使用 lazysizes 程式庫。

lazysize 是適合 SEO 快速載入的延遲載入器,適用於圖片和 iframe。下載元件後,即可將該元件與 YouTube 嵌入內容的 iframe 搭配使用,如下所示。

<script src="lazysizes.min.js" async></script>

<iframe data-src="https://www.youtube.com/embed/aKydtOXW8mI"
   width="560" height="315"
   class="lazyload"
   title="YouTube video player"
   frameborder="0"
   allow="accelerometer; autoplay; clipboard-write;
        encrypted-media; gyroscope; picture-in-picture"
   allowfullscreen>
</iframe>

同樣地,延遲尺寸也可以搭配其他第三方嵌入的 iframe 使用。

請注意,Lazysize 會使用 Intersection Observer API 偵測元素何時顯示。

在 Facebook 中使用 data-zy

Facebook 提供不同類型的可嵌入的社交外掛程式。包括貼文、留言和影片,以及最熱門的 [喜歡] 按鈕。所有外掛程式都有 data-lazy 的設定。設為 true 可確保外掛程式透過設定 loading="lazy" iframe 屬性,使用瀏覽器的延遲載入機制。

延遲載入 Instagram 動態消息

Instagram 會在嵌入內容中提供標記區塊和指令碼。指令碼會將 <iframe> 插入網頁。由於嵌入內容經過壓縮後的大小可能超過 100 KB,因此延遲載入這個 <iframe> 可改善效能。許多 WordPress 網站的 Instagram 外掛程式 (例如 WPZoomElfsight) 都提供延遲載入選項。

以門面元件取代嵌入

雖然互動式嵌入內容可為網頁增添價值,但許多使用者可能不會與其互動。舉例來說,並非每位瀏覽餐廳網頁的使用者都會點選、展開、捲動及瀏覽嵌入式地圖。同樣地,並非每位電信服務供應商網頁使用者都會與聊天機器人互動。在這些情況下,您可以在嵌入位置顯示立面,避免載入或延遲載入嵌入項目。

具備縮放功能的地圖嵌入。
地圖嵌入
圖像地圖外觀。
地圖立面

外觀是類似於實際嵌入式第三方,但無法運作的靜態元素,因此不會對網頁載入造成太大負擔。以下是幾種最佳化嵌入功能載入方式,同時為使用者提供一些價值。

使用靜態圖片做為外觀

可使用靜態圖片取代地圖嵌入,這樣一來,您或許不需要讓地圖與使用者互動。您可以將地圖上的感興趣的區域放大、擷取圖片,並使用該區域取代互動式地圖嵌入。您也可以使用開發人員工具的「擷取節點螢幕截圖」功能,擷取內嵌 iframe 元素的螢幕截圖。

擷取節點螢幕截圖

開發人員工具會擷取 png 圖片,但您也可以考慮將圖片轉換為 WebP 格式以提升效能

使用動態圖片做為門面

這項技術可讓您在執行階段產生與互動式嵌入項目相對應的圖片。以下列出一些工具,可讓你在網頁上產生靜態版本的嵌入內容。

  • Maps Static API:Google Maps Static API 服務會根據標準 HTTP 要求中包含的網址參數產生地圖,並以圖片格式傳回,供您在網頁上顯示。網址必須包含 Google 地圖 API 金鑰,且必須放置在頁面上的 <img> 標記中,做為 src 屬性。

    靜態地圖製作工具可協助您設定網址所需的參數,並即時提供圖片元素的程式碼。

    以下程式碼片段顯示圖片來源設為 Maps Static API 網址的圖片。這項資訊已納入連結標記,確保使用者點選圖片後可存取實際地圖。(注意:網址中不包含 API 金鑰屬性)

    <a href="https://www.google.com/maps/place/Albany,+NY/">
    <img src="https://maps.googleapis.com/maps/api/staticmap?center=Albany,+NY&zoom=13&scale=1&size=600x300&maptype=roadmap&format=png&visual_refresh=true" alt="Google Map of Albany, NY">
    </a>
    
  • Twitter 螢幕截圖:與地圖螢幕截圖類似,這個概念可讓你動態嵌入 Twitter 螢幕截圖,而非直播動態。Tweetpik 是其中一種可用來擷取推文螢幕截圖的工具。Tweetpik API 會接受推文的網址,並傳回含有推文內容的圖片。這個 API 也接受參數,可用於自訂圖片的背景、顏色、邊框和尺寸。

使用點擊即可載入功能改善外觀

「點擊載入」概念結合了延遲載入和立面。頁面一開始會載入外觀。使用者按下靜態預留位置並進行互動時,系統就會載入第三方嵌入項目。這個模式又稱為「匯入互動時匯入」模式,可透過下列步驟導入。

  1. 載入網頁時:網頁包含門面或靜態元素。
  2. 滑鼠懸停:中繼介面會預先連線至第三方嵌入供應商。
  3. 點選:系統會將外觀替換為第三方產品。

您可以將 Facades 與第三方嵌入內容搭配使用,例如影片播放器、即時通訊小工具、驗證服務和社群媒體小工具。單純附有播放按鈕的圖片內嵌 YouTube 影片就是我們經常看到的外牆內容。只有在您點選圖片時,系統才會載入實際影片。

您可以採用「import onInteracting」模式建立自訂的點擊載入立面,或使用以下適用於不同嵌入項目的開放原始碼立面介面。

  • YouTube 立面

    Lite-youtube-embed 是 YouTube 播放器的推薦外觀,看起來就像實際的播放器,但速度快上 224 倍。您可以下載指令碼和樣式表,然後在 HTML 或 JavaScript 中使用 <lite-youtube> 標記。您可以透過 params 屬性加入 YouTube 支援的自訂播放器參數。

    <lite-youtube videoid="ogfYd705cRs" playlabel="Play: Keynote (Google I/O '18)"></lite-youtube>
    

    以下是 lite-youtube-embed 和實際嵌入項目之間的比較。

    輕量版 YouTube 嵌入功能
    輕量版 YouTube 嵌入功能
    實際 YouTube 嵌入次數
    YouTube 嵌入功能

    YouTube 和 Vimeo 播放器的其他類似外觀包括 lite-youtubelite-vimeo-embedlite-vimeo

  • Chat 小工具立面

    回應聊天室載入器:載入類似聊天室 (而非嵌入) 的按鈕。可搭配多種即時通訊服務供應商平台使用,例如 Intercom、Help Scout、Messenger。類似的小工具比聊天小工具輕量許多,載入速度也更快。如果使用者將遊標懸停在按鈕上或點選按鈕,或是頁面閒置太久,可用的即時通訊小工具就會替換為實際的即時通訊小工具。貼文個案研究說明瞭他們如何實作 react-live-chat-loader 並改善成效。

    貼文標記即時通訊小工具

如果您發現某些第三方嵌入項目會導致載入效能不佳,而且使用上述任何技術都無法選擇,最簡單的方法就是完全移除該嵌入影片。如果您仍希望使用者存取嵌入的內容,可以提供 target="_blank" 連結,讓使用者能在另一個分頁中點選並查看該內容。

版面配置穩定性

雖然動態載入的嵌入內容可以改善網頁的載入效能,但有時可能會導致網頁內容突然移動。這就是所謂的版面配置位移。

由於視覺穩定性有助於提供流暢的使用者體驗,因此累計版面配置位移 (CLS) 會衡量變化頻率和乾擾程度。

如要避免版面配置位移,可以為稍後將動態載入的元素保留在載入網頁期間保留的空間。瀏覽器如果知道元素的寬度和高度,可判斷要保留的空間。您可以指定 iframe 的 widthheight 屬性,或是為第三方嵌入項目的靜態元素設定固定大小,確保這項條件。例如,YouTube 嵌入式 iframe 的寬度和高度應如下所示。

<iframe src="https://www.youtube.com/embed/aKydtOXW8mI" width="560" height="315">
</iframe>

YouTube、Google 地圖和 Facebook 等熱門嵌入項目會提供已指定大小屬性的內嵌程式碼。不過,有些供應商可能不會提供這項資訊。例如,這個程式碼片段未指出產生的嵌入內容尺寸。

<a class="twitter-timeline" href="https://twitter.com/ChannelNewsAsia?ref_src=twsrc%5Etfw" data-tweet-limit="1">Tweets by ChannelNewsAsia</a>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

系統轉譯這個網頁後,您可以使用開發人員工具檢查 iframe 插入的內容。如以下程式碼片段所示,插入的 iframe 高度為固定值,寬度則以百分比指定。

<iframe id="twitter-widget-0" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="true" class="twitter-timeline twitter-timeline-rendered" style="position: static; visibility: visible; display: inline-block; width: 100%; padding: 0px; border: none; max-width: 1000px; min-width: 180px; margin-top: 0px; margin-bottom: 0px; min-height: 200px; height: 6238.31px;" data-widget-id="profile:ChannelNewsAsia" title="Twitter Timeline">
</iframe>

您可以使用這項資訊設定所含元素的大小,確保容器不會在載入動態饋給時展開,且不會發生版面配置位移。您可以使用下列程式碼片段,修正先前嵌入內容的大小。

<style>
    .twitterfeed { display: table-cell;  vertical-align: top; width: 100vw; }
    .twitter-timeline {height: 400px !important; }
</style>
<div class=twitterfeed>
       <a class="twitter-timeline" href="https://twitter.com/ChannelNewsAsia?ref_src=twsrc%5Etfw" data-tweet-limit="1">Tweets by ChannelNewsAsia</a>
       <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div>

版面配置位移終止器

由於第三方嵌入內容經常會省略轉譯最終內容的尺寸 (寬度、高度),因此可能會導致網頁版面配置出現大幅位移。如果沒有使用開發人員工具在各種不同檢視點大小下手動檢查最終尺寸,這個問題可能很難解決。

我們現在推出了自動化工具 Layout Shift Terminator,可協助您減少來自 Twitter、Facebook 和其他供應商等熱門嵌入內容的版面配置位移。

版面配置位移終止器:

  • 在 iframe 中載入嵌入用戶端。
  • 將 iframe 調整為各種熱門的可視區域大小。
  • 針對每個熱門可視區域,擷取內嵌的尺寸,以便日後產生媒體查詢和容器查詢。
  • 使用媒體查詢 (和容器查詢) 調整嵌入標記周圍的最小高度包裝函式,直到嵌入初始化 (之後會移除最小高度樣式)。
  • 產生最佳化嵌入程式碼片段,您可以將其複製並貼到網頁中,以便在網頁中加入嵌入內容。

    車內減速端子

歡迎試用 Layout Shift Terminator,並在 GitHub 上提供任何意見回饋。這項工具目前為 Beta 版,我們會持續改良,讓工具日後更臻完善。

結論

第三方嵌入能為使用者帶來許多助益,但隨著網頁的嵌入數量和大小增加,效能可能受到影響。因此,請評估嵌入項目的位置、關聯性和潛在使用者需求,對嵌入項目進行評估、判斷及使用適當的載入策略。