前端懶加載(Lazy Loading)實戰指南

🚀 前端懶加載(Lazy Loading)實戰指南

懶加載是現代 Web 性能優化的“常規操作”。它的目標簡單直接:讓用戶只加載“當下真正需要的資源”。從靜態資源、組件、模塊到數據,每一層都可以使用懶加載技術,構建更快、更輕、更流暢的 Web 應用。


🧠 一、懶加載的本質是什么?

懶加載(Lazy Loading)= 按需加載 + 延遲執行

通俗地講,它有以下幾個目的:

問題懶加載如何解決
首屏加載慢不加載頁面底部圖片、非首屏組件
JS 包太大將 JS 拆分為多個小塊,按需加載
用戶未訪問的內容占用資源延遲加載直到用戶需要

本質上,它是時間與空間的優化交換,用“晚一點加載”換取“現在更快”。


🔥 二、六大常見懶加載場景詳解

? 場景 1:圖片懶加載(Lazy Image Loading)

📌 背景

圖文混排頁面中,圖片往往占據大量流量資源,但用戶可能根本不會滑到底部。

? 最佳方案:結合原生和 JS 手動方案

方法 1:原生 HTML 屬性(推薦)

<img src="low-quality.jpg" loading="lazy" data-src="real-image.jpg"alt="文章配圖" />
  • ? 優點:無需 JS,瀏覽器原生支持
  • ??缺點:舊版 Safari / IE 不支持

方法 2:JavaScript + IntersectionObserver

const imgs = document.querySelectorAll('img[data-src]');
const observer = new IntersectionObserver((entries, observer) => {entries.forEach(entry => {if (entry.isIntersecting) {const img = entry.target;img.src = img.dataset.src;observer.unobserve(img);}});
});
imgs.forEach(img => observer.observe(img));

💡 小技巧:可結合 srcset 提供不同分辨率圖像資源。

? 注意事項:
  • 圖片應設置固定高度,防止懶加載后頁面跳動(可用占位符)。
  • 可考慮加入淡入過渡動畫提升體驗。

? 場景 2:組件懶加載(Component Lazy Load)

📌 背景

單頁應用中,許多組件(如彈窗、圖表、用戶詳情)在初始頁面并不會被立即使用。

📦 Vue 3 組件懶加載實現
import { defineAsyncComponent } from 'vue';const AsyncUserCard = defineAsyncComponent(() =>import('@/components/UserCard.vue')
);
<template><Suspense><template #default><AsyncUserCard /></template><template #fallback><div>加載中...</div></template></Suspense>
</template><script setup>
import AsyncUserCard from './AsyncUserCard.js';
</script>
🧠 思維方式:
  • 首屏核心內容同步加載。
  • 次要內容、低頻交互使用懶加載(如 <Modal />, <Tabs />)。

? 場景 3:路由懶加載(Route-based Lazy Load)

📌 背景

SPA 中所有頁面都打包進一個文件時,初始包極大,路由懶加載是首選優化手段。

🌿 Vue Router 懶加載
const routes = [{path: '/profile',component: () => import('@/views/Profile.vue')}
];

🧠 建議:

  • 首屏路由組件不應懶加載。
  • 子路由按需加載,特別是儀表盤類頁面。

? 場景 4:第三方庫懶加載(Third-Party Resource Lazy Load)

📌 背景

不常用但體積大的庫(地圖、圖表、編輯器)應在用戶真正需要時才加載。

示例:動態加載地圖 SDK
// 懶加載高德地圖 SDK(支持多次調用防重復加載)+ 使用方式示例
let amapLoaded = false, amapPromise = null;
export function loadAMapSDK() {return amapLoaded ? Promise.resolve(window.AMap) : (amapPromise ??= new Promise((resolve, reject) => {const script = document.createElement('script'); // 創建 <script> 標簽script.src = 'https://webapi.amap.com/maps?v=1.4.15&key=你的Key'; // 設置 SDK 地址(替換你的 Key)script.onload = () => { amapLoaded = true; resolve(window.AMap); }; // 成功加載后 resolve AMapscript.onerror = () => reject(new Error('AMap SDK 加載失敗')); // 加載失敗時 rejectdocument.body.appendChild(script); // 將 script 添加到頁面中觸發加載}));
}// ? 使用方式(在需要加載地圖的組件或函數中調用):
loadAMapSDK().then(AMap => {const map = new AMap.Map('mapContainer', { zoom: 10, center: [116.397428, 39.90923] }); // 創建地圖實例
}).catch(err => {console.error('地圖加載失敗:', err); // 錯誤處理
});
適用庫:
  • 高德/百度地圖
  • echarts / chart.js
  • Monaco Editor(代碼編輯器)
  • Quill / CKEditor(富文本)

? 場景 5:虛擬滾動(Virtual Scrolling)

📌 背景

一次性渲染幾千條 DOM 會嚴重卡頓,虛擬滾動只渲染可視區域。

Vue 示例(使用 vue-virtual-scroller)
<RecycleScroller:items="items":item-size="60"key-field="id"
><template #default="{ item }"><div class="row">{{ item.name }}</div></template>
</RecycleScroller>
推薦庫:
  • Vue:vue-virtual-scroller

? 場景 6:模塊懶加載(Dynamic Module Import)

📌 背景

某些邏輯、庫、工具僅在特定操作下觸發,例如導出 Excel、打印頁面等。

示例:點擊導出按鈕再導入模塊
button.addEventListener('click', async () => {const { exportToExcel } = await import('./excel-utils.js');exportToExcel(data);
});
打包工具支持:
  • Webpack / Vite 都支持 import() 實現代碼分割(Code Splitting)

🔍 三、不同懶加載方案對比

場景核心技術優勢注意事項
圖片loading="lazy" / JS簡單高效,節省流量添加占位圖,避免閃爍跳動
組件異步組件 / lazy降低首屏 JS 體積異步加載需提供 fallback UI
路由動態 import大型 SPA 性能優化利器不建議懶加載首屏頁面
第三方資源動態添加 <script>避免加載無用資源注意資源重復加載與緩存控制
虛擬滾動可視區渲染支持大數據量流暢渲染容器尺寸需固定,高度計算精度
動態模塊import() 動態導入極致按需,節省體積模塊函數需異步封裝

🛠? 四、最佳實踐 & 常見坑點

? 最佳實踐匯總

類別實踐建議
圖片懶加載優先使用 loading="lazy",退級使用 IntersectionObserver,配合占位圖防閃動
組件懶加載使用 defineAsyncComponent 配合 <Suspense> 顯示 loading/error UI
路由懶加載首屏同步加載,次要頁面用懶加載
模塊懶加載import() 包裝成 Promise,結合緩存避免重復請求
第三方資源createScript 懶加載,務必防止重復加載,可結合全局標記
虛擬滾動容器設置固定高度或使用 auto-resize 組件

?? 常見坑點

  • 忘記處理加載失敗:必須監聽加載錯誤并提供提示
  • 首屏內容懶加載:會造成白屏、閃動,不推薦
  • 使用懶加載卻不預設高度:會導致布局抖動
  • 路由懶加載組件打包失敗:注意動態導入路徑使用變量會導致無法分包
  • 動態模塊未封裝 Promise:可能導致并發問題或無法 await

📦 五、Vue 3 組件懶加載 Demo 示例

📁 文件結構:

src/
├── components/
│   └── HeavyComponent.vue
├── views/
│   └── HomeView.vue

? HeavyComponent.vue

<template><div class="heavy">我是一個很重的組件,懶加載中...</div>
</template><script setup>
console.log('HeavyComponent 被加載了!');
</script><style scoped>
.heavy {padding: 20px;background-color: #f0f0f0;
}
</style>

? HomeView.vue

<template><button @click="show = true">點擊加載重組件</button><Suspense v-if="show"><template #default><HeavyComponent /></template><template #fallback><div>組件加載中...</div></template></Suspense>
</template><script setup>
import { ref, defineAsyncComponent } from 'vue';const show = ref(false);
const HeavyComponent = defineAsyncComponent(() =>import('@/components/HeavyComponent.vue')
);
</script>

📌 六、總結

懶加載是現代 Web 性能優化的重要利器,但也需結合實際場景“有策略地使用”:

  • 🔺 不要過度懶加載:首屏關鍵內容不應延遲。
  • 🔄 結合用戶行為:滾動、點擊、路由切換等時機才加載。
  • 🚧 一定要處理加載失敗/超時場景
  • 🔧 使用 <Suspense> 顯示加載狀態,提高用戶體驗

? 記住這條鐵律:**用戶優先,體驗至上,性能其次!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79826.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79826.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 Ubuntu 系統中,查看已安裝程序的方法

在 Ubuntu 系統中&#xff0c;查看已安裝程序的方法取決于軟件的安裝方式&#xff08;如通過 apt、snap、flatpak 或手動安裝&#xff09;。以下是幾種常見方法&#xff1a; 通過 apt 包管理器安裝的軟件 適用于通過 apt 或 dpkg 安裝的 .deb 包。 列出所有已安裝的軟件包&…

性能優化實踐:性能監控體系

性能優化實踐&#xff1a;性能監控體系 在Flutter應用開發中&#xff0c;建立一個完善的性能監控體系對于保證應用質量和用戶體驗至關重要。本文將從實戰角度深入講解如何搭建Flutter應用的性能監控體系&#xff0c;包括監控指標的設計、數據采集實現、分析平臺搭建等內容。 …

kotlin 02flow-sharedFlow 完整教程

一 sharedFlow是什么 SharedFlow 是 Kotlin 協程中 Flow 的一種 熱流&#xff08;Hot Flow&#xff09;&#xff0c;用于在多個訂閱者之間 共享事件或數據流。它適合處理 一次性事件&#xff08;如導航、彈窗、Toast、刷新通知等&#xff09;&#xff0c;而不是持續狀態。 ? …

模擬開發授權平臺

這次只是實現應用的curd和公私鑰的校驗以及第三方的通知dmeo項目&#xff0c;大家可以拓開視野來編寫 進入主題 項目鏈接&#xff1a;桌角的眼鏡/develop_auth_platform 直接下拉并運行就行 回調應用代碼在test包中 回調應用測試代碼 package mainimport ("encoding/…

STM32 USART串口

一、通信接口 二、串口通信 串口是一種應用十分廣泛的通訊接口&#xff0c;串口成本低、容易使用、通信線路簡單&#xff0c;可實現兩個設備的互相通信單片機的串口可以使單片機與單片機、單片機與電腦、單片機與各式各樣的模塊互相通信&#xff0c;極大地擴展了單片機的應用…

uniapp開發06-視頻組件video的使用注意事項

uniapp開發-視頻組件video的使用注意事項&#xff01;實際項目開發中&#xff0c;經常會遇到視頻播放的業務需求。下面簡單講解一下&#xff0c;uniapp官方提供的視頻播放組件video的常見參數和實際效果。 1&#xff1a;先看代碼&#xff1a; <!--視頻組件的使用展示-->…

【爬蟲】微博熱搜機

第一個下面一點&#xff1a; js代碼&#xff1a; const n require("crypto-js");let s n.SHA1(n.enc.Utf8.parse("tSdGtmwh49BcR1irt18mxG41dGsBuGKS")) , a n.enc.Hex.parse(s.toString(n.enc.Hex).substr(0, 32));function h(t) {let e (i t Stri…

軟考 系統架構設計師系列知識點之雜項集萃(51)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;50&#xff09; 第80題 設三個煤場A1、A2、A3分別能供應煤7、12、11萬噸&#xff0c;三個工廠B1、B2、B3分別需要10、10、10萬噸&#xff0c;從各煤場到各工廠運煤的單價&#xff08;百元/噸&…

npm,yarn,pnpm,cnpm,nvm,npx包管理器常用命令

前端比較主流的包管理器主要有三個npm&#xff0c;yarn&#xff0c;pnpm 多層級依賴&#xff0c;通常發生在依賴之間存在復雜的版本要求時 包 A 依賴于包 B1.0.0 包 B 依賴于包 C2.0.0 另一個包 D 也依賴于 C3.0.0 一、NPM (Node Package Manager) https://www.npmjs.cn/…

科普簡潔版:同態加密——密碼學的未來瑰寶

文章目錄 一、同態加密的基本概念1.1 什么是同態加密1.2 同態加密的數學本質1.3 同態加密的類型 二、主要同態加密方案詳解2.1 ElGamal加密2.2 Paillier加密2.3 Gentry的完全同態加密方案2.4 BGV方案2.5 BFV方案2.6 CKKS方案 三、同態加密的關鍵技術3.1 噪聲管理技術3.2 多項式…

力扣第448場周賽

賽時成績如下: 這應該是我力扣周賽的最好成績了(雖然還是三題) 1. 兩個數字的最大乘積 給定一個正整數 n。 返回 任意兩位數字 相乘所得的 最大 乘積。 注意&#xff1a;如果某個數字在 n 中出現多次&#xff0c;你可以多次使用該數字。 示例 1&#xff1a; 輸入&#xff1…

(一)Modular Monolith Architecture(項目結構/.net項目初始化/垂直切片架構)

文章目錄 項目地址一、項目結構1.1 Modules1. Events 模塊2. Users 模塊3. Ticketing 模塊4. Attendance 模塊1.2 數據庫模塊1.3 模塊架構選擇1. 全是Clean Architecture2. 分別使用不同的架構二、初始化項目2.1 本地創建項目結構1. 創建空的solution2. 添加基礎配置3. 創建git…

Java常用組件之Redis經典面試題(一)

大家好&#xff0c;今天為大家帶來Java項目中&#xff0c;幾乎必不可少的組件之一-Redis的一些常見面試題&#xff0c;幫忙近期需要面試的朋友們來一個理論基礎突擊&#xff01; 一、數據類型 1.Redis的常用數據類型有哪些 ? 難易程度&#xff1a;☆☆☆ 出現頻率&#xff1a;…

2025.5.4總結

今天去光谷步行街逛了一下&#xff0c;感覺熟悉又陌生&#xff0c;說熟悉是因為初二的時候來過武漢光谷&#xff0c;盡管過去了8年時間&#xff0c;但絲毫不影響標志性建筑的存在&#xff0c;也陌生是商場的建筑風格真實氣派&#xff0c;感覺進入了一座城堡&#xff0c;在里面都…

神經網絡在專家系統中的應用:從符號邏輯到連接主義的融合創新

自人工智能作為一個學科面世以來&#xff0c;關于它的研究途徑就存在兩種不同的觀點。一種觀點主張對人腦的結構及機理開展研究&#xff0c;并通過大規模集成簡單信息處理單元來模擬人腦對信息的處理&#xff0c;神經網絡是這一觀點的代表。關于這方面的研究一般被稱為連接機制…

Doo全自動手機殼定制系統

Doo全自動手機殼定制系統 項目概述 Doo全自動手機殼定制系統是一個完整的手機殼定制解決方案&#xff0c;支持多端應用&#xff0c;包括服務端、客戶端、管理后臺等多個組件。系統采用現代化的技術棧&#xff0c;提供完整的手機殼定制、訂單管理、用戶管理等功能。 目錄結構…

PageOffice在線打開word文件,并實現切換文件

本示例關鍵代碼的編寫位置&#xff0c;請參考“PageOffice 開發者中心-快速起步–開始 - 快速上手”里您所使用的開發語言框架的最簡集成代碼 注意 本文中展示的代碼均為關鍵代碼&#xff0c;復制粘貼到您的項目中&#xff0c;按照實際的情況&#xff0c;例如文檔路徑&#xff…

Webug4.0靶場通關筆記12- 第17關 文件上傳之前端攔截(3種方法)

目錄 一、文件上傳前端攔截原理 二、第17關 文件上傳(前端攔截) 1.打開靶場 2.構造php腳本 3.源碼分析 &#xff08;1&#xff09;js源碼 &#xff08;2&#xff09;服務器源碼 &#xff08;3&#xff09;總結 4.滲透實戰 &#xff08;1&#xff09;禁用js法 &#…

高性能 WEB 服務器 Nginx:多虛擬主機實現!

Nginx 配置多虛擬主機實現 多虛擬主機是指在一臺 Nginx 服務器上配置多個網站 在 Nginx 中&#xff0c;多虛擬主機有三種實現方式&#xff1a; 基于IP地址實現多虛擬主機 基于端口號實現多虛擬主機 基于域名實現多虛擬主機 1 基于域名實現多虛擬主機 在 Nginx 中配置多個…

網星安全AWS攻防方案,重磅發布!

AWS介紹 AWS&#xff08;Amazon Web Services&#xff09; 是 Amazon 提供的云計算平臺&#xff0c;提供了廣泛的云服務&#xff0c;包括計算、存儲、數據庫、網絡、安全、人工智能、大數據處理等功能&#xff0c;幫助企業和開發者構建、部署和管理應用程序。AWS 是全球最大的…