Vue 项目首屏加载从 5s 到 1.5s:4 步落地优化方案,附完整代码 + 数据对比

前段时间我在做一个活动时,打包加载后发现打开页面要等半天,经过几天的优化,最终将首屏加载时间从5秒压到 1.5 秒。

这篇文章会把整个优化过程拆解成「文件分析→代码解决→验证」三步,每个方案都附完整代码前后数据对比,新手也能直接复用。

1. 打包体积分析:看「哪些文件在拖后腿」

操作步骤(Vue CLI/Vite 通用):

  • Vue CLI 项目:执行 npm run build -- --report;
  • Vite 项目:执行 npm run build -- --report(需先在 vite.config.js 中开启 build.report: true);
  • 打包完成后,dist 目录会生成 report.html,打开后能看到「打包体积占比图」。

我的项目诊断结果:

问题类型

具体表现

占比

路由未懒加载

所有路由组件打包进 app.js,导致初始 JS 体积过大

35%

UI 库完整引入

Element Plus 完整引入(600KB),但仅用 5 个组件

30%

图片未优化

banner 图未压缩(2.3MB),小图标未转 Base64

25%

公共代码未拆分

Vue、lodash 等第三方库重复打包

10%

明确了这 4 个核心问题,接下来的优化就有了方向 —— 不用贪多,解决这 4 个问题,首屏加载就能提速 60% 以上。

2. 4种方法可以优化:每个方案都附代码 + 效果

方案 1:路由懒加载

原理:

默认情况下,Vue 会把所有路由组件打包进「app.js」,导致初始加载时要下载全部组件;懒加载则是「用户访问哪个路由,才下载哪个组件的 JS」,能直接减少初始 JS 体积。

代码对比:

// 优化前:同步加载(所有组件打包进app.js)import Home from './views/Home.vue'import About from './views/About.vue'const routes = [{ path: '/', component: Home },{ path: '/about', component: About }]// 优化后:懒加载(按需下载)const routes = [// 动态import语法,访问时才加载{ path: '/', component: () => import('./views/Home.vue') },{ path: '/about', component: () => import('./views/About.vue') }]

效果对比:

指标

优化前

优化后

提升

初始 JS 体积

1.8MB

1.08MB

40%

首屏加载时间

5.0s

3.2s

36%

避坑提示:

  • 不要给「首屏路由」(如 Home)做懒加载,否则会增加首屏加载的请求数;
方案 2:UI 库按需引入(减少 200KB,自动生效)

原理:

完整引入 UI 库(如 Element Plus)会包含大量未使用的组件和样式(比如你只用了按钮,却加载了日历、表格等组件),按需引入能只打包「实际使用的组件」。

以 Element Plus 为例(Vite 项目):

  1. 安装按需引入插件:
npm install unplugin-vue-components unplugin-auto-import -D
  1. 在 vite.config.js 中配置:
import { defineConfig } from 'vite'import Vue from '@vitejs/plugin-vue'// 1. 引入按需引入插件import AutoImport from 'unplugin-auto-import/vite'import Components from 'unplugin-vue-components/vite'import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'export default defineConfig({plugins: [Vue(),// 2. 配置插件AutoImport({resolvers: [ElementPlusResolver()], // 自动引入Element Plus的API(如ElMessage)}),Components({resolvers: [ElementPlusResolver()], // 自动引入Element Plus的组件(如ElButton)}),],})
  1. 在组件中直接使用,无需手动 import:
<template><!-- 无需引入ElButton,插件会自动处理 --><el-button type="primary" @click="showMessage">提交</el-button></template><script setup>// 无需引入ElMessage,插件会自动引入const showMessage = () => {ElMessage.success('提交成功')}</script>

效果对比:

指标

优化前

优化后

提升

Element Plus 体积

600KB

400KB

33%

首屏加载时间

3.2s

2.8s

12.5%

避坑提示:

  • 如果使用 Vue CLI,配置方式略有不同(需在 vue.config.js 中配置);
  • 部分 UI 库的「样式」需要单独按需引入(如 Ant Design Vue),需查看官方文档。
方案 3:图片优化(首屏资源减少 50%,用户感知最明显)

图片是首屏加载的「重灾区」—— 我的项目中,图片占了首屏资源体积的 50%,优化后直接减少了 1.6MB。

推荐 3 个必做的图片优化手段,覆盖 90% 的场景:

1. 小图转 Base64(减少 HTTP 请求)

  • 原理:小于 10KB 的图片(如图标、小按钮)转为 Base64 后,会嵌入 HTML/JS 中,无需额外发请求;
  • 实现(Vite 自动处理):
// vite.config.js
export default defineConfig({build: {assetsInlineLimit: 10240, // 10KB以下图片自动转Base64(默认是4KB)},
})

2. 大图用 WebP 格式(体积减少 50%)

  • 原理:WebP 格式比 JPG/PNG 体积小 30%~50%,且支持透明和动图;
  • 实现:
  1. 用工具将图片转为 WebP(推荐 TinyPNG、Squoosh);
  2. 在 Vue 中使用,同时兼容不支持 WebP 的浏览器:
<template><!-- 优先加载WebP,不支持则加载JPG --><picture><source srcset="/banner.webp" type="image/webp"><img src="/banner.jpg" alt="首页banner" class="banner"></picture></template>

3. 首屏外图片懒加载(延迟加载,减少首屏压力)

  • 原理:首屏外的图片(如下方的商品列表),等用户滚动到可视区域再加载;
  • 实现(用 vue-lazyload):
  1. 安装插件:
npm install vue-lazyload
  1. 在 main.js 中配置:
import { createApp } from 'vue'import App from './App.vue'import VueLazyload from 'vue-lazyload'const app = createApp(App)// 配置懒加载:加载中显示占位图app.use(VueLazyload, {loading: '/loading.gif', // 加载中占位图(建议小于1KB)error: '/error.png' // 加载失败占位图})app.mount('#app')
  1. 在组件中使用:
<template><!-- 用v-lazy替代src --><img v-lazy="item.imgUrl" alt="商品图片" class="product-img" v-for="item in productList" :key="item.id"></template>

效果对比:

指标

优化前

优化后

提升

首屏图片体积

2.3MB

1.1MB

52%

首屏加载时间

2.8s

2.0s

28.6%

避坑提示:

  • 首屏图片不要懒加载,否则会导致首屏空白;
  • WebP 格式在 IE 浏览器不支持,需用 <picture> 标签做兼容。
方案 4:打包优化(最后一步,再挤 10% 体积)

前面 3 个方案解决了核心问题,最后通过打包优化,进一步压缩体积。

1. 拆分公共代码(避免重复打包)

  • 原理:Vue、lodash 等第三方库,会被多个组件引用,拆分后只打包一次,后续组件复用;
  • 实现(Vite 配置):
// vite.config.jsexport default defineConfig({build: {rollupOptions: {output: {// 手动拆分公共代码manualChunks: {vue: ['vue'], // Vue相关代码拆成一个chunklodash: ['lodash'], // lodash拆成一个chunkelement: ['element-plus'] // Element Plus拆成一个chunk}}}}})

2. JS/CSS 压缩(默认开启,无需额外配置)

  • Vite 默认使用 Terser 压缩 JS,CSSNano 压缩 CSS,无需手动配置;
  • 若需加强压缩(如去掉 console.log),可在 vite.config.js 中配置:
export default defineConfig({build: {terserOptions: {compress: {drop_console: true, // 打包时去掉所有console.logdrop_debugger: true // 去掉debugger}}}})

效果对比:

指标

优化前

优化后

提升

总打包体积

2.5MB

1.0MB

60%

首屏加载时间

2.0s

1.5s

25%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95205.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95205.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95205.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习第十六部分——JUnit框架

目录 一.概述 二.作用 三.版本 四.优势 五.局限性 六.发展方向 七.核心组件 1 测试用例 2.断言&#xff08;Assertions&#xff09; 3.测试生命周期 4.测试运行器 八.简单示例 九.JUnit 4 与 JUnit 5 的区别 十.idea项目实战 1.在idea中创建Java项目&#xff0c…

[吾爱原创] 千千每日计划

[吾爱原创] 千千每日计划 链接&#xff1a;https://pan.xunlei.com/s/VOYuE8p-KIV-NJr2_0d1Ak9YA1?pwdbqez# 介绍&#xff1a;千千系列的最后一款软件,一款每日计划的一款软件&#xff0c;并且支持时间段修改和打卡和导入导出等功能。 功能&#xff1a; 1.设置每天的计划 2…

docker命令(二)

目录 docker命令 1.inspect命令&#xff08;查看镜像信息&#xff09; 2.tag命令&#xff08;为镜像起别名&#xff09; 3.--help命令&#xff08;查看命令的使用帮组&#xff09; docker 命令 --help docker --help 4.run命令 1.格式 2.启动tomcat镜像 3. docker 不能被外部访…

Dockerfile实现java容器构建及项目重启(公网和内网)

公网情况0.Dockerfile关键字关键字作用一句话出现位置FROM指定基础镜像&#xff08;任何 Dockerfile 必须且首行&#xff09;全局RUN在镜像构建阶段执行命令&#xff08;常用来安装软件&#xff09;构建期COPY把宿主机文件/目录复制进镜像构建期ADD类似 COPY&#xff0c;但额外…

SpringCloud与Dubbo深度对比:架构、性能与生态全解析

引言在微服务架构盛行的今天&#xff0c;服务治理框架的选择成为企业技术栈决策的关键环节。Spring Cloud和Dubbo作为Java生态中最具代表性的两大微服务框架&#xff0c;各自拥有独特的优势和适用场景。本文将从架构设计、服务治理、性能表现、生态系统等多个维度进行深度对比&…

简历书写---自我评价怎么写

前言 今天一对一辅导了很多同学做简历&#xff0c;看到很多同学简历上都有一栏&#xff1a;自我评价 那我们就要思考一下&#xff0c;我们搞技术的&#xff0c;一份技术简历&#xff0c;自我评价上怎么写&#xff0c;才能算一个加分点呢&#xff1f; 观点分享 首先&#xff0c;…

嵌入式Linux学习 - 数据库开发

目录 一. 在终端的使用 1. 下载 2. 操作 3. 相关函数 1.增 2. 删 3. 改 4. 查 5. 补充函数 二. 在软件的使用 1. 下载 2. 操作 三. 在编程的使用 1. 下载 2. 相关函数 1. 打开 2. 读写执行sql语句 3. 关闭 一. 在终端的使用 1. 下载 sudo apt-get install …

产品运营必备的职场通用能力有哪些?如何一步步提升?

在流量红利消退的存量竞争时代&#xff0c;产品运营岗位正经历价值重构。单纯的活动策划与用户维护已无法满足发展需求&#xff0c;数据驱动的精细化运营成为行业分水岭。面对这场变革&#xff0c;复合能力建设与前瞻工具掌握是运营人突破天花板的密钥。推荐考取CDA数据分析师&…

ESPTimer vs GPTimer:ESP32 定时器系统深度解析

第十五章和第十六章分别学习了​​ESPTimer​​ 和 ​​GPTimer​​ &#xff0c;那这两种定时器有什么区别&#xff0c;如何使用呢&#xff0c;下面探讨下。1. 两种定时器对比介绍1.1 两种定时器设计在 ESP32 开发中&#xff0c;​​ESPTimer​​ 和 ​​GPTimer​​ 是两种完…

【70页PPT】WMS助力企业数字化转型(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92808811/91806268 资料解读&#xff1a;【70页PPT】WMS助力企业数字化转型 详细资料请看本解读文章的最后内容。仓储管理在企业运营中占据关键地位&a…

[光学原理与应用-337]:ZEMAX - 自带的用于学习的样例设计

ZEMAX&#xff08;OpticStudio&#xff09;内置了大量样例设计文件&#xff0c;这些文件覆盖了从基础光学原理到复杂系统设计的全场景&#xff0c;是学习光学设计、掌握软件操作、理解像差理论的绝佳资源。以下是ZEMAX自带样例设计的详细分类、使用方法及学习价值分析&#xff…

下一波红利:用 #AI编程 闯入小游戏赛道,#看广告变现 模式正在崛起!

文章标题(可选,均包含核心关键词) 【主推标题】 #AI编程制作小游戏 的终极 #变现 指南:如何通过 #看广告变现 轻松赚钱 【疑问式标题】 #AI制作小游戏 真的能赚钱吗?揭秘 #AI编程赚钱 的四大核心路径与广告变现策略 【趋势型标题】 下一波红利:用 #AI编程 闯入小游戏赛道…

【git】add后不想commit怎么实现pull

本地有改动已 git add 到暂存区(stage)&#xff0c;但是还没 commit&#xff0c;同时远端有 28 个新提交需要拉取。 直接 git pull 会冲突或被拒绝&#xff0c;因为你本地有 staged 修改。 处理步骤有几种方案&#xff0c;我给你推荐最稳妥的几种&#xff1a;✅ 方法 1&#xf…

Unable to establish SSL connection. curl静态编译

博主有个老RHEL系统&#xff0c;内核2.6.18&#xff1b;ssl不管用了&#xff0c;最简单的wget也不行&#xff0c;下面编个静态编译的新版 curl 用用&#xff08;不影响yum源&#xff0c;不然的话系统自带的旧版 OpenSSL 受影响得得不偿失&#xff09;&#xff0c;来最优化解决下…

Redis-08 SpringBoot集成Redis常见问题

SpringBoot集成Redis的教程网上很多&#xff0c;总体来说就是三个步骤&#xff1a;添加依赖、修改配置文件、自定义Redis配置类&#xff08;自定义序列化器&#xff09;&#xff0c;具体步骤可自行搜索&#xff0c;本文主要解惑集成中的常见疑问。 1&#xff0c;选择什么依赖&…

数据结构:选择排序 (Selection Sort)

目录 从学生排队开始 算法的初始状态和核心操作 代码的逐步完善 第一阶段&#xff1a;定义函数框架和外层循环 第二阶段&#xff1a;实现“寻找最小元素”的逻辑&#xff08;内层循环&#xff09; 第三阶段&#xff1a;完成“交换”操作 复杂度与特性分析 时间复杂度 (…

Django Admin 管理工具

一、简介Django Admin 是 Django 框架最受欢迎和强大的特性之一。它是一个自动生成的管理后台&#xff0c;允许开发者无需或仅需编写少量代码&#xff0c;就能对网站的数据模型&#xff08;数据库中的表&#xff09;进行直观的增、删、改、查&#xff08;CRUD&#xff09;操作。…

园区智慧水电管理系统:让能源管理从“成本黑洞”变“利润引擎”

园区智慧水电管理系统&#xff0c;是一套专为产业园区、科技园、企业总部等大型空间设计的集智能计量、远程管控、自动计费、能耗分析于一体的数字化能源解决方案。它用技术手段解决水电管理中的“抄表难、收费乱、浪费多、数据缺”四大顽疾&#xff0c;真正实现降本、提效、控…

DeepSeek应用技巧-通过MCP打造数据分析助手

本文章将通过MCP服务来打造一个数据分析助手&#xff0c;可以直接读取本地的excel或csv的文件&#xff0c;然后生成可视化的报告并保存在本地&#xff0c;十分有应用和实践的价值&#xff0c;话不多说&#xff0c;我们开始手把手搭建。一、知识应用&#xff08;1&#xff09;Fu…

React Hooks 完全指南:从基础到高级的实战技巧

概述 React Hooks 是 React 16.8 引入的新特性&#xff0c;允许在函数组件中使用状态和其他 React 特性。根据数据的使用场景和更新机制&#xff0c;可以将 Hooks 分为三大类&#xff1a; 1. 保存只读数据 useMemo 用途&#xff1a; 缓存计算结果&#xff0c;避免重复计算 …