Vite配置详解:从入门到精通
Vite 是一款由 Vue.js 作者尤雨溪开发的现代前端构建工具,它以其极速的开发服务器启动速度和闪电般的模块热更新 (HMR) 而闻名。Vite 利用浏览器原生的 ES Modules (ESM) 能力,在开发环境下跳过了打包步骤,直接提供模块给浏览器,从而大幅提升了开发体验。在生产环境下,Vite 采用 Rollup 进行打包,兼顾了性能和优化。
本篇文档将深入探讨 Vite 的核心配置,帮助开发者充分利用 Vite 的能力。
核心思想:
Vite 的配置以 vite.config.ts (或 .js) 文件为中心,使用 ESM 模块导出配置对象。它通过 plugins 数组扩展功能,通过 server 配置开发服务器,build 配置生产构建,resolve 配置模块解析,以及 css、json 等全局配置项,实现了高度可定制性和灵活性。
一、Vite 配置文件的基本结构
Vite 的配置文件通常命名为 vite.config.js 或 vite.config.ts,位于项目根目录。它是一个 ESM 模块,负责导出一个配置对象。
1 | // vite.config.ts |
关键点:
defineConfig:虽然不是必需的,但强烈建议使用defineConfig函数来包裹配置对象。这提供了智能提示 (IntelliSense) 和类型检查,帮助避免配置错误。- ESM 模块:配置文件必须遵循 ES Modules 规范,使用
import和export default。
二、核心配置选项详解
Vite 的配置选项非常丰富,以下将对一些常用且重要的配置进行详细解析。
2.1 root
- 类型:
string - 默认值:
process.cwd()(项目根目录) - 描述:项目根目录(
index.html文件所在的位置)。可以直接通过命令行vite --root <path>指定。
2.2 base
- 类型:
string - 默认值:
/ - 描述:公共基础路径。
- 在开发或生产构建时,如果你的部署会到一个非根路径,需要设置此项。
- 例如,如果应用部署在
https://www.example.com/my-app/,则base应设置为/my-app/。 - Vite 会自动将所有引用(包括资源 URL 和绝对路径)调整到此基础路径。
2.3 mode
- 类型:
string - 默认值:
'development'(开发环境) /'production'(生产环境) - 描述:运行模式。Vite 会根据
--mode命令行选项自动设置。在开发时通常是development,打包时是production。可以通过此选项来加载不同的环境变量。
2.4 plugins
- 类型:
Array<PluginOption | (PluginOption | PluginOption[])[]> - 描述:一个数组,用于配置 Vite 插件。插件是 Vite 扩展其核心功能的主要方式,例如支持 Vue、React、TypeScript、图片优化等。
- 示例:
1
2
3
4
5
6
7
8
9
10import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import basicSsl from '@vitejs/plugin-basic-ssl'; // 一个用于 HTTPS 开发的插件
export default defineConfig({
plugins: [
vue(),
basicSsl() // 启用 HTTPS 开发服务器
]
});
- 示例:
2.5 publicDir
- 类型:
string | false - 默认值:
'public' - 描述:静态资源服务的目录。此目录下的文件会直接被服务,不会经过构建流程。
- 在开发服务器中,直接通过
/访问。例如public/logo.png可通过http://localhost:3000/logo.png访问。 - 在构建时,会被复制到
outDir根目录。 - 如果设置为
false,则禁用公共文件服务。
- 在开发服务器中,直接通过
2.6 cacheDir
- 类型:
string - 默认值:
'node_modules/.vite' - 描述:存储缓存文件的目录。Vite 将优化过的依赖缓存到此目录,以提高后续启动速度和构建速度。
2.7 resolve
- 类型:
ResolveOptions - 描述:配置模块解析的策略。
2.7.1 resolve.alias
- 类型:
Record<string, string> | Array<{ find: string | RegExp, replacement: string, customResolver?: ResolverFunction }> - 描述:路径别名。用于模块导入时创建别名,使导入路径更简洁。
- 示例:
1
2
3
4
5
6
7
8
9
10
11
12// vite.config.ts
import { defineConfig } from 'vite';
import { resolve } from 'path'; // 导入 path 模块
export default defineConfig({
resolve: {
alias: {
'@': resolve(__dirname, './src'), // @ 符号指向 src 目录
'#': resolve(__dirname, './types') // # 符号指向 types 目录
}
}
}); - 通过这样配置后,在代码中你可以使用
import Component from '@/components/Component.vue'而不是import Component from '../../components/Component.vue'。
- 示例:
2.7.2 resolve.dedupe
- 类型:
string[] - 描述:在开发环境下,强制 Vite 始终将列出的依赖项解析到同一副本。这在 monorepo 或依赖项被多次引用但需要确保它们是同一个实例时很有用。
2.7.3 resolve.extensions
- 类型:
string[] - 默认值:
['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'] - 描述:导入时可省略的扩展名列表。
2.8 css
- 类型:
CSSOptions - 描述:配置 CSS 预处理器、CSS Modules 等。
2.8.1 css.preprocessorOptions
- 类型:
Record<string, Record<string, any>> - 描述:指定 CSS 预处理器的选项。
- 示例 (SCSS):
1
2
3
4
5
6
7
8
9
10
11
12// vite.config.ts
import { defineConfig } from 'vite';
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";` // 自动向所有 SCSS 文件注入变量
}
}
}
});
- 示例 (SCSS):
2.8.2 css.modules
- 类型:
CSSModulesOptions - 描述:配置 CSS Modules 的行为。
2.9 json
- 类型:
JSONOptions - 描述:配置 JSON 导入的行为。
2.9.1 json.namedExports
- 类型:
boolean - 默认值:
true - 描述:是否支持 JSON 文件的命名导出。
2.10 esbuild
- 类型:
ESBuildOptions | false - 描述:ESBuild 是 Vite 默认用于代码转译和压缩的工具。可以配置其选项或禁用它。
2.10.1 esbuild.jsxFactory / esbuild.jsxFragment
- 类型:
string - 描述:JSX 转译为
React.createElement(或其他) 调用的工厂函数。
2.11 server
- 类型:
ServerOptions - 描述:配置开发服务器。
2.11.1 server.host
- 类型:
string | boolean - 默认值:
'localhost' - 描述:指定服务器监听的 IP 地址。
'localhost':只能通过本地访问。'0.0.0.0'或true:可以从局域网 IP 访问,便于移动端调试。'127.0.0.1':默认。
2.11.2 server.port
- 类型:
number - 默认值:
5173 - 描述:指定开发服务器端口。如果端口被占用,Vite 会自动尝试下一个可用端口。
2.11.3 server.strictPort
- 类型:
boolean - 默认值:
false - 描述:如果端口被占用,是否严格退出而不是尝试下一个可用端口。
2.11.4 server.https
- 类型:
boolean | Http2ServerOptions - 默认值:
false - 描述:是否启用 HTTPS (TLS)。需要配置 SSL 证书。
- 可以使用
@vitejs/plugin-basic-ssl插件来快速启用自签名证书。
- 可以使用
2.11.5 server.open
- 类型:
boolean | string - 默认值:
false - 描述:服务器启动后是否自动打开浏览器。
true:打开默认浏览器。string:指定要打开的 URL 路径 (如/dashboard)。
2.11.6 server.proxy
- 类型:
Record<string, string | ProxyOptions> - 描述:配置代理规则,将特定路径的请求转发到其他服务器。解决跨域问题。
- 示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// vite.config.ts
import { defineConfig } from 'vite';
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:8080', // 后端 API 服务器地址
changeOrigin: true, // 改变源,使其符合后端服务器的源
rewrite: (path) => path.replace(/^\/api/, '') // 重写路径,将 /api 替换为空
},
'/socket.io': {
target: 'ws://localhost:8080',
ws: true // 针对 WebSocket
}
}
}
});
- 示例:
2.11.7 server.hmr
- 类型:
boolean | HmrOptions - 默认值:
true - 描述:配置 WebSocket 服务器。如果需要,可以禁用 HMR 或配置 HMR 的连接选项。
2.11.8 server.cors
- 类型:
boolean | CorsOptions - 默认值:
false - 描述:是否允许 CORS。设置为
true会允许所有来源的请求。
2.12 build
- 类型:
BuildOptions - 描述:配置生产构建。
2.12.1 build.target
- 类型:
string | string[] - 默认值:
'modules'(支持原生 ESM 的浏览器) - 描述:设置最终构建的浏览器兼容目标。
'es2015'等 ES 版本:转译到指定 ES 版本。['es2015', 'chrome58', 'ios10']:多个目标。
2.12.2 build.outDir
- 类型:
string - 默认值:
'dist' - 描述:指定输出目录。
2.12.3 build.assetsDir
- 类型:
string - 默认值:
'assets' - 描述:指定在
outDir中的静态资源存放目录。
2.12.4 build.assetsInlineLimit
- 类型:
number - 默认值:
4096(4KB) - 描述:小于此阈值的导入或引用的资源将内联为 base64 编码。设置为
0可以完全禁用内联。
2.12.5 build.cssCodeSplit
- 类型:
boolean - 默认值:
true - 描述:是否启用 CSS 代码分割。如果设置为
false,整个项目的 CSS 将被抽离到一个 CSS 文件中。
2.12.6 build.sourcemap
- 类型:
boolean | 'inline' | 'hidden' - 默认值:
false - 描述:是否生成 Source Map 文件。
true:生成 Source Map。'inline':Source Map 以 Data URI 的形式内联到输出文件中。'hidden':生成 Source Map 但不在源文件中引用。
2.12.7 build.minify
- 类型:
boolean | 'terser' | 'esbuild' - 默认值:
'esbuild' - 描述:指定使用哪种压缩器。
'terser':使用 Terser 进行压缩,提供更多配置选项,但速度较慢。'esbuild':使用 Esbuild 进行压缩,速度极快,但配置选项有限。false:禁用压缩。
2.12.8 build.emptyOutDir
- 类型:
boolean - 默认值:
true - 描述:在构建时清空
outDir目录。
2.12.9 build.rollupOptions
- 类型:
rollup.RollupOptions - 描述:直接配置底层 Rollup 打包器的选项。提供了对打包过程更细粒度的控制,例如配置多个入口、高级代码分割等。
- 示例 (配置多入口):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// vite.config.ts
import { defineConfig } from 'vite';
import { resolve } from 'path';
export default defineConfig({
build: {
rollupOptions: {
input: {
main: resolve(__dirname, 'index.html'),
admin: resolve(__dirname, 'admin.html'),
nested: resolve(__dirname, 'nested/index.html')
}
}
}
});
- 示例 (配置多入口):
2.13 preview
- 类型:
PreviewOptions - 描述:配置
vite preview命令的行为,用于在本地预览生产构建的文件。- 选项与
server类似,如preview.host、preview.port、preview.open等。
- 选项与
2.14 optimizeDeps
- 类型:
DepOptimizationOptions - 描述:配置依赖预构建行为。Vite 在开发服务器启动时会使用 Esbuild 对
node_modules中的依赖进行预构建 (Pre-bundling),将其转换为 ESM 格式,以加快浏览器加载速度并解决 CommonJS/UMD 兼容性问题。
2.14.1 optimizeDeps.include
- 类型:
string[] - 描述:强制包含在预构建中的依赖项。当某些库没有被自动检测到或需要手动优化时使用。
- 例如:
['lodash']。
- 例如:
2.14.2 optimizeDeps.exclude
- 类型:
string[] - 描述:从预构建中排除的依赖项。有时某些库不需要预构建或会引起问题。
- 例如:
['my-problematic-library']。
- 例如:
三、环境变量
Vite 通过 import.meta.env 暴露环境变量。
import.meta.env.MODE:当前模式 (development或production)。import.meta.env.BASE_URL:base配置项的值。import.meta.env.PROD:是否是生产环境 (boolean)。import.meta.env.DEV:是否是开发环境 (boolean)。
除了这些内置变量,你还可以通过 envDir 选项和 .env 文件来加载自定义环境变量。
envDir
- 类型:
string - 默认值:
process.cwd() - 描述:加载
.env文件的目录。
.env 文件
Vite 会根据当前模式加载相应的 .env 文件:
.env:所有模式加载。.env.local:所有模式加载,但会被.gitignore忽略,适用于本地环境特定配置。.env.[mode]:特定模式加载 (例如.env.development、.env.production)。.env.[mode].local:特定模式加载,且会被.gitignore忽略。
加载优先级 (从高到低):
.env.[mode].local.env.[mode].env.local.env
注意: 只有以 VITE_ 开头的自定义环境变量才会在客户端暴露。例如,在 .env 文件中定义 VITE_APP_TITLE=My App,然后在代码中可以通过 import.meta.env.VITE_APP_TITLE 访问。
1 | // .env.development |
四、总结
Vite 凭借其出色的性能和极佳的开发体验,已成为现代前端开发的主流构建工具之一。通过灵活的配置文件 vite.config.ts,开发者可以根据项目需求定制开发服务器、生产构建、模块解析、CSS 处理以及插件扩展等各个方面的行为。深入理解并合理配置这些选项,将能最大化地发挥 Vite 的优势,提升开发效率和应用性能。
