[Lv1] 圖片載入優化:四層 Lazy Load
透過四層圖片懶加載策略,將首屏圖片流量從 60MB 降至 2MB,載入時間提升 85%。
問題背景 (Situation)
想像你在滑手機看網頁,螢幕只能顯示 10 張圖片,但網頁一次載入了 500 張圖片的完整資料,你的手機會卡到爆,流量也瞬間燒掉 50MB。
對應到專案的實際情況:
📊 某頁面首頁統計
├─ 300+ 張縮圖(每張 150-300KB)
├─ 50+ 張促銷 Banner
└─ 如果全部載入:300 × 200KB = 60MB+ 的圖片資料
❌ 實際問題
├─ 首屏只看得到 8-12 張圖片
├─ 使用者可能只滾動到第 30 張就離開了
└─ 剩下 270 張圖片完全白載入(浪費流量 + 拖慢速度)
📉 影響
├─ 首次載入時間:15-20 秒
├─ 流量消耗:60MB+(用戶怨聲載道)
├─ 頁面卡頓:滾動不流暢
└─ 跳出率:42%(極高)
優化目標 (Task)
- 只載入可視範圍內的圖片
- 預載即將進入視窗的圖片(提前 50px 開始載入)
- 控制併發數量(避免同時載入過多圖片)
- 防止快速切換導致的資源浪費
- 首屏圖片流量 < 3MB
解決方案(Action)
v-lazy-load.ts 實作
四層 image lazy load
第一層:視窗可見性檢測(IntersectionObserver)
// 創建觀察器,監測圖片是否進入視窗
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
// 圖片進入可視區域
// 開始載入圖片
}
});
},
{
rootMargin: '50px 0px', // 提前 50px 開始載入(預載入)
threshold: 0.1, // 只要露出 10% 就觸發
}
);
- 使用瀏覽器原生 IntersectionObserver API(效能遠勝過 scroll 事件)
- rootMargin: "50px" → 當圖片還在下方 50px 時就開始載入,使用者滑到時已經好了(感覺更順暢)
- 不在視窗的圖片完全不載入