命令行里输入 `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)

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

相关推荐
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
_李小白6 小时前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
杨云龙UP7 小时前
从0到1快速学会Linux操作系统(基础),这一篇就够了!
linux·运维·服务器·学习·ubuntu·centos·ssh
头疼的程序员7 小时前
计算机网络:自顶向下方法(第七版)第八章 学习分享(三)
网络·学习·计算机网络
_李小白8 小时前
【OSG学习笔记】Day 37: NodeVisitor(顶点访问器)
笔记·学习
程序员雷欧8 小时前
大模型应用开发学习第八天
大数据·人工智能·学习
晓晓hh9 小时前
JavaSE学习——set集合和Map映射
学习
لا معنى له10 小时前
Var-JEPA:联合嵌入预测架构的变分形式 —— 连接预测式与生成式自监督学习 ----论文翻译
人工智能·笔记·学习·语言模型
世人万千丶10 小时前
Flutter 框架跨平台鸿蒙开发 - 宠物语言翻译器应用
学习·flutter·华为·开源·harmonyos·鸿蒙
AI成长日志10 小时前
【笔面试算法学习专栏】哈希表基础:两数之和与字母异位词分组
学习·算法·面试