Vite 是一款由 Vue.js 作者尤雨溪开发的现代前端构建工具,它以其极速的开发服务器启动速度闪电般的模块热更新 (HMR) 而闻名。Vite 利用浏览器原生的 ES Modules (ESM) 能力,在开发环境下跳过了打包步骤,直接提供模块给浏览器,从而大幅提升了开发体验。在生产环境下,Vite 采用 Rollup 进行打包,兼顾了性能和优化。
本篇文档将深入探讨 Vite 的核心配置,帮助开发者充分利用 Vite 的能力。

核心思想:
Vite 的配置以 vite.config.ts (或 .js) 文件为中心,使用 ESM 模块导出配置对象。它通过 plugins 数组扩展功能,通过 server 配置开发服务器,build 配置生产构建,resolve 配置模块解析,以及 cssjson 等全局配置项,实现了高度可定制性和灵活性。


一、Vite 配置文件的基本结构

Vite 的配置文件通常命名为 vite.config.jsvite.config.ts,位于项目根目录。它是一个 ESM 模块,负责导出一个配置对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// vite.config.ts
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue'; // 引入 Vue 插件

// 使用 defineConfig 可以获得类型提示
export default defineConfig({
// 配置项
plugins: [vue()], // 添加 Vue 插件
server: {
port: 3000,
open: true
},
build: {
outDir: 'dist'
}
});

关键点:

  • defineConfig:虽然不是必需的,但强烈建议使用 defineConfig 函数来包裹配置对象。这提供了智能提示 (IntelliSense) 和类型检查,帮助避免配置错误。
  • ESM 模块:配置文件必须遵循 ES Modules 规范,使用 importexport 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
      10
      import { 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 文件注入变量
      }
      }
      }
      });

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.hostpreview.portpreview.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:当前模式 (developmentproduction)。
  • import.meta.env.BASE_URLbase 配置项的值。
  • 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 忽略。

加载优先级 (从高到低):

  1. .env.[mode].local
  2. .env.[mode]
  3. .env.local
  4. .env

注意: 只有以 VITE_ 开头的自定义环境变量才会在客户端暴露。例如,在 .env 文件中定义 VITE_APP_TITLE=My App,然后在代码中可以通过 import.meta.env.VITE_APP_TITLE 访问。

1
2
3
4
5
6
7
8
9
10
11
// .env.development
VITE_APP_TITLE=My Dev App
VITE_API_BASE_URL=/api_dev

// .env.production
VITE_APP_TITLE=My Production App
VITE_API_BASE_URL=/api_prod

// main.ts
console.log(import.meta.env.VITE_APP_TITLE);
console.log(import.meta.env.DEV); // true in dev, false in prod

四、总结

Vite 凭借其出色的性能和极佳的开发体验,已成为现代前端开发的主流构建工具之一。通过灵活的配置文件 vite.config.ts,开发者可以根据项目需求定制开发服务器、生产构建、模块解析、CSS 处理以及插件扩展等各个方面的行为。深入理解并合理配置这些选项,将能最大化地发挥 Vite 的优势,提升开发效率和应用性能。