# 前端性能优化实战指南
## 1. 资源加载优化
- **代码分割**:使用Webpack的SplitChunksPlugin进行第三方库分离
```javascript
// webpack.config.js
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors'
}
}
}
}
<link rel="preload" href="critical.css" as="style">
<link rel="prefetch" href="next-page.js" as="script">
<picture>
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="Fallback">
</picture>
2. 渲染性能优化
function resizeAll() {
for (let i = 0; i < items.length; i++) {
items[i].style.width = (items[i].offsetWidth * 2) + 'px';
}
}
function resizeAll() {
const widths = items.map(item => item.offsetWidth);
items.forEach((item, i) => {
item.style.width = (widths[i] * 2) + 'px';
});
}
.animated-element {
will-change: transform, opacity;
transition: transform 0.3s ease-out;
}
3. JavaScript优化
function debounce(fn, delay) {
let timer;
return function() {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, arguments), delay);
};
}
function throttle(fn, limit) {
let lastRun;
return function() {
if (!lastRun || Date.now() - lastRun >= limit) {
fn.apply(this, arguments);
lastRun = Date.now();
}
};
}
const worker = new Worker('worker.js');
worker.postMessage(data);
worker.onmessage = (e) => processResult(e.data);
self.onmessage = (e) => {
const result = heavyComputation(e.data);
self.postMessage(result);
};
4. 缓存策略
self.addEventListener('install', (e) => {
e.waitUntil(
caches.open('v1').then((cache) =>
cache.addAll(['/app.js', '/styles.css'])
)
);
});
self.addEventListener('fetch', (e) => {
e.respondWith(
caches.match(e.request).then((response) =>
response || fetch(e.request)
)
);
});
Cache-Control: public, max-age=31536000, immutable
ETag: "xyz123"
5. 监控与持续优化
const [entry] = performance.getEntriesByName('first-contentful-paint');
console.log('FCP:', entry.startTime);
import {getCLS, getFID, getLCP} from 'web-vitals';
getCLS(console.log);
getFID(console.log);
getLCP(console.log);
- 首屏关键资源控制在14KB以内
- 交互时间(TTI)控制在5秒内
- 持续监控核心Web指标:
- LCP < 2.5s
- FID < 100ms
- CLS < 0.1
最佳实践总结
- 关键渲染路径优化:内联关键CSS,异步加载非关键JS
- 资源优化:WebP图片,字体子集,SVG图标
- 代码优化:Tree-shaking,懒加载,代码分割
- 缓存策略:Service Worker + HTTP缓存组合使用
- 持续监控:建立性能预算,设置自动化报警
lighthouse <url> --view
webpack-bundle-analyzer