圖片
方案架構.png
如圖所示,圖片加載部分支持分辨率、格式自適應以及懶加載、穩定性布局等特性,其中涉及到圖片處理部分基于火山引擎veImageX 服務實現,如圖片轉碼、縮放、壓縮等。SDK 側生成當前環境下最佳的圖片格式和分辨率,從服務獲取相應的圖片 URL,借助云端處理能力在運行時動態生成所需的圖片。
數據監控部分可分為加載耗時監控、圖片詳情監控、畫質評估、大圖監控、云控配置幾部分,監控 SDK 收集相關數據,根據云端下發的配置上報數據,火山引擎veImageX 服務對數據做清洗后可在控制臺側查看數據大盤。
常見的圖片格式有 PNG、JPEG、GIF、WebP、AVIF、HEIC 等,其中 WebP、AVIF、HEIC 等高壓縮率圖片格式可顯著減小圖片體積。但由于不同瀏覽器對高壓縮率格式的支持情況不同,因此在應用時需要考慮圖片加載的環境。三種高壓縮率格式在 Web 側的兼容性如下:
圖片
圖片
圖片
在 APP 端,對于不支持的圖片格式可采用 SDK 軟解的方式進行解碼、渲染,Native 側的性能可保證圖片解碼的耗時和流量的節省都能有不錯的收益。在 Web 側,由于瀏覽器性能限制,veImageX 內部性能測試表明,SDK 軟解在圖片整體耗時方面的收益并不明顯,尤其是多圖場景下,因此在 Web 側更適合走格式自適應的方案,即根據瀏覽器的支持性加載相對最優的圖片格式。
常見的做法是采用標簽以實現格式的自適應,標簽有相對不錯的兼容性,支持包含零或多個元素和一個 元素來為不同的瀏覽器環境提供圖片版本,瀏覽器會自上而下選擇可以被渲染的圖片,若沒有匹配的,則選擇 元素當中的圖片作為兜底。加載 SDK 最初也采用了該方案,如下:
<picture> <source srcset="image1.webp" type="image/webp" /> <img src="image1.jpg" decoding="async" loading="lazy"/></picture>
但由于瀏覽器版本眾多,在實際應用中,可能會出現很多預期以外的情況,比如:
為了保證圖片加載成功率,因此在實際應用中無法直接使用標簽,加載 SDK 目前采用格式探測 +相結合的方式來解決該問題。同時,由于 HEIC 支持率太低,格式自適應目前只做了 WebP 和 AVIF 的自適應,同等質量下,WebP 相比 JPEG 可減少 30% 的圖片體積,AVIF 則可在 WebP 的基礎上再減少 20%;
分辨率自適應指的是客戶端根據實際渲染的寬高獲取相應分辨率的圖片,從而減小圖片體積。常見的做法是我們可以借助 HTML 中原生的 srcset 屬性來定義圖像集,以及每個圖像應用的場景。由以下三部分組成:
window.devicePixelRatio
可查詢顯示器像素密度sizes 則定義了一組媒體條件,比如:屏幕寬度。并且指明當媒體條件為真時最佳的圖片尺寸。每個條件由以下三部分組成:
max-width:480px
,表示可視窗口的寬度不超過480像素時可以將標簽和 srcset 屬性相結合,實現格式和分辨率的自適應,如下:
<picture> <source srcset="image1.webp 200w, image2.webp 600w" sizes="100vw" type="image/webp" /> <img srcset="image1.jpg 200w, image2.jpg 600w" sizes="100vw" decoding="async" loading="lazy" /></picture>
然而在實際中又會面臨一些問題,如:
在實際應用中,某些情況下可以提前知道圖片渲染大小或者圖片所在區域的大小,結合方案內置的幾種布局方式以及設備像素密度等信息,加載 SDK 內部可以分析并選擇出當前模塊渲染的最佳分辨率。
Web 側通常基于 CLS(Cumulative Layout Shift,累積布局偏移)指標用于衡量頁面布局的視覺穩定性。當可見元素的位置在頁面生命周期內發生了變化時,就會產生布局偏移。
導致布局偏移的因素有很多(如:動態插入元素、iframe加載),無尺寸的圖片是影響 CLS 指標的重要因素之一。例如下面兩個頁面中,右側指定了圖片寬高的頁面要比左側沒有指定圖片寬高的頁面穩定性更好。
圖片
數據監控.png
數據監控的整體鏈路為:
圖片
圖片
方案致力于為 Web 場景提供極致的圖片加載體驗,同時在穩定性和場景覆蓋上也在不斷提升。
上面提到在某些瀏覽器下會存在部分 WebP、AVIF 圖片加載失敗的場景,在監控到此類場景后加載 SDK 基于格式探測的方式最低成本的解決了此類問題,同時保證了性能。
例如:在 iOS 14.3 & 14.4 版本下的 Safari 瀏覽器加載部分的 WebP 失敗,而標簽并不會對 WebP 的支持性做檢測,其對于傳入的 WebP 格式是全盤接收的,且 SDK 也無法對所有傳入的圖片做檢測,因此只能通過構造特定圖片,在業務圖片加載前對其進行檢測從而規避該問題,如下:
const checkWebP = () => { const pro: Promise<boolean> = new Promise<boolean>((resolve) => { if(typeof window === 'undefined') resolve(false); if (window['__support_webp__'] !== undefined) { resolve(!!window['__support_webp__']); } else { const img = new Image(); img.onload = () => { window['__support_webp__'] = true; resolve(true); }; img.onerror = () => { window['__support_webp__'] = false; resolve(false); }; img.src = 'error image'; } }); return pro;};
目前方案支持了 React、Vue2、Vue3 以及小程序,為了保證體驗的一致性、降低維護成本,加載 SDK 做了分層的設計,將核心的 Core 層抽離出來給到各個框架使用,并對各項能力做了插件化。
場景覆蓋.png
隨著方案的迭代,我們也在嘗試覆蓋更多的業務場景,比如:加密圖渲染、Hybrid HEIC 渲染等,火山引擎veImageX 希望給客戶帶來全面、穩定、流暢的圖片體驗,同時給業務帶來極致的成本收益。
我們將如上能力封裝成簡單的webSDK,向行業輸出,并可以免費獲取和使用此SDK,更高級的能力也可以配合veImageX來使用;
本文鏈接:http://www.www897cc.com/showinfo-26-12676-0.htmlveImageX 演進之路:Web 圖片加載提速50%
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 圖形編輯器開發:屬性顯示與格式轉換