Vite 设计与实现

深入 Vite 8 的源码与架构。

你改一行代码,浏览器在 50 毫秒内更新了那一个组件——页面没刷新,状态还在。这件事听起来理所当然,做起来要跨越五个系统:文件监听、模块图、更新传播算法、WebSocket、客户端执行引擎。任何一环判断错了,你得到的就是"整页刷新"或者"改了没反应"。

本专栏以 Vite 8.0 源码为解剖对象,把这五个系统一个个拆开。

flowchart TB
  FS[文件变更] --> W[文件监听]
  W --> HMR
  subgraph HMR [HMR 链路]
    direction LR
    H1[handleHMRUpdate] --> H2[propagateUpdate<br/>更新传播算法]
    H2 --> H3[updateModules<br/>组装消息]
  end
  HMR -- WebSocket --> CL[HMRClient<br/>import.meta.hot]
  MG[模块图 ModuleGraph] <--> HMR
  subgraph SRV [Dev Server]
    direction LR
    MW[Connect 中间件栈] --- ENV[DevEnvironment]
  end
  SRV --> MG
  REQ[浏览器请求] --> SRV --> TR[转换管线<br/>JS · CSS · HTML · 资源]
  DEP[依赖预构建<br/>双维度哈希缓存] -.供给.-> SRV
  BUILD[生产构建 · Rolldown] -.同一套插件.-> TR

这个专栏最想让你记住的一件事:Vite 的一切都挂在插件系统上。 dev server 的中间件、转换管线、构建流程,本质都是 Hook 的编排。理解了插件系统与模块图,其余每一章都是它的推论。

读完你能做到什么

  1. 写出一个不会在生产构建里失效的插件。 Hook 的完整生命周期、执行顺序、configureServer 的边界,以及 dev 与 build 两条路径上同一个插件的行为差异(第4章 插件系统)。
  2. 说清一次 HMR 的完整链路。handleHMRUpdatepropagateUpdate 的传播算法、消息怎么组装、客户端 import.meta.hot 怎么执行、服务器重启后连接怎么恢复、孤立模块怎么清理(第6章 模块图第7章 HMR)。
  3. 看懂 dev server 的骨架。 ViteDevServer 的创建流程、Connect 中间件栈(顺序本身就是一条安全边界)、WebSocket、文件监听、重启机制的真正约束(第5章 开发服务器)。
  4. 调对依赖预构建。 双维度哈希缓存(lockfile + config 双重保护)、9 种包管理器的 lockfile 格式、配置哈希的字段白名单、依赖扫描与预构建执行(第8章 优化器)。
  5. 掌握转换管线。 JS/CSS/HTML/静态资源各自的处理路径与相互影响(第9章 JS 转换第10章 CSS第11章 HTML第12章 资源)。
  6. 用上 Environment API。 Vite 8 最大的范式变化——从"参数化"到"对象化":DevEnvironment / BuildEnvironment / ScanEnvironment 的类型体系、perEnvironmentPlugin、多环境协作(第16章 Environment API)。
  7. 理解生产构建。 Rolldown 引擎、产物优化、SSR 运行时、Worker(第13章 构建第14章 优化第15章 SSR第17章 Worker)。

适合谁读

源码版本

本专栏的源码引用以 vitejs/vitev8.0.3 为准,构建引擎是这一版默认启用的 Rolldown:

仓库 版本 Git Commit
vitejs/vite v8.0.3 a248a41
rolldown(默认构建引擎) 1.0.0-rc.12
git clone https://github.com/vitejs/vite.git
cd vite && git checkout v8.0.3

Vite 8 之后的小版本迭代较快,packages/vite/src/node/ 下的行号会漂移;正文标注的路径与函数名是稳定锚点,行号仅供定位。

目录

第一部分:开篇

第二部分:核心架构

第三部分:开发服务器

第四部分:转换管线

第五部分:构建与生产

第六部分:高级特性

第七部分:总结

版权声明

本专栏内容为 杨艺韬 版权所有,保留一切权利。未经书面许可,不得全文或大段转载、改编、翻译,或用于任何商业用途(含以本专栏内容训练模型、生成衍生课程或商品)。

欢迎分享本专栏的链接。引用少量内容用于评论、教学或研究时,请署名 杨艺韬 并附上原文链接。