服务器端配置,压缩文本资源,减小传输体积。
利用HTTP缓存头,如Cache-Control,设置合适的缓存策略。
只在资源即将进入视口时才加载,适用于图片和视频等。
<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">
预读取非关键资源。
将首屏渲染所需的CSS内联在HTML头部,避免阻塞渲染。
<link rel="stylesheet" media="print" onload="this.media='all'">
延迟非关键CSS加载。async
或defer
属性异步加载JavaScript。<script async src="script.js"></script>
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));
});
}
利用动态导入(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 },
];
利用<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>
将耗时的计算任务移到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);
};
定期清理不再使用的定时器、事件监听器和大型数据结构,防止内存泄漏。
window.addEventListener('resize', handleResize);
// 清理
window.removeEventListener('resize', handleResize);
// 对于setTimeout或setInterval
let timerId = setInterval(() => { /*...*/ }, 1000);
clearInterval(timerId);
关注LCP(最大内容绘制)、FID(首次输入延迟)和CLS(累计布局偏移)等Web Vitals指标,它们是衡量用户体验的关键指标。
// 使用Web Vitals库进行监控
import { getCLS, getFID, getLCP } from 'web-vitals';
getCLS(console.log);
getFID(console.log);
getLCP(console.log);