地图笔记
83.26M · 2026-04-16
:::tip 本章要点
前端构建工具的演进史,本质上是一部开发体验与生产性能的博弈史。
Webpack 的核心理念是"万物皆模块"——JS、CSS、图片、字体,所有资源都通过 loader 转换为 JavaScript 模块,最终打包成 bundle。这在 2015 年是革命性的,但随着项目规模增长,问题浮现了:
webpack-dev-server 启动需要 30-60 秒webpack.config.js 动辄数百行,loader/plugin 的组合爆炸esbuild(Go)和 swc(Rust)用系统语言重写了 JavaScript 编译器,将转换速度提升了 10-100 倍。但它们解决的是编译速度问题,而不是架构问题——开发服务器仍然需要先打包再服务。
Vite 的突破不在于更快的编译器,而在于架构创新:
graph LR
A[传统方案] --> B[启动时打包所有模块]
B --> C[服务打包后的 bundle]
D[Vite 方案] --> E[启动时只启动服务器]
E --> F[请求时按需转换模块]
开发阶段,Vite 利用浏览器原生 ESM 支持,不打包、不构建,浏览器请求哪个模块就实时转换哪个模块。这让冷启动从"分钟级"降到"毫秒级"。
生产阶段,Vite 使用 Rolldown(Rust 编写的 Rollup 兼容打包器)进行优化构建,兼顾性能与产物质量。
graph TB
subgraph "开发阶段 (vite dev)"
A1[原生 ESM] --> A2[按需转换]
A2 --> A3[毫秒级 HMR]
end
subgraph "生产阶段 (vite build)"
B1[Rolldown 打包] --> B2[代码分割]
B2 --> B3[Tree Shaking]
B3 --> B4[压缩优化]
end
这是 Vite 最根本的架构决策:开发和生产使用完全不同的策略。开发追求速度(原生 ESM + 按需转换),生产追求质量(Rolldown + 优化)。
Vite 的核心非常小——大部分功能(CSS 处理、TypeScript 编译、HTML 转换、资源处理)都通过内置插件实现。用户插件和内置插件使用完全相同的 Hook 接口,没有特权 API。
零配置即可处理 TypeScript、JSX、CSS Modules、静态资源。只有当你需要定制时才需要配置。
文档告诉你 import.meta.hot.accept() 可以注册 HMR 回调,但不会告诉你:
如果你要开发 Vite 插件,理解内置插件的实现会帮你:
Vite 源码中有大量可迁移到其他项目的设计模式:
graph TD
A[第1-2章: 为什么 & 架构总览] --> B[第3-4章: 配置 & 插件系统]
B --> C[第5-8章: 开发服务器核心]
C --> D[第9-12章: 转换管线]
D --> E[第13-14章: 构建与优化]
E --> F[第15-17章: 高级特性]
F --> G[第18章: 设计模式总结]
每一章都会大量使用 Mermaid 图表来可视化数据流、状态机和架构关系,帮助你建立清晰的心智模型。
让我们开始吧。