iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
JavaScript

30天的 JavaScript 設計模式之旅系列 第 25

[Day 25] 渲染模式初探與效能指標介紹

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20241009/20168201BZS53lMQT1.png

接下來幾篇會介紹渲染模式 Rendering Pattern,渲染模式應該是系列文裡我最頭痛的內容...,若有任何敘述錯誤或不清楚的歡迎提出討論!

渲染模式的重要性

網頁應用依據呈現的主題、目的或類型,可以是靜態也可是動態的。靜態網頁沒有狀態,不會觸發事件,就像單純閱讀書籍或報紙一樣,使用者只要單純閱讀網站即可,網頁類型如:部落格、新聞頁;而動態網頁通常會包含使用者互動事件,使用者可透過按鈕、篩選器、搜尋框來和網頁互動,高度互動網頁如:線上編輯器網站。
而根據不同類型的應用,開發者應該選用適合該網頁的渲染模式,適合的渲染模式可以以較低的成本實現優秀的載入效能,並且能提高使用者體驗(user experience, UX)與開發者體驗(developer experience, DX),而錯誤、不適合的渲染模式可能會為充滿創意的應用帶來負面影響。開發者在選擇渲染模式時,可思考以下問題來選用適合的渲染模式:

  • 希望如何、在何處渲染內容?
  • 內容應該在網路伺服器、建構(build)伺服器或邊緣網路上渲染,還是直接在客戶端上渲染?
  • 內容應該全部渲染、部分渲染還是漸進式的渲染?

補充:網路邊緣與邊緣運算

  • 邊緣網路(edge Networking)/網路邊緣(network edge)
    - 指接近使用者裝置或數據源頭處的計算資源,可以處理和計算數據,例如使用者的 IoT 攝影機內的處理器、路由器、ISP 或本地邊緣伺服器都可視為網路邊緣。重點在於網路邊緣會在地理位置上靠近裝置,和源伺服器或雲伺服器不同,源伺服器和雲伺服器可能遠離與之通信的設備
    - 簡單示意裝置間的遠近關係:
    使用者裝置 -- 網路邊緣 --------------------------- 雲伺服器或源伺服器
  • 邊緣運算(edge computing)
    - 概念:將數據處理、儲存和分析功能轉移到使用者設備或數據源附近的位置,讓運算盡可能靠近資料源和使用者。例如在使用者的手機、電腦、IoT 裝置上做運算,而不是集中在雲端去做
    - 優點:減少數據通過網絡傳輸的距離和時間,進而降低延遲、提升效率並減少網路頻寬壓力

合適的渲染模式可帶來良好的使用者體驗與開發者體驗,接下來來看看我們可以用哪些要素來衡量使用者體驗與開發者體驗。

良好使用者體驗

良好的使用者體驗可透過 Core Web Vitals(CWV)與其他效能指標(performance metrics)來衡量並優化應用程式,介紹如下:

Time to First Byte, TTFB (第一個位元組的時間)

TTFB 指的是 client 發出請求後,接收到回應的第一個位元組所花費的時間。下圖是網路請求階段的示意圖,其中 startTimeresponseStart 中間的時間就是 TTFB 所計算的時間。

https://ithelp.ithome.com.tw/upload/images/20241009/20168201RDx4N2f5W0.jpg
圖 1 TTFB 示意圖(資料來源:https://web.dev/articles/ttfb)

TTFB 是以下請求階段花費時間的總和:

  • 重定向時間(Redirect time)
    • 當一個請求被重定向到另一個 URL 時所花費的時間。例如,當一個網頁從 http:// 自動跳轉到 https://,或從一個域名重定向到另一個域名時
  • Service worker 啟動時間(如果有的話)
    • 如果應用了 Service Worker,這個時間是指從 Service Worker 啟動到它開始處理請求所需的時間
  • DNS 查詢
    • 當瀏覽器需要將域名(如:www.example.com)轉換為 IP 地址時,進行的查詢過程所花費的時間
  • 連線和 TLS 協商
    • 包括建立到伺服器的網絡連接(可能是 TCP 連接)和執行 TLS(傳輸層安全協議,用於保護數據傳輸的安全)協商的時間。TLS 協商可確保數據加密,是 HTTPS 安全通訊的重要部分
  • 請求,直到回應的第一個位元組到達為止
    • 主要步驟包括:
      • 發送請求:客戶端向伺服器發送一個 HTTP 請求
      • 伺服器處理:伺服器接收並處理這個請求,進行操作以準備回應
      • 生成回應:伺服器完成回應的準備
      • 發送回應的第一個位元組

如何降低 TTFB 來提升使用者體驗?減少連線設定時間和後端的延遲可降低 TTFB。

另外,上述是傳統的 TTFB 定義,關於 TTFB 其他定義的討論可見這篇,簡單來說不同的瀏覽器和工具對 TTFB 的測量方式可能不同,需了解你使用的工具衡量的是哪種 TTFB 以及如何受到平台的影響。

First Contentful Paint, FCP (首次內容繪製)

FCP 衡量從使用者首次導航到頁面,到頁面內容的任何部分呈現在螢幕上所需的時間。所謂頁面「內容」包含文字、圖像、<svg> 元素或非白色 <canvas> 元素。

以下方這個載入畫面的流程來說,第一個畫面是空白畫面,到第二個畫面則出現了搜尋框,因此從導航到畫面到第二個畫面出現搜尋框的時間就是 FCP 衡量的時間。
image
圖 2 FCP 示意圖(資料來源:https://web.dev/articles/fcp)

Time to Interactive, TTI (可互動時間)

TTI 是用於測量頁面從開始載入到完全能可靠回應用戶輸入的時間。

要補充的是,TTI 已被證明對於異常的網路請求和長任務過於敏感,導致此指標的測量變異性較高,因此已在 Lighthouse 10 中被移除。更好的替代性指標如:Largest Contentful Paint (LCP)、Total Blocking Time (TBT) 和 Interaction to Next Paint (INP)。

Largest Contentful Paint, LCP (最大內容繪製)

LCP 是渲染頁面可視區域內最大內容所需的時間,也就是網頁最大內容被使用者看到的時間。會被 LCP 考慮的 DOM 元素有:

  • <img> 元素(對於動態內容,例如 GIF 或動畫 PNG,會使用第一幀呈現的時間)
  • <svg> 元素內的 <image> 元素
  • <video> 元素
  • 以使用 CSS 的 url() 函式載入背景圖片的元素
  • 包含文本節點或其他 inline-level 文本元素子元素的塊級元素(block-level element)

Cumulative Layout Shift, CLS (累積佈局偏移)

CLS 衡量網頁整個生命週期中,每個非預期佈局偏移所產生的最大佈局偏移分數,佈局偏移(layout shift)指的是當可見元素在從一個渲染畫面到下一個渲染畫面的過程中,位置發生變化的情況。例如當我們一開始進入網頁時,某些 DOM 元素還沒出現,而是過一陣子才動態性的被載入與渲染,並推開網頁現有元素的排版,改變網頁的佈局,讓使用者難以預測網頁的排版狀況,甚至會有點錯按鈕、點錯連結的狀況發生。
以下面這張圖來看,這個文字區塊就產生了佈局偏移。
image
圖 3 CLS 示意圖(資料來源:https://web.dev/articles/cls)

First Input Delay, FID (首次輸入延遲)

FID 衡量使用者第一次與頁面互動(例如:點擊連結或按鈕)到事件處理程式可以執行的時間。會有輸入延遲通常是因為瀏覽器的 main thread 太過繁忙,因此它還無法立即回應使用者。例如瀏覽器正忙於解析和執行應用程式的大型 JavaScript 檔案,因此他無法立即執行事件處理程式,延遲了網頁元素可被執行互動的時間。

另外補充,FID 原本是用來測量網站在使用者首次嘗試與頁面互動時的互動性指標,但從 2024 年 9 月 9 日起,FID 不再被視為 Core Web Vital,取而代之的是 Interaction to Next Paint (INP)指標。

Interaction to Next Paint, INP (下次繪製互動時間)

INP 會觀察使用者在瀏覽頁面時所有點擊、觸碰和鍵盤互動的延遲,以評估頁面對這些互動的反應速度。最終的 INP 值代表使用者訪問網頁期間的最長互動時間,並且會忽略異常值以提供更準確的評估。

只有以下的互動會被列入 INP 的計算:

  • 使用滑鼠點擊
  • 觸碰觸控螢幕
  • 按下鍵盤上的任一個鍵

上述指標中,LCP、INP 和 CLS 被定義為 Core Web Vitals,屬於衡量網頁效能的關鍵指標,而其他指標也和效能有關,被視為使用者中心的效能指標(user-centric performance metrics),都是開發網頁時用來衡量使用者體驗的要素,優化這些指標可以提高使用者體驗,也能優化 SEO (search engine optimization, SEO),因此選用渲染模式時也要考量這些衡量指標的分數。

良好開發者體驗

良好開發者體驗包含以下考量因素:

快速建構(build)時間

專案應能快速 build 以達成快速迭代和部署。

低伺服器成本

網站應限制和優化伺服器執行時間以降低執行成本。

動態內容

頁面應能高效能的載入動態內容。

輕鬆回滾(rollbacks)

應用可快速恢復到以前的 build 版本並部署。

可靠的正常執行時間

使用者應該一直都能透過可運行的伺服器存取網站。

可擴展的基礎設施

專案擴大或縮小都不會遇到效能問題。

小結

渲染模式已經發展許久,也演變許多細微不同的模式,但並沒有一個十全十美的完美渲染模式,每個模式都是為了解決特定案例而設計的,對一個案例有利的模式,可能會對另一個有害,甚至同個網站中不同類型的頁面,可能會需要不同的渲染模式。

Reference


上一篇
[Day 24] PRPL 模式
下一篇
[Day 26] Client Side Rendering(CSR)
系列文
30天的 JavaScript 設計模式之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言