1. 網絡優化
減少HTTP請求
- 合并資源:通過合并CSS和JavaScript文件減少請求次數。
- 資源內聯:對于小的CSS和JavaScript,直接內聯到HTML中。
使用HTTP/2
- HTTP/2支持多路復用,減少請求阻塞,提高加載速度。
開啟GZIP壓縮
服務器端配置,壓縮文本資源,減小傳輸體積。
緩存策略
利用HTTP緩存頭,如Cache-Control,設置合適的緩存策略。
2. 資源加載優化
懶加載
只在資源即將進入視口時才加載,適用于圖片和視頻等。
<img src="placeholder.jpg" data-src="real-image.jpg" class="lazy" />
<script>
document.addEventListener('DOMContentLoaded', function() {
let lazyImages = document.querySelectorAll('.lazy');
lazyImages.forEach(img => {
img.src = img.dataset.src;
});
});
</script>
預加載與預讀取
使用<link rel="preload">
提前加載關鍵資源。
使用<link rel="prefetch">
預讀取非關鍵資源。
3. 渲染優化
Critical CSS
將首屏渲染所需的CSS內聯在HTML頭部,避免阻塞渲染。
減少CSS和JavaScript的阻塞
- 使用
<link rel="stylesheet" media="print" onload="this.media='all'">
延遲非關鍵CSS加載。 - 使用
async
或defer
屬性異步加載JavaScript。
<script async src="script.js"></script>
避免強制同步布局
- 使用requestAnimationFrame或CSS動畫代替復雜的JavaScript動畫,減少重排重繪。
圖片優化
- 選擇合適的圖片格式(如WebP),并使用正確的尺寸和分辨率。
4. Service Worker與離線存儲
- 使用Service Worker實現離線緩存和資源更新。
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker
.register('/sw.js')
.then(registration => console.log('SW registered:', registration))
.catch(error => console.error('SW registration failed:', error));
});
}
5. 性能監控與分析
- 使用Lighthouse、WebPageTest或Chrome DevTools等工具進行性能測試和分析。
6. 代碼拆分與懶加載
動態導入
利用動態導入(import()表達式)按需加載代碼塊,減少初始加載時間。
button.onclick = async () => {
const module = await import('./lazyModule.js');
module.default();
};
路由級別代碼拆分
在SPA應用中,利用框架提供的路由級別代碼拆分功能,如Vue Router的懶加載。
// Vue Router 示例
const Foo = () => import('./Foo.vue');
const routes = [
{ path: '/foo', component: Foo },
];
7. 圖像優化
響應式圖片
利用<picture>
元素或srcset屬性,根據設備像素比或視口大小提供不同分辨率的圖片。
<picture>
<source srcset="img/low-res.jpg" media="(max-width: 600px)">
<source srcset="img/high-res.jpg" media="(min-width: 600px)">
<img src="img/fallback.jpg" alt="Example">
</picture>
8. Web Workers
將耗時的計算任務移到Web Worker中,避免阻塞主線程,保持UI響應。
// main.js
const worker = new Worker('worker.js');
worker.postMessage([1024, 512]);
// worker.js
self.onmessage = function(e) {
const result = e.data[0] * e.data[1];
self.postMessage(result);
};
9. 避免內存泄漏
定期清理不再使用的定時器、事件監聽器和大型數據結構,防止內存泄漏。
window.addEventListener('resize', handleResize);
// 清理
window.removeEventListener('resize', handleResize);
// 對于setTimeout或setInterval
let timerId = setInterval(() => { /*...*/ }, 1000);
clearInterval(timerId);
10. Web Vitals監控
關注LCP(最大內容繪制)、FID(首次輸入延遲)和CLS(累計布局偏移)等Web Vitals指標,它們是衡量用戶體驗的關鍵指標。
// 使用Web Vitals庫進行監控
import { getCLS, getFID, getLCP } from 'web-vitals';
getCLS(console.log);
getFID(console.log);
getLCP(console.log);