目录
-
- 一、从一个"不对劲"的地方说起
- [二、Vite 帮你解决了什么问题](#二、Vite 帮你解决了什么问题)
-
- [2.1 问题一:浏览器不认识 TypeScript 和 .vue 文件](#2.1 问题一:浏览器不认识 TypeScript 和 .vue 文件)
- [2.2 问题二:管理第三方库很麻烦](#2.2 问题二:管理第三方库很麻烦)
- [2.3 问题三:写代码时需要"实时预览"](#2.3 问题三:写代码时需要"实时预览")
- [2.4 问题四:上线前需要"打包优化"](#2.4 问题四:上线前需要"打包优化")
- [三、Vite 到底是什么](#三、Vite 到底是什么)
-
- [为什么叫 Vite?](#为什么叫 Vite?)
- [四、Vite 怎么用](#四、Vite 怎么用)
-
- [4.1 创建你的第一个 Vite 项目](#4.1 创建你的第一个 Vite 项目)
- [4.2 项目目录长什么样](#4.2 项目目录长什么样)
- [4.3 三个核心命令](#4.3 三个核心命令)
- [4.4 配置文件入门](#4.4 配置文件入门)
- [4.5 一个简单的例子:从零到看到页面](#4.5 一个简单的例子:从零到看到页面)
- [五、Vite 的几个贴心功能](#五、Vite 的几个贴心功能)
-
- [5.1 路径别名(告别 `../../../`)](#5.1 路径别名(告别
../../../)) - [5.2 代理(解决跨域问题)](#5.2 代理(解决跨域问题))
- [5.3 环境变量(区分开发和生产)](#5.3 环境变量(区分开发和生产))
- [5.4 开箱即用的语言支持](#5.4 开箱即用的语言支持)
- [5.1 路径别名(告别 `../../../`)](#5.1 路径别名(告别
- [六、开发时 vs 上线时:Vite 做了不一样的优化](#六、开发时 vs 上线时:Vite 做了不一样的优化)
- 七、总结
一、从一个"不对劲"的地方说起
学完 HTML、CSS、JavaScript 和 TypeScript 之后,你可能已经习惯了这样的开发方式:
写一个 index.html
写一个 style.css
写一个 app.js(或 app.ts)
在浏览器里直接打开 index.html
一切都很自然,直到你开始接触 Vue、React 这些框架,或者尝试在项目里引入第三方库------你会发现所有教程的开头都是同一句话:
bash
npm create vite@latest
然后你的项目就跑在一个 http://localhost:5173 的地址上,不再是双击 HTML 文件打开了。
为什么要多此一举?Vite 到底在干什么?
这就是本文要回答的问题。
二、Vite 帮你解决了什么问题
2.1 问题一:浏览器不认识 TypeScript 和 .vue 文件
假设你写了一行 TypeScript:
typescript
const name: string = "小明";
浏览器看到 : string 直接就报错了------浏览器只认识 JavaScript,不认识 TypeScript。
再比如 Vue 的单文件组件(.vue 文件),里面 <template>、<script>、<style> 混在一起,浏览器更不可能看懂。
你需要一个工具,把这些"浏览器不认识的东西"翻译成"浏览器能认识的东西"。Vite 就是干这个的。
.ts 文件 → Vite 翻译 → .js 文件 → 浏览器 ✅
.vue 文件 → Vite 翻译 → .js + .css → 浏览器 ✅
.scss 文件 → Vite 翻译 → .css 文件 → 浏览器 ✅
2.2 问题二:管理第三方库很麻烦
当你需要引入一个第三方库,比如 axios(发 HTTP 请求用的),以前你可能会这样:
html
<!-- 老办法1:下载一个 .js 文件,放到项目里,用 <script> 引入 -->
<script src="./lib/axios.min.js"></script>
<!-- 老办法2 -->
<script type="module">
// 用相对路径引用本地文件
import axios from './lib/axios.min.js';
axios.get('/api/user').then(res => console.log(res.data));
</script>
项目依赖的库多了以后,版本管理、更新、引用顺序都会变成一团乱麻。Vite 让你可以用现代的方式管理依赖:
bash
npm install axios # 一条命令安装
typescript
// 在代码里直接 import,不需要手动管理 script 标签
import axios from 'axios';
2.3 问题三:写代码时需要"实时预览"
你之前写代码的流程可能是:
修改代码 → 保存 → 切到浏览器 → 刷新页面 → 看效果
页面一多,来回切窗口、手动刷新,效率很低。
Vite 提供一个开发服务器,它会:
- 自动监听文件变化
- 文件一改,浏览器自动刷新(甚至不刷新整个页面,只更新改了的那一小块)
- 代码出错时,浏览器上直接显示错误信息
你只需要保存代码,看一眼浏览器就行了。
2.4 问题四:上线前需要"打包优化"
写完项目后,你的 src/ 目录里可能有几十上百个文件,还引入了好几 MB 的第三方库。直接把这些文件丢到服务器上?访问速度会很慢。
Vite 的 build 命令会把你的项目:
- 多个 JS 文件合并成少数几个文件
- 压缩代码(去掉空格、注释、缩短变量名)
- 优化图片和 CSS
- 输出到一个干净的
dist/文件夹
这个文件夹才是你真正放到服务器上去的东西。
三、Vite 到底是什么
现在可以给一个定义了:
Vite 是一个前端开发工具,它帮你做三件事:开发时翻译代码并实时预览,上线时打包优化代码。
它本质上是一个开发服务器 + 构建工具:
┌─────────────────────────────────────────┐
│ Vite │
│ │
│ 开发时(npm run dev) │
│ ├── 启动一个本地服务器(localhost:5173) │
│ ├── 实时翻译 TS/Vue/SCSS → JS/CSS/HTML │
│ ├── 监听文件变化,自动刷新浏览器 │
│ └── 管理第三方依赖(node_modules) │
│ │
│ 上线时(npm run build) │
│ ├── 合并、压缩所有代码 │
│ ├── 处理图片、CSS 等资源 │
│ └── 输出到 dist/ 文件夹 │
└─────────────────────────────────────────┘
为什么叫 Vite?
Vite 是法语,发音类似"veet",意思是"快"。它最大的特点就是快------启动快、修改代码后反应快。
四、Vite 怎么用
4.1 创建你的第一个 Vite 项目
打开终端,输入:
bash
npm create vite@latest
它会问你几个问题:
? Project name: › my-first-app # 项目名字,随便起
? Select a framework: › # 选框架(Vue / React / 原生)
? Select a variant: › # 选语言(TypeScript / JavaScript)
选完之后,按提示操作:
bash
cd my-first-app # 进入项目目录
npm install # 安装依赖
npm run dev # 启动开发服务器
终端会显示:
VITE v5.x.x ready in 300 ms
➜ Local: http://localhost:5173/
浏览器打开这个地址,你就看到了一个运行中的前端项目。
4.2 项目目录长什么样
my-first-app/
├── index.html # 入口页面(Vite 把它放在根目录)
├── package.json # 项目配置和依赖清单
├── vite.config.ts # Vite 的配置文件
├── public/ # 不需要处理的静态文件(如图标)
│ └── favicon.ico
├── src/ # 你的代码都在这里
│ ├── main.ts # 程序的入口文件
│ ├── App.vue # 根组件
│ ├── components/ # 放组件
│ ├── assets/ # 放需要处理的资源(图片、样式等)
│ └── style.css # 全局样式
└── node_modules/ # 第三方库安装在这(不用手动管)
几个关键点:
index.html在根目录,不在public/里。它通过<script type="module" src="/src/main.ts">指定了程序入口src/是你写代码的地方,所有源码放这里public/放不需要编译的文件(比如网站图标),Vite 会原样复制到输出目录node_modules/是第三方库的家,你不需要进去看,也不需要提交到 Git
4.3 三个核心命令
json
// package.json 中的 scripts
{
"scripts": {
"dev": "vite", // 启动开发服务器
"build": "vite build", // 打包,准备上线
"preview": "vite preview" // 本地预览打包后的效果
}
}
bash
npm run dev # 开发时用 → 打开 http://localhost:5173 写代码
npm run build # 写完后用 → 生成 dist/ 文件夹
npm run preview # 上线前检查 → 预览 dist/ 里的东西是否正常
一个典型的工作流:
npm run dev → 边写代码边看效果
代码写完了,npm run build → 生成 dist/ 文件夹
npm run preview → 确认一下打包结果没问题
把 dist/ 文件夹部署到服务器上 → 上线
4.4 配置文件入门
vite.config.ts 是 Vite 的配置文件。刚开始你不需要改它,默认值就能用。但了解几个常用配置会有帮助:
typescript
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()], // 告诉 Vite 要处理 .vue 文件
server: {
port: 3000, // 改成你想要的端口号(默认 5173)
open: true, // 启动后自动打开浏览器
},
resolve: {
alias: {
'@': '/src', // 设置路径别名,以后可以用 @/components/xxx 代替 ../../components/xxx
},
},
})
4.5 一个简单的例子:从零到看到页面
假设用 Vue + TypeScript 模板创建一个项目后,我们来理解一下代码是怎么跑起来的:
① index.html(入口页面)
html
<!DOCTYPE html>
<html lang="en">
<head>...</head>
<body>
<div id="app"></div>
<!-- 关键:用 ESM 方式引入入口文件 -->
<script type="module" src="/src/main.ts"></script>
</body>
</html>
② src/main.ts(程序入口)
typescript
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
// 创建一个 Vue 应用,挂载到 index.html 里的 <div id="app"> 上
③ src/App.vue(根组件)
vue
<template>
<h1>{{ message }}</h1>
</template>
<script setup lang="ts">
const message: string = 'Hello Vite!'
</script>
<style scoped>
h1 { color: #42b883; }
</style>
整个流程:
浏览器请求 index.html
→ 看到 <script type="module" src="/src/main.ts">
→ 请求 /src/main.ts
→ Vite 把 main.ts 编译成 JS,返回给浏览器
→ 浏览器执行,发现又 import 了 App.vue
→ 请求 /src/App.vue
→ Vite 把 .vue 文件拆成 JS + CSS,返回给浏览器
→ 浏览器渲染出页面
这一切都是自动的、按需的,你只负责写代码。
五、Vite 的几个贴心功能
5.1 路径别名(告别 ../../../)
typescript
// vite.config.ts 中配置
resolve: {
alias: {
'@': '/src',
},
}
typescript
// 之前:import Header from '../../../components/Header.vue'
// 之后:
import Header from '@/components/Header.vue'
5.2 代理(解决跨域问题)
开发时前端跑在 localhost:5173,后端接口跑在 localhost:8080,浏览器会因为跨域阻止请求。Vite 可以帮你转发:
typescript
// vite.config.ts
server: {
proxy: {
'/api': {
target: 'http://localhost:8080', // 后端地址
changeOrigin: true,
}
}
}
typescript
// 代码里直接写 /api,Vite 会自动转发到 http://localhost:8080/api
const res = await fetch('/api/users');
5.3 环境变量(区分开发和生产)
bash
# .env.development(开发环境)
VITE_API_URL=http://localhost:8080
# .env.production(生产环境)
VITE_API_URL=https://api.myapp.com
typescript
// 代码中直接使用
console.log(import.meta.env.VITE_API_URL);
// 开发时输出 http://localhost:8080
// 打包后输出 https://api.myapp.com
只有
VITE_开头的变量才会暴露给前端代码,防止你不小心把密钥泄露出去。
5.4 开箱即用的语言支持
| 你写的 | 需要额外安装 | Vite 处理后的结果 |
|---|---|---|
.ts 文件 |
不需要 | 自动转成 .js |
.scss / .less 文件 |
npm install sass |
自动转成 .css |
.vue 文件 |
不需要 | 拆成 JS + CSS + HTML |
导入图片 import logo from './logo.png' |
不需要 | 自动返回图片 URL |
六、开发时 vs 上线时:Vite 做了不一样的优化
这是一个重要的理解:Vite 在开发时和上线时用的是不同的策略。
| 开发时(npm run dev) | 上线时(npm run build) | |
|---|---|---|
| 目标 | 启动快,改代码秒反应 | 文件小,加载快 |
| 处理方式 | 浏览器请求哪个文件,就编译哪个 | 一次性把所有文件编译打包 |
| 代码 | 不压缩,保留可读性 | 压缩、合并、混淆 |
| 输出 | 在内存中,不写入硬盘 | 输出到 dist/ 文件夹 |
为什么开发时不打包?
因为打包很慢。如果每次启动都要把所有文件打包一次,等你项目大了,可能得等几十秒。Vite 的做法是:浏览器要什么,我就给什么,现要现编译。这样启动就是秒级的事。
为什么上线时要打包?
因为用户访问你的网站时,浏览器一次性下载几十个零散的小文件会很慢(每个文件都是一次 HTTP 请求)。打包后合并成几个大文件,加载速度就快多了。
七、总结
一个类比帮你记住
| 概念 | 类比 |
|---|---|
| Vite | 你的私人开发助理 |
npm run dev |
助理帮你搭好本地环境,实时预览你的代码 |
npm run build |
助理帮你把代码整理、压缩、打包,准备发布 |
vite.config.ts |
你告诉助理"按这个规矩办事" |
你现在需要记住的
bash
# 创建项目
npm create vite@latest
# 进入项目,安装依赖
cd 项目名
npm install
# 开始写代码
npm run dev
# 写完了,打包上线
npm run build
Vite 本质上就是帮你解决了从"写完代码"到"代码在浏览器里跑起来"之间的所有麻烦事。你只管写代码,剩下的事交给它。