命令行里输入 `vite`,发生了什么

一、命令行里输入 vite,第一步发生了什么?

1️⃣ Shell 在找:vite 是谁?

你在终端里敲:

bash 复制代码
vite

Shell(zsh / bash)会按顺序找:

  1. 是不是内置命令
  2. 是不是 PATH 里的可执行文件

vite 通常来自这里:

bash 复制代码
node_modules/.bin/vite

为什么能直接敲 vite


二、node_modules/.bin/vite 是怎么来的?

当你安装 Vite:

bash 复制代码
npm install vite

npm 做了两件关键的事:

1️⃣ 在 node_modules/vite/ 里装源码

2️⃣ 在 node_modules/.bin/ 里生成一个「软链接 / 启动器」

这个链接来自 vitepackage.json

json 复制代码
{
  "bin": {
    "vite": "bin/vite.js"
  }
}

👉 含义:
当你运行 vite 时,实际上运行的是:

bash 复制代码
node node_modules/vite/bin/vite.js

三、bin/vite.js 是个什么东西?

你可以理解为:Vite 的入口文件

大致结构是这样的(简化):

js 复制代码
#!/usr/bin/env node

import { createServer, build } from '../dist/node/index.js'
import { resolveConfig } from '../dist/node/config.js'

// 解析命令行参数
const command = process.argv[2]

if (command === 'build') {
  build()
} else {
  createServer()
}

这一步做了 3 件事:

  1. 解析 CLI 参数

    • vite
    • vite dev
    • vite build
    • vite preview
  2. 加载 Vite 的核心模块

  3. 根据命令进入不同流程


四、为什么 vite 默认是 dev,不是 build?

bash 复制代码
vite

等价于:

bash 复制代码
vite dev

👉 所以默认走的是:

ts 复制代码
createServer()

五、createServer() 内部发生了什么?(重点)

这是 Vite 和 Webpack 最大的分水岭。

1️⃣ 读取并合并配置

ts 复制代码
vite.config.ts

合并顺序:

复制代码
内置默认配置
→ 插件注入配置
→ 用户配置
→ 命令行参数

2️⃣ 启动一个 HTTP Server(不是打包!)

text 复制代码
localhost:5173

⚠️ 关键点:Vite dev 模式不打包


3️⃣ 注册一堆中间件(核心)

类似:

ts 复制代码
server.use(transformMiddleware)
server.use(staticMiddleware)
server.use(hmrMiddleware)

职责分别是:

中间件 作用
static 提供静态文件
transform 按需编译模块
hmr 热更新
plugin 插件钩子

六、浏览器访问页面时,Vite 才开始"构建"

举个真实流程

浏览器请求:

html 复制代码
<script type="module" src="/src/main.ts"></script>
Vite 做什么?
  1. 拦截请求 /src/main.ts

  2. 调用插件链:

    ts 复制代码
    resolveId → load → transform
  3. 把 TS / Vue / JSX:

    ts 复制代码
    → 转成浏览器能执行的 ES Module
  4. 返回结果给浏览器

👉 每个模块是"按需编译"的


七、那 vite build 又是另一条路

bash 复制代码
vite build

执行路径:

text 复制代码
vite
 → bin/vite.js
   → build()
     → 调用 Rollup

build 阶段关键点:

Vite
实际打包 Rollup
配置 自动转成 Rollup config
插件 Vite 插件 → Rollup 插件
输出 dist/

⚠️ Vite 本身不是打包器,它是 dev server + Rollup 封装


八、为什么 Vite 启动这么快?

核心原因只有一句话:

dev 模式下:不打包 + 原生 ES Module

对比:

工具 启动时做的事
Webpack 构建整个依赖图
Vite 启 HTTP 服务,模块按需编译

九、一句话总结整个 vite 命令生命周期

text 复制代码
vite
 ↓
Shell 找到 node_modules/.bin/vite
 ↓
Node 执行 bin/vite.js
 ↓
解析 CLI 参数
 ↓
createServer()
 ↓
启动 HTTP Server
 ↓
浏览器请求模块
 ↓
Vite 按需编译并返回

十、如果你愿意,下一步可以继续深入 👇

你这个问题已经在构建工具原理线上了,我可以继续带你拆:

  1. 🔥 Vite 插件机制是怎么设计的?
  2. 🔥 resolveId / load / transform 全流程
  3. 🔥 HMR 为什么能做到"精准更新"
  4. 🔥 Vite vs Webpack 在"依赖图构建"上的根本差异
  5. 🔥 Vite 如何处理 CSS / 资源文件 / 预构建依赖(optimizeDeps)

你挑一个,我按源码级 + 面试级给你讲。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码6 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习