🚀前端性能优化实录:把 5 秒白屏降到 1.2 秒,只做 7 件事

真实项目优化实录:从 5 秒白屏到 1.2 秒加载完成,Vite 项目性能优化全攻略,附可直接复用的代码片段。


📊 优化成绩单

指标 优化前 优化后 收益
首屏加载 5.2 s 1.2 s ↓ 77 %
LCP(最大内容绘制) 4.1 s 1.0 s ↓ 76 %
JS 体积 1.8 MB 480 KB ↓ 73 %
图片总重 6.4 MB 1.9 MB ↓ 70 %

一、代码体积瘦身:Vite + 优化

1. 代码分割 + Tree-Shaking

javascript 复制代码
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  build: {
    rollupOptions: {
      output: {
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0];
          }
        },
      },
    },
  },
});
  • 代码分割 :Vite 默认支持代码分割,通过 manualChunks 可以进一步自定义代码分割逻辑。
  • Tree-Shaking:Vite 默认启用,移除未使用的代码。

2. 压缩代码

javascript 复制代码
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import TerserPlugin from 'terser-webpack-plugin';

export default defineConfig({
  plugins: [vue()],
  build: {
    rollupOptions: {
      output: {
        manualChunks(id) {
          if (id.includes('node_modules')) {
            return id.toString().split('node_modules/')[1].split('/')[0];
          }
        },
      },
    },
  },
  optimizeDeps: {
    esbuildOptions: {
      minify: true,
    },
  },
  plugins: [
    {
      name: 'terser',
      enforce: 'minimize',
      options: {
        terserOptions: {
          compress: {
            drop_console: true,
          },
        },
      },
    },
  ],
});
  • TerserPlugin :进一步压缩代码,移除 console.log 等调试信息。

二、资源优化:图片、字体、静态资源

1. 图片优化

  • WebP/AVIF:使用现代图片格式,体积更小,质量更高。
  • 懒加载:按需加载图片,减少首屏加载时间。
javascript 复制代码
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { VitePluginLazyload } from 'vite-plugin-lazyload';

export default defineConfig({
  plugins: [vue(), VitePluginLazyload()],
});
html 复制代码
<img data-src="image.webp" class="lazy" />
<script>
  new IntersectionObserver((entries) => {
    entries.forEach((entry) => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        img.classList.remove('lazy');
      }
    });
  }).observe(document.querySelectorAll('.lazy'));
</script>

2. 字体优化

  • 按需加载:只加载需要的字体样式。
  • 预加载 :使用 <link rel="preload"> 预加载关键字体。
html 复制代码
<link rel="preload" href="/fonts/Roboto.woff2" as="font" type="font/woff2" crossorigin />

三、网络优化:CDN、缓存

1. 使用 CDN

  • CDN:将静态资源部署到 CDN,减少服务器压力,加速加载。
javascript 复制代码
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  build: {
    assetsDir: 'static',
    assetsInlineLimit: 4096, // 小于 4KB 的资源内联
  },
});

2. 缓存策略

  • 缓存控制:设置 HTTP 缓存头,减少重复请求。
javascript 复制代码
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  server: {
    headers: {
      'Cache-Control': 'public, max-age=31536000',
    },
  },
});

四、首屏优化:骨架屏、预渲染

1. 骨架屏

  • 骨架屏:在内容加载完成前显示占位图,提升用户体验。
html 复制代码
<div class="skeleton">
  <div class="skeleton-header"></div>
  <div class="skeleton-content"></div>
</div>
css 复制代码
.skeleton {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.skeleton-header {
  width: 100%;
  height: 50px;
  background: linear-gradient(90deg, #f0f0f0, #e0e0e0, #f0f0f0);
  background-size: 200% 200%;
  animation: skeleton 1.5s infinite;
}
.skeleton-content {
  width: 100%;
  height: 200px;
  background: linear-gradient(90deg, #f0f0f0, #e0e0e0, #f0f0f0);
  background-size: 200% 200%;
  animation: skeleton 1.5s infinite;
}
@keyframes skeleton {
  0% {
    background-position: -200% 0;
  }
  100% {
    background-position: 200% 0;
  }
}

2. 预渲染

  • 预渲染:使用 Vite 插件进行预渲染,减少首屏加载时间。
javascript 复制代码
// vite.config.js
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vitePrerender from 'vite-plugin-prerender';

export default defineConfig({
  plugins: [vue(), vitePrerender()],
});

五、性能监控:Lighthouse、Web Vitals

1. Lighthouse

  • Lighthouse:使用 Lighthouse 定期检查性能,找出瓶颈。
bash 复制代码
npm install -g lighthouse
lighthouse https://your-site.com --view

2. Web Vitals

  • Web Vitals:监控关键性能指标,如 LCP、FID、CLS。
javascript 复制代码
import { getCLS, getFID, getLCP } from 'web-vitals';

getCLS(console.log);
getFID(console.log);
getLCP(console.log);

六、代码优化:减少重绘、重排

1. 避免强制同步布局(FLS)

  • FLS:避免在 JavaScript 中频繁读写布局属性。
javascript 复制代码
// 避免
const width = element.offsetWidth;
element.style.width = width + 10 + 'px';

// 推荐
element.style.width = element.offsetWidth + 10 + 'px';

2. 使用 CSS 动画

  • CSS 动画:使用 CSS 动画而不是 JavaScript 动画,减少重绘和重排。
css 复制代码
@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}
html 复制代码
<div class="fade-in"></div>

七、总结:7 步优化流程

  1. 代码分割 + Tree-Shaking:减少代码体积。
  2. 图片优化:使用现代格式、懒加载。
  3. 网络优化:使用 CDN、设置缓存。
  4. 首屏优化:骨架屏、预渲染。
  5. 性能监控:Lighthouse、Web Vitals。
  6. 代码优化:减少重绘、重排。
  7. 持续优化:定期检查、优化。

🏁 一句话总结

通过 Vite + 7 招优化,我们的项目从 5 秒白屏降到 1.2 秒加载完成,性能提升 77%。把这份优化清单贴在工位

相关推荐
星栈35 分钟前
视频即代码,Remotion 能做什么、不能做什么
前端·音视频开发
广州华水科技38 分钟前
单北斗GNSS位移监测系统的应用与技术解析
前端
用户47949283569151 小时前
从一句话或代码仓到可交互 HTML:开源 Agent 画图技能 Archify v3.2 实测与选型边界
前端·后端·面试
风骏时光牛马3 小时前
生成一个AI多模态标题,仅输出一条标题,无额外文字、问句、备选、配图、文案等任何附加内容,不需要其他的任务服务 只要标题。
前端
wangruofeng4 小时前
从 GIF 到 AVIF:网页图片格式演进与 2026 年选型指南
前端·架构
清晨Coding5 小时前
为什么用 React Developer Tools 查看组件树这么乱?
前端·react.js
johnjincaaaa5 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
鶴哥只手遮天5 小时前
《Electron 45.2.3 内核解剖》第 4 章 补丁体系:380 个补丁改了什么
前端·electron
FungLeo7 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构
总要学点什么8 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium