当前位置: 首页 > news >正文

Vite 构建速度优化:我被构建速度坑了3次后总结的实战技巧

Vite 构建速度优化:我被构建速度坑了3次后总结的实战技巧

上个月我接手了一个 Vue3 项目,之前用的是 Webpack,每次修改代码都要等个 10 几秒才能热更新,切到 Vite 后确实快了不少,秒级热更新香得很。但好景不长,项目越来越大,我发现构建开始变慢了,打包一次要 3-5 分钟,开发体验反而变差了。我就开始怀疑人生了:说好的 Vite 很快呢?

后来我查了大量资料、踩了无数坑,终于把构建速度从 3 分钟降到了 30 秒。今天把这些实战经验分享出来,都是我踩过的坑,保证你看完就能用上。

第一个坑:依赖预构建没配置,白白等待

问题描述

项目首次启动时,Vite 会把node_modules里的 CommonJS 模块转换成 ESM,这个过程叫依赖预构建。第一次启动特别慢,修改package.json依赖后还要重新预构建,烦死了。

原因分析

Vite 默认只预构建直接 import 的包,而且每次依赖变化都要重新检测和预构建。如果你用了间接依赖(比如某个 UI 库内部用了 lodash),Vite 不会自动预构建它。

解决方案

vite.config.ts中配置optimizeDeps.includeexclude

// vite.config.tsimport{defineConfig}from'vite'importvuefrom'@vitejs/plugin-vue'exportdefaultdefineConfig({plugins:[vue()],optimizeDeps:{// 预构建这些常用依赖,减少启动时间include:['vue','vue-router','pinia','axios','lodash','element-plus','@vueuse/core'],// 这些不需要预构建exclude:['lodash-es']}})

注意事项

  • 只预构建大型库和常用库,不要把所有东西都加进去
  • lodash建议用lodash-es替代,它本身就是 ESM
  • 依赖变更后会自动重新预构建,这个无法避免

第二个坑:代码没分割,所有东西打包成一个文件

问题描述

项目大了之后,所有代码都打包成一个巨大的 JS 文件,首屏加载要下载 2-3MB,网页打开要等好几秒。用户投诉不断,转化率都下降了。

原因分析

Vite 默认的 build rollupOptions.output 没有什么分割策略,所有代码按依赖顺序打成一个 chunk。你不配置,它就默认梭哈。

解决方案

配置手动代码分割,按路由和第三方库分开:

// vite.config.tsexportdefaultdefineConfig({build:{rollupOptions:{output:{manualChunks:{// Vue 全家桶单独一个包'vue-vendor':['vue','vue-router','pinia'],// UI 组件库单独一个包'ui-vendor':['element-plus','@vueuse/core'],// 其他第三方库单独一个包'utils-vendor':['axios','lodash','dayjs'],// 业务代码按页面对应(需要配置插件)}}},// 分割策略chunkSizeWarningLimit:1000,// 超过 1MB 才警告}})

对于路由级别的代码分割,配合 Vue Router 的动态导入:

// router/index.tsimport{createRouter,createWebHistory}from'vue-router'constroutes=[{path:'/',name:'Home',component:()=>import('@/views/Home.vue')// 懒加载},{path:'/about',name:'About',component:()=>import('@/views/About.vue')},{path:'/dashboard',name:'Dashboard',component:()=>import('@/views/Dashboard.vue')}]exportdefaultcreateRouter({history:createWebHistory(),routes})

效果对比

优化前优化后
app.js: 2.5MBapp.js: 200KB
首屏加载: 5秒首屏加载: 1秒
无进度条有进度条

第三个坑:图片和静态资源没优化

问题描述

项目中有很多大图片(有的甚至 5MB+),构建时直接复制到 dist 目录,用户访问时加载特别慢。尤其是移动端,图片加载慢导致整体体验很差。

原因分析

Vite 默认不会压缩图片,也不会自动处理大图片。你放进去什么样,构建出来就什么样。

解决方案

安装vite-plugin-imagemin插件:

npminstallvite-plugin-imagemin-D

配置图片压缩:

// vite.config.tsimportviteImageminfrom'vite-plugin-imagemin'exportdefaultdefineConfig({plugins:[viteImagemin({gifsicle:{optimizationLevel:7,interlaced:false},optipng:{optimizationLevel:7},mozjpeg:{quality:20},pngquant:{quality:[0.8,0.9],speed:4},svgo:{plugins:[{name:'removeViewBox'},{name:'removeEmptyAttrs',active:false}]}})]})

对于大图片,还可以使用 WebP 格式:

// vite.config.tsexportdefaultdefineConfig({assetsInclude:['**/*.webp']})

在 HTML 中使用 WebP:

<picture><sourcesrcset="@/assets/hero.webp"type="image/webp"><imgsrc="@/assets/hero.jpg"alt="Hero"></picture>

资源内联阈值

对于小图片,可以配置内联,减少 HTTP 请求:

exportdefaultdefineConfig({build:{assetsInlineLimit:4096// 4KB 以下的内联}})

第四个坑:生产构建没优化,文件又大又慢

问题描述

开发时 Vite 很快,但生产构建打包出来的文件很大,加载很慢。用户访问首屏要等好几秒,体验很差。

原因分析

生产构建需要 minify、tree-shaking、source map 等优化,但 Vite 默认配置可能不够优。而且 sourcemap 在生产环境完全没必要,浪费时间。

解决方案

配置生产构建优化:

// vite.config.tsexportdefaultdefineConfig({build:{// 关闭 sourcemap,生产环境不需要sourcemap:false,// minify 选项:esbuild 最快(默认),terser 更小但更慢minify:'esbuild',// 分块策略chunkSizeWarningLimit:500,rollupOptions:{output:{// 手动分割代码块manualChunks:{'vue-vendor':['vue','vue-router','pinia'],'ui-vendor':['element-plus'],'utils-vendor':['axios','lodash']},// 文件名哈希化,防止缓存chunkFileNames:'assets/js/[name]-[hash].js',entryFileNames:'assets/js/[name]-[hash].js',assetFileNames:'assets/[ext]/[name]-[hash].[ext]'}},// 启用 CSS 代码分割cssCodeSplit:true,// 压缩级别(esbuild)target:'es2015'}})

对于更大的优化,可以考虑使用vite-plugin-compression开启 Gzip 压缩:

npminstallvite-plugin-compression-D
// vite.config.tsimportviteCompressionfrom'vite-plugin-compression'exportdefaultdefineConfig({plugins:[viteCompression({algorithm:'gzip',ext:'.gz',threshold:10240// 10KB 以上才压缩})]})

服务器端 Nginx 配置开启 Gzip:

gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_min_length 1000;

效果对比

优化项优化前优化后
JS 文件2.5MB600KB
CSS 文件200KB50KB
图片3MB800KB
首屏加载5秒1.5秒
构建时间3分钟30秒

写在最后

Vite 确实快,但想要保持这种快,需要我们主动优化。总结一下我的优化套路:

  1. 依赖预构建-optimizeDeps.include配置常用库,首次启动飞起
  2. 代码分割- 路由懒加载 + manualChunks,首屏加载不再卡
  3. 图片优化- 压缩图片 + WebP 格式 + 内联小图片
  4. 生产优化- 关闭 sourcemap + 开启 Gzip + 文件名哈希

这套组合拳打下来,我的项目构建时间从 3 分钟降到了 30 秒,开发体验和用户体验都提升明显。如果你也有构建速度问题,建议一个个坑填,不要一次性改太多,改完记得测一下构建时间。

还有什么 Vite 相关的坑,欢迎评论区聊聊,大家一起避坑!

http://www.jsqmd.com/news/442510/

相关文章:

  • 2026年抛丸机生产厂靠谱推荐,助你轻松选到好设备 - 工业推荐榜
  • 从科幻到现实:一文读懂具身智能人形机器人
  • 具身智能避障决策深度解析
  • 具身智能的“大脑”:世界模型深度解析与实战指南
  • 拒绝踩坑!2026年成都钢边箱厂家优选攻略:如何选择靠谱的四川钢边箱生产厂家 - 朴素的承诺
  • BC Asia电话查询:专业顾问提供的通用联系建议 - 品牌推荐
  • 设备树和裁剪内核
  • 一文带你深入了解赋值兼容原则
  • 2026年成都钢边箱厂家推荐:三大实力品牌深度解析 - 朴素的承诺
  • python+flask的医院康复预约系统 vue
  • 具身智能新纪元:VLA模型如何让机器“看懂世界,听懂人话,动手做事”?
  • 门匠火锅电话查询:如何联系与官方信息核实指南 - 品牌推荐
  • 先琦通讯电话查询:企业采购与数码产品服务指南 - 品牌推荐
  • 软著申请宝典:从代码到资产,守护企业创新价值
  • 2026产品模具定制不踩坑!电子烟模具、镜头模具、精密塑胶模具有哪些?深圳鸿泰合兴塑胶模具厂家精度高、交期准、品质稳 - 栗子测评
  • 手把手教你设计16位乘法器|零门槛入门,跟随课程免费指导
  • 2026就业寒冬下,高职大数据专业凭什么逆势上扬?秘密在这里
  • 2026工业传动带采购不踩坑!假齿同步带、开口同步带、钢丝同步带、输送带、片基带厂家哪家好?麦优迪传动带耐磨抗拉更稳定 - 栗子测评
  • 数据安全无忧:内外网文件交换系统产品推荐与实践案例 - 飞驰云联
  • 大厂、品牌方都在抢的电商人才,到底需要什么能力?
  • Vue3开发项目启动白屏 ERR_CACHE_READ_FAILURE 200 (OK)
  • 2026年快速上手:在阿里云服务器上部署OpenClaw(Clawdbot)的详细教程
  • 先琦通讯电话查询:获取产品信息与定制服务建议 - 品牌推荐
  • 从零开始开发 CNBlog MCP 工具(更新版)
  • 吐血推荐!自考论文神器 —— 千笔·专业论文写作工具
  • 嘉年华旅行社电话查询:官方联系途径与通用建议 - 品牌推荐
  • python+flask的法院庭审辅助系统的研究与发现-vue
  • 探寻优质TWSNS电磁阀生产厂家,广州邢海机电有限公司给出卓越方案,ROSS流量阀,TWSNS电磁阀直销厂家哪家好 - 品牌推荐师
  • 温暖人心的大学创新创业成果突出吗 - 工业设备
  • 采购传动带别盲目!2026PU聚氨酯圆带、平皮带、工业、梯形齿、橡胶、聚氨酯同步带厂家哪家好?麦优迪同步带运行平稳不打滑 - 栗子测评