Vite 为什么快?因为它“少做了 90% 的事”

0 阅读3分钟

🧠 你一定遇到过这个问题

你有没有这种体验:

👉 用 Webpack

  • 项目一启动:等 10 秒起步
  • 改一行代码:再等 1~3 秒刷新

👉 换成 Vite

  • 项目:秒开
  • 改代码:几乎“瞬间刷新”

很多人会说:

“因为 Vite 用了 ES Modules,所以更快”

但这个答案,只说对了一半。

👉 真正的原因是:Vite 把“开发阶段最耗时的事情,直接删掉了”。


⚔️ 一句话讲清本质差异

👉 Webpack:先全部打包,再运行
👉 Vite:运行时按需编译

如果你记不住技术细节,记住这个类比就够了👇


🍳 类比一下(非常重要)

  • Webpack:
    👉 客人没来,先把整桌菜全做完
  • Vite:
    👉 客人点一道,我做一道

👉 差距就出来了。


🐢 为什么 Webpack 一启动就慢?

本质就一句话:

👉 它必须“先做完所有事情”,你才能开始用


它到底在干嘛?

扫描所有文件 → 构建依赖图 → 全量编译 → 打包 → 输出 bundle.js

👉 哪怕你只打开一个页面:

  • 项目里 1000 个文件
  • 它也得处理 1000 个

更致命的是👇

👉 你改一行代码:

可能要重新打包一大部分代码

👉 所以你看到的就是:

  • 启动慢
  • 修改慢
  • 项目越大越慢

⚡ Vite 做了一件“反常识”的事

👉 它在开发阶段,直接“不打包了”


启动时它在干嘛?

启动一个本地服务器 → 完事

👉 没有打包
👉 没有编译全部代码


真正的编译发生在什么时候?

👉 浏览器请求的时候

浏览器要哪个文件 → Vite 才编译哪个文件

👉 举个例子:

你项目有 1000 个文件

  • Webpack:编译 1000 个
  • Vite:可能只编译 50 个

👉 这就是本质差距


🧠 那浏览器为什么现在可以这样玩?

因为浏览器变强了👇


✅ 1. 原生支持 ES Modules

import { foo } from './foo.js'

浏览器现在可以:

  • 自动请求依赖
  • 自动执行模块

👉 不需要打包


✅ 2. HTTP/2 多路复用

以前:

👉 多请求 = 慢 ❌

现在:

👉 多请求 = 可以并行 ✅


👉 所以:

“不打包 + 多文件加载”反而变成可行方案


🔥 Vite 到底做了哪些“骚操作”?

核心就三件事👇


① 改写 import(很关键)

你写:

import React from 'react'

浏览器看不懂 ❌


👉 Vite 帮你改成:

import React from '/node_modules/.vite/react.js'

👉 浏览器:OK ✅


② 用 esbuild 快速编译

浏览器看不懂:

  • TS
  • JSX
  • Vue

👉 Vite 用 esbuild:

  • 实时转成 JS
  • 速度比 Babel 快 10~100 倍

③ 依赖预构建(只做一次)

node_modules 很重?

👉 Vite:

提前处理一次 → 缓存下来

路径:

node_modules/.vite

👉 后面直接复用


⚡ 为什么 Vite 热更新快到离谱?

Webpack:

改代码 → 重新打包 → 更新页面

Vite:

改代码 → 只更新这个模块 → 页面瞬间变化

👉 本质:

👉 更新粒度更小


🧩 最关键的认知升级(这段决定你有没有理解)

很多人以为:

👉 Vite 是“更快的 Webpack”

其实不是。

Vite 做的事情,本质上是:

👉 把“打包”这件事,从开发阶段移除了。

换句话说:

-   Webpack 是:构建驱动(Build-driven)
-   Vite 是:请求驱动(Request-driven)

这不是优化,而是思路的改变。


📊 用一句话总结

👉 Webpack 慢,是因为它“什么都要提前做”
👉 Vite 快,是因为它“只做你现在需要的”


🚀 写在最后

👉 Webpack 像:

出门前把所有行李都打包好(哪怕你只用一件衣服)

👉 Vite 像:

到酒店再按需要东西