Vite 用到现在也有几年了,从 2.x 一路追到 6.x,我最大的感受是——配置项真不多,文档也写得清楚,但真到了项目里,大家翻车的点往往不是"不知道有这个配置",而是不知道这个配置在什么场景下该用、为什么这么写、改完为什么没生效。
举个最常见的例子:线上项目突然发现构建产物路径不对,资源全 404;或者本地热更新失灵,改 .vue 文件不刷新,改 .js 文件反而正常;再或者大项目跑 vite build 直接内存爆掉,终端报一段 node_options=--max-old-space-size=4096 的错误。这些我都踩过,而且每一条都不是靠背文档能解决的,得靠对配置机制的理解。
这篇文章我就按自己实际调项目的顺序,把 Vite 常用配置和优化配置完整过一遍。内容会覆盖基础路径配置、开发服务器、热更新、依赖预构建、构建分包、环境变量,以及大项目常见的内存和启动性能问题。适合已经用 Vite 建过项目、但还没系统梳理过配置的开发者,也适合正准备从 webpack 迁移、想搞清楚 Vite 配置思路的同学。
1. 确认版本和项目形态:配置前最容易忽视的两件事
1.1 Vite 4/5/6 的配置差异,别拿旧习惯写新项目
很多教程和网上的配置片段,其实是有版本前提的。Vite 的配置 API 总体稳定,但几个关键行为在不同版本里变化不小:
- Vite 3:Node 14.18+ 起步,
build.target默认是'modules',这时候define中的字符串需要显式用JSON.stringify()。 - Vite 4:Node 14.18+,默认构建目标变成了基于
baseline-widely-available的一套 browserslist 策略,对现代浏览器支持更好。 - Vite 5:Node 18+ 起步,
define配置里的未定义变量会直接报警告,optimizeDeps的行为也更激进,开发阶段依赖扫描不再那么"老实"。 - Vite 6:默认 Node 版本要求更高,同时
Environment API走向成熟,自定义环境配置的玩法更多。
最常见的坑是:网上抄了一段配置,里面写了 define: { 'process.env': {} },在 Vite 2/3 里没问题,到了 Vite 5 就开始告警,到了 Vite 6 直接提示不推荐。倒不是说这段配置一定错,而是你可能根本不需要它——Vite 默认只给 import.meta.env 做静态替换,你要是没装 process.env 相关的依赖,代码里就不该出现 process.env 这种写法。
所以拿到任何配置,第一件事是确认 package.json 里的 vite 版本。可以用下面这个命令看:
bash复制npx vite --version
然后再去看对应版本的官方迁移指南,别凭记忆写。
1.2 Vue 3 项目和 React 项目的配置差异
"Vite 创建 Vue3 项目"这个热门搜索词背后,很多人其实卡在插件选型上。Vite 本身是框架无关的,只有通过插件才能处理编译逻辑,所以项目形态决定了你要不要额外装插件。
以 Vue 3 项目为例,标准的配置文件长这样:
js复制import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'node:path'
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
}
}
})
注意几个细节:
@vitejs/plugin-vue管的是.vue单文件组件编译,@vitejs/plugin-vue-jsx才是管 JSX 的。如果你在.vue文件里写 JSX,两个都要装。- 如果项目用了
<script setup>,plugin-vue会自动处理,不需要额外配置。 - React 项目则需要
@vitejs/plugin-react,别搞混。
CSS 预处理器这块也要提一下。Vite 内置了对 less、sass、stylus 的支持,前提是你先装好对应的 Node 依赖。没用过的人很容易漏这一步:
bash复制npm install -D sass
装完就能在 <style lang="scss"> 里直接写。如果你还想全局注入公共变量,再用 css.preprocessorOptions:
js复制export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: `@use "@/styles/variables.scss" as *;`
}
}
}
})
这里有个隐藏坑:additionalData 里的 @ 别名能不能用,取决于你是否在 css.preprocessorOptions 里配置了 import 路径解析,Vite 不会默认帮你把 @ 转成 src。上面的写法我实际用过,@use 语法里 Vite 会走别名解析,但如果你用旧式 @import,有时候会遇到相对路径报错。建议统一用 @use。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础配置:入口、路径、别名与静态资源,改错一次全局 404
2.1 root 和 base 的边界:一个管开发,一个管构建
先说 root。默认情况下 Vite 会把 vite.config.ts 所在目录当作项目根目录,index.html 驱动整个应用入口。绝大多数项目不需要改 root,除非你的配置文件放在非根目录:
js复制export default defineConfig({
root: path.resolve(__dirname, 'client'),
server: {
fs: {
// 允许访问工作区根目录外的文件
allow: ['..']
}
}
})
一旦改了 root,index.html 的路径、public 目录的位置、resolve.alias 的基准都会跟着变。我在一个 monorepo 项目里被这个坑过一次,配置文件在仓库根目录,前端代码在 client/ 下,结果 public 目录没跟着移动,构建后一直找不到 favicon.ico。
再说 base。这是最容易引起线上故障的配置。base 决定了构建产物里静态资源引用的基础路径:
- 部署到域名根路径:
base: '/' - 部署到子路径:
base: '/admin/' - 部署到 CDN 或任意路径都不确定:
base: './'
js复制export default defineConfig({
base: process.env.NODE_ENV === 'production' ? '/admin/' : '/'
})
很多新手会问:为什么本地开发一切正常,npm run build 之后页面空白、资源全 404?十有八九是 base 没配。Vite 在构建时会把 HTML 里的资源地址拼上 base,如果你部署到服务器二级目录但 base 还是 /,资源就会指向根域名的错误路径。反之,如果你在 vite.config.ts 里写了 base: './',那么本地开发模式下 index.html 里的资源引用也会变成相对路径,偶尔会引发路由跳动问题。
我的实践经验是:开发环境保持默认 /,生产环境按部署路径显式指定,别依赖动态判断。如果代码仓库里不方便写死,就用环境变量覆盖:
js复制base: process.env.VITE_BASE_PATH || '/'
