一、资源加载优化:高速公路的ETC通道
核心思想:让关键资源像ETC通道一样快速通过
<!-- 预加载关键CSS -->
<link rel="preload" href="styles/main.css" as="style" onload="this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles/main.css"></noscript>
<!-- 异步加载非关键JS -->
<script>
function loadScript(src) {
var script = document.createElement('script');
script.src = src;
script.async = true;
document.body.appendChild(script);
}
// 页面加载完成后再加载分析脚本
window.addEventListener('load', function() {
loadScript('https://example.com/analytics.js');
});
</script>
代码注释:
rel="preload"告诉浏览器优先下载这个资源as="style"指明资源类型以便浏览器优化onload事件确保CSS加载后立即应用async属性使脚本异步加载不阻塞渲染
二、渲染路径优化:建筑工地的施工蓝图
核心思想:先搭好架子再精装修
// 使用Vue实现骨架屏
<template>
<div class="product-detail">
<!-- 真实内容 -->
<div v-if="!loading" class="content">...</div>
<!-- 骨架屏 -->
<div v-else class="skeleton">
<div class="skeleton-header"></div>
<div class="skeleton-image"></div>
<div class="skeleton-line"></div>
<div class="skeleton-line"></div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
loading: true
}
},
mounted() {
// 模拟数据加载
fetchData().then(() => {
this.loading = false;
});
}
}
</script>
<style>
.skeleton {
/* 骨架屏动画效果 */
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
to { background-position: -200% 0; }
}
</style>
代码注释:
v-if/v-else切换真实内容和骨架屏- 骨架屏使用CSS动画模拟加载效果
- 数据加载完成后隐藏骨架屏
三、代码优化实践:行李箱的合理收纳
核心思想:像整理行李箱一样组织代码
// webpack.config.js 配置代码分割
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\/]node_modules[\/]/,
name: 'vendors',
chunks: 'all',
},
},
},
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css',
}),
],
};
// 路由懒加载示例 (React)
const Home = React.lazy(() => import('./views/Home'));
const About = React.lazy(() => import('./views/About'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
);
}
代码注释:
splitChunks将node_modules代码单独打包contenthash实现长效缓存React.lazy+Suspense实现路由懒加载
四、网络层优化:物流配送的智能调度
核心思想:建立高效的资源配送网络
# Nginx配置示例
server {
listen 443 http2; # 启用HTTP/2
# 开启gzip压缩
gzip on;
gzip_types text/css application/javascript;
# 静态资源缓存
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
}
# HTTP/2服务端推送
location = /index.html {
http2_push /static/css/main.css;
http2_push /static/js/main.js;
}
}
代码注释:
http2协议提升并发性能gzip压缩减少传输体积expires设置长期缓存http2_push主动推送关键资源
完整项目优化方案
- 构建阶段:
# 安装优化插件
npm install --save-dev purgecss-webpack-plugin compression-webpack-plugin
- React优化配置:
// craco.config.js (用于覆盖create-react-app配置)
module.exports = {
webpack: {
plugins: {
add: [
new CompressionPlugin(), // gzip压缩
new PurgeCSSPlugin({ // 清除无用CSS
paths: glob.sync(`${paths.appSrc}/**/*`, { nodir: true }),
}),
],
},
},
};
- 图片优化方案:
<picture>
<!-- 优先加载WebP格式 -->
<source srcset="image.webp" type="image/webp">
<!-- 兼容旧浏览器的回退方案 -->
<source srcset="image.jpg" type="image/jpeg">
<img src="image.jpg" loading="lazy" alt="示例图片">
</picture>
通过这四个维度的系统优化,可将典型SPA应用的首屏加载时间从4-5秒降至2秒以内,大幅提升用户体验。