乐于分享
好东西不私藏

Vite Build 构建流程:从源码到产物的全链路

Vite Build 构建流程:从源码到产物的全链路

Build 构建流程:从源码到产物的全链路

📖 Vite 深度系列 · 第 05 篇 | ⏱️ 阅读约 9 分钟

为什么同一个项目 Vite 构建比 Webpack 快 5-10 倍?Rolldown 带来了什么?代码分割策略怎么选?这篇把构建流程讲透。


一句话总结

Vite 8 构建流程 = Rolldown 统一引擎 + Oxc 编译压缩 + Lightning CSS 处理,Rust 工具链端到端打通,构建速度比 Rollup 快 10-30 倍,且行为与开发环境完全一致。


1. Build Pipeline 全景

vite build
  │
  ├─ 1. 配置解析
  │     ├─ 加载 vite.config.ts
  │     ├─ 合并 CLI 参数
  │     ├─ 解析 Environment 配置
  │     └─ 调用 configResolved 钩子
  │
  ├─ 2. 插件初始化
  │     ├─ 按 enforce 排序 (pre → normal → post)
  │     ├─ 调用 buildStart 钩子
  │     └─ 准备 Rolldown 插件适配
  │
  ├─ 3. 依赖解析
  │     ├─ 从入口(s)出发
  │     ├─ resolveId → load → transform
  │     ├─ 构建完整的依赖图
  │     └─ CSS/静态资源/HTML 分别处理
  │
  ├─ 4. 打包 (Rolldown)
  │     ├─ 代码分割 (chunk splitting)
  │     ├─ Tree-shaking
  │     ├─ CSS 提取与压缩 (Lightning CSS)
  │     └─ 静态资源处理 (hash + 内联)
  │
  ├─ 5. 压缩优化 (Oxc)
  │     ├─ JS 压缩 (Oxc minifier)
  │     ├─ CSS 压缩 (Lightning CSS)
  │     └─ HTML 压缩
  │
  ├─ 6. 产物输出
  │     ├─ 写入 dist/ 目录
  │     ├─ 生成 sourcemap
  │     ├─ 生成 manifest.json
  │     └─ 调用 writeBundle / closeBundle 钩子
  │
  └─ 7. 构建完成 ✓
        输出文件大小和耗时统计

2. Rolldown 构建详解

2.1 核心流程

resolve → load → transform → chunk → generate
阶段
说明
插件钩子
resolve
解析模块路径
resolveId
load
加载模块内容
load
transform
转换模块代码
transform
chunk
代码分割、Tree-shaking
generate
输出最终产物
renderChunk, generateBundle

2.2 与 Rollup 的兼容性

Rolldown 设计目标:API 兼容 + 行为兼容

维度
兼容程度
说明
插件 API
✅ 高度兼容
大部分 Rollup 插件可直接使用
输出格式
✅ 兼容
ESM / CJS / IIFE / UMD
Tree-shaking
✅ 更优
Rolldown 的 Tree-shaking 更精确
代码分割
⚠️ 差异
advancedChunks
 替代 manualChunks
性能
✅ 10-30x
Rust 实现的天然优势

3. 代码分割策略

3.1 自动分割

// 动态 import 自动创建 chunk
const
 AdminPanel = lazy(() => import('./AdminPanel.vue'))
const
 Dashboard = lazy(() => import('./Dashboard.vue'))

3.2 manualChunks(Vite 7)

// vite.config.ts (Vite 7)
export
 default defineConfig({
  build
: {
    rollupOptions
: {
      output
: {
        manualChunks
: {
          vendor
: ['vue', 'vue-router', 'pinia'],
          ui
: ['element-plus'],
          utils
: ['lodash-es', 'dayjs']
        }
      }
    }
  }
})

3.3 advancedChunks(Vite 8)

Vite 8 引入 Rolldown 的 advancedChunks,更灵活的分组策略:

// vite.config.ts (Vite 8)
export
 default defineConfig({
  build
: {
    rolldownOptions
: {
      output
: {
        advancedChunks
: {
          groups
: [
            {
              name
: 'vendor',
              test
: /node_modules/,
              minSize
: 10000,  // 只拆分大于 10KB 的模块
              minShareCount
: 2  // 被至少 2 个 chunk 共享
            },
            {
              name
: 'framework',
              test
: /vue|react|svelte/,
              minSize
: 5000
            }
          ]
        }
      }
    }
  }
})

3.4 对比

维度
manualChunks
advancedChunks
匹配方式
精确模块名
正则 + 条件
自动优化
❌ 手动分组
✅ 基于 minSize/minShareCount
过度分割
常见(小模块独立 chunk)
更少(minSize 保护)
适用
简单项目
大型项目

4. CSS 处理管线

源码中的 CSS
  │
  ├─ .css 文件       → 直接处理
  ├─ .module.css     → CSS Modules
  ├─ .scss/.less     → 预处理器编译
  ├─ Vue SFC <style> → 提取后处理
  │
  ├─ PostCSS 处理
  │     ├─ Autoprefixer
  │     ├─ 自定义 PostCSS 插件
  │     └─ CSS Nesting 等
  │
  ├─ Lightning CSS
  │     ├─ 浏览器兼容降级
  │     ├─ CSS 压缩
  │     └─ 替代 cssnano
  │
  └─ 输出
        ├─ 开发:<style> 标签注入
        └─ 构建:提取为独立 CSS 文件

Vite 8 变化:Lightning CSS 从可选依赖变为默认依赖,开箱即用。


5. 静态资源处理

// 默认行为
import
 logo from './logo.png'     // → /assets/logo-abc123.png
import
 style from './style.css'   // → CSS 文件
import
 data from './data.json'    // → JSON 对象

// 内联为 base64(小于 4KB 默认内联)

import
 smallIcon from './icon.svg' // → data:image/svg+xml;base64,...

// 配置

export
 default defineConfig({
  build
: {
    assetsInlineLimit
: 4096,      // 内联阈值(字节)
    chunkSizeWarningLimit
: 500,   // chunk 大小警告阈值
    cssCodeSplit
: true,           // CSS 代码分割
    sourcemap
: true,              // 生成 sourcemap
    rollupOptions
: {              // Vite 7
      output
: { assetFileNames: 'assets/[name]-[hash][extname]' }
    },
    rolldownOptions
: {            // Vite 8
      output
: { assetFileNames: 'assets/[name]-[hash][extname]' }
    }
  }
})

6. 构建产物分析

# 安装分析插件
npm i -D rollup-plugin-visualizer
import { visualizer } from 'rollup-plugin-visualizer'

export
 default defineConfig({
  plugins
: [
    visualizer
({
      open
: true,
      filename
: 'stats.html',
      gzipSize
: true
    })
  ]
})

构建后自动打开可视化分析页面,可以看到每个 chunk 的模块组成和体积。


7. 真实项目构建性能

7.1 Vite 8 真实案例

公司
构建时间改善
Linear
46s → 6s(87% 缩短)
Ramp
减少 57%
Mercedes-Benz.io
减少最高 38%
Beehiiv
减少 64%

7.2 优化 Checklist

优化项
预期收益
难度
使用 dynamic import 按需加载
首屏体积 30-50% ↓
advancedChunks 分包
大 chunk 减少
CSS 压缩用 Lightning CSS
CSS 体积 10-20% ↓
图片压缩(sharp/imagemin)
图片体积 40-60% ↓
Tree-shaking 检查 sideEffects
无用代码 10-30% ↓
关闭生产 sourcemap
构建时间 20-30% ↓

8. 下期预告

下一篇我们将深入 Environment API

  • • 多运行时架构(client / ssr / worker / edge)
  • • 如何利用 Environment API 构建全栈应用
  • • Vite + Cloudflare Workers 实战

系列导航
← 04 HMR 热更新机制
→ 06 Environment API:Vite 的多运行时架构


💡 移动APP开发 | 资讯·工具·教程·社区
📱 关注我们,获取更多移动开发技术干货
💬 加入社群,与全国开发者交流成长
❤️ 觉得有用?点个"在看"分享给更多人!