Configuring Vite

Config File

Config File Resolving

When running vite from the command line, Vite will automatically try to resolve a config file named vite.config.js inside project root.

The most basic config file looks like this:

// vite.config.js
export default {
  // config options

Note Vite supports using ES modules syntax in the config file even if the project is not using native Node ESM via type: "module". In this case, the config file is auto pre-processed before load.

You can also explicitly specify a config file to use with the --config CLI option (resolved relative to cwd):

vite --config my-config.js

Config Intellisense

Since Vite ships with TypeScript typings, you can leverage your IDE's intellisense with jsdoc type hints:

 * @type {import('vite').UserConfig}
const config = {
  // ...

export default config

Alternatively, you can use the defineConfig helper which should provide intellisense without the need for jsdoc annotations:

import { defineConfig } from 'vite'

export default defineConfig({
  // ...

Vite also directly supports TS config files. You can use vite.config.ts with the defineConfig helper as well.

Conditional Config

If the config needs to conditional determine options based on the command (serve or build) or the mode being used, it can export a function instead:

export default defineConfig(({ command, mode }) => {
  if (command === 'serve') {
    return {
      // serve specific config
  } else {
    return {
      // build specific config

Async Config

If the config needs to call async function, it can export a async function instead:

export default defineConfig(async ({ command, mode }) => {
  const data = await asyncFunction()
  return {
    // build specific config

Shared Options


  • Type: string

  • Default: process.cwd()

    Project root directory (where index.html is located). Can be an absolute path, or a path relative to the location of the config file itself.

    See Project Root for more details.


  • Type: string

  • Default: /

    Base public path when served in development or production. Valid values include:

    • Absolute URL pathname, e.g. /foo/
    • Full URL, e.g.
    • Empty string or ./ (for embedded deployment)

    See Public Base Path for more details.


  • Type: string

  • Default: 'development' for serve, 'production' for build

    Specifying this in config will override the default mode for both serve and build. This value can also be overridden via the command line --mode option.

    See Env Variables and Modes for more details.


  • Type: Record<string, string>

    Define global constant replacements. Entries will be defined as globals during dev and statically replaced during build.

    • Starting from 2.0.0-beta.70, string values will be used as raw expressions, so if defining a string constant, it needs to be explicitly quoted (e.g. with JSON.stringify).

    • Replacements are performed only when the match is surrounded by word boundaries (\b).

    Because it's implemented as straightforward text replacements without any syntax analysis, we recommend using define for CONSTANTS only.

    For example, process.env.FOO and __APP_VERSION__ are good fits. But process or global should not be put into this option. Variables can be shimmed or polyfilled instead.


  • Type: (Plugin | Plugin[])[]

    Array of plugins to use. Falsy plugins are ignored and arrays of plugins are flattened. See Plugin API for more details on Vite plugins.


  • Type: string | false

  • Default: "public"

    Directory to serve as plain static assets. Files in this directory are served at / during dev and copied to the root of outDir during build, and are always served or copied as-is without transform. The value can be either an absolute file system path or a path relative to project root.

    Defining publicDir as false disables this feature.

    See The public Directory for more details.


  • Type: string

  • Default: "node_modules/.vite"

    Directory to save cache files. Files in this directory are pre-bundled deps or some other cache files generated by vite, which can improve the performance. You can use --force flag or manually delete the directory to regenerate the cache files. The value can be either an absolute file system path or a path relative to project root.


  • Type:Record<string, string> | Array<{ find: string | RegExp, replacement: string }>

    Will be passed to @rollup/plugin-alias as its entries option. Can either be an object, or an array of { find, replacement } pairs.

    When aliasing to file system paths, always use absolute paths. Relative alias values will be used as-is and will not be resolved into file system paths.

    More advanced custom resolution can be achieved through plugins.


  • Type: string[]

    If you have duplicated copies of the same dependency in your app (likely due to hoisting or linked packages in monorepos), use this option to force Vite to always resolve listed dependencies to the same copy (from project root).


  • Type: string[]

    Additional allowed conditions when resolving Conditional Exports from a package.

    A package with conditional exports may have the following exports field in its package.json:

      "exports": {
        ".": {
          "import": "./index.esm.js",
          "require": "./index.cjs.js"

    Here, import and require are "conditions". Conditions can be nested and should be specified from most specific to least specific.

    Vite has a list of "allowed conditions" and will match the first condition that is in the allowed list. The default allowed conditions are: import, module, browser, default, and production/development based on current mode. The resolve.conditions config option allows specifying additional allowed conditions.


  • Type: string[]

  • Default: ['module', 'jsnext:main', 'jsnext']

    List of fields in package.json to try when resolving a package's entry point. Note this takes lower precedence than conditional exports resolved from the exports field: if an entry point is successfully resolved from exports, the main field will be ignored.


  • Type: string[]

  • Default: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json']

    List of file extensions to try for imports that omit extensions. Note it is NOT recommended to omit extensions for custom import types (e.g. .vue) since it can interfere with IDE and type support.

  • Type: boolean

  • Default: false

    Enabling this setting causes vite to determine file identity by the original file path (i.e. the path without following symlinks) instead of the real file path (i.e. the path after following symlinks).

  • Related: esbuild#preserve-symlinks, webpack#resolve.symlinks


  • Type:

    interface CSSModulesOptions {
      scopeBehaviour?: 'global' | 'local'
      globalModulePaths?: RegExp[]
        | string
        | ((name: string, filename: string, css: string) => string)
      hashPrefix?: string
       * default: 'camelCaseOnly'
      localsConvention?: 'camelCase' | 'camelCaseOnly' | 'dashes' | 'dashesOnly'

    Configure CSS modules behavior. The options are passed on to postcss-modules.


  • Type: string | (postcss.ProcessOptions & { plugins?: postcss.Plugin[] })

    Inline PostCSS config (expects the same format as postcss.config.js), or a custom path to search PostCSS config from (default is project root). The search is done using postcss-load-config.

    Note if an inline config is provided, Vite will not search for other PostCSS config sources.


  • Type: Record<string, object>

    Specify options to pass to CSS pre-processors. Example:

    export default defineConfig({
      css: {
        preprocessorOptions: {
          scss: {
            additionalData: `$injectedColor: orange;`


  • Type: boolean

  • Default: true

    Whether to support named imports from .json files.


  • Type: boolean

  • Default: false

    If set to true, imported JSON will be transformed into export default JSON.parse("...") which is significantly more performant than Object literals, especially when the JSON file is large.

    Enabling this disables named imports.


  • Type: ESBuildOptions | false

    ESBuildOptions extends ESbuild's own transform options. The most common use case is customizing JSX:

    export default defineConfig({
      esbuild: {
        jsxFactory: 'h',
        jsxFragment: 'Fragment'

    By default, ESBuild is applied to ts, jsx and tsx files. You can customize this with esbuild.include and esbuild.exclude, both of which expect type of string | RegExp | (string | RegExp)[].

    In addition, you can also use esbuild.jsxInject to automatically inject JSX helper imports for every file transformed by ESBuild:

    export default defineConfig({
      esbuild: {
        jsxInject: `import React from 'react'`

    Set to false to disable ESbuild transforms.


  • Type: string | RegExp | (string | RegExp)[]

  • Related: Static Asset Handling

    Specify additional picomatch patterns to be treated as static assets so that:

    • They will be excluded from the plugin transform pipeline when referenced from HTML or directly requested over fetch or XHR.

    • Importing them from JS will return their resolved URL string (this can be overwritten if you have a enforce: 'pre' plugin to handle the asset type differently).

    The built-in asset type list can be found here.


    export default defineConfig({
      assetsInclude: ['**/*.gltf']


  • Type: 'info' | 'warn' | 'error' | 'silent'

    Adjust console output verbosity. Default is 'info'.


  • Type: boolean

  • Default: true

    Set to false to prevent Vite from clearing the terminal screen when logging certain messages. Via command line, use --clearScreen false.


  • Type: string

  • Default: root

    The directory from which .env files are loaded. Can be an absolute path, or a path relative to the project root.

    See here for more about environment files.


  • Type: string | string[]

  • Default: VITE_

    Env variables starts with envPrefix will be exposed to your client source code via import.meta.env.


  • envPrefix should not be set as '', which will expose all your env variables and cause unexpected leaking of of sensitive information. Vite will throw error when detecting ''.

Server Options

  • Type: string

  • Default: ''

    Specify which IP addresses the server should listen on. Set this to to listen on all addresses, including LAN and public addresses.

    This can be set via the CLI using --host or --host.


  • Type: number

    Specify server port. Note if the port is already being used, Vite will automatically try the next available port so this may not be the actual port the server ends up listening on.


  • Type: boolean

    Set to true to exit if port is already in use, instead of automatically try the next available port.


  • Type: boolean | https.ServerOptions

    Enable TLS + HTTP/2. Note this downgrades to TLS only when the server.proxy option is also used.

    The value can also be an options object passed to https.createServer().

  • Type: boolean | string

    Automatically open the app in the browser on server start. When the value is a string, it will be used as the URL's pathname. If you want to open the server in a specific browser you like, you can set the env process.env.BROWSER (e.g. firefox). See the open package for more details.


    export default defineConfig({
      server: {
        open: '/docs/index.html'


  • Type: Record<string, string | ProxyOptions>

    Configure custom proxy rules for the dev server. Expects an object of { key: options } pairs. If the key starts with ^, it will be interpreted as a RegExp. The configure option can be used to access the proxy instance.

    Uses http-proxy. Full options here.


    export default defineConfig({
      server: {
        proxy: {
          // string shorthand
          '/foo': 'http://localhost:4567',
          // with options
          '/api': {
            target: '',
            changeOrigin: true,
            rewrite: (path) => path.replace(/^\/api/, '')
          // with RegEx
          '^/fallback/.*': {
            target: '',
            changeOrigin: true,
            rewrite: (path) => path.replace(/^\/fallback/, '')
          // Using the proxy instance
          '/api': {
            target: '',
            changeOrigin: true,
            configure: (proxy, options) => {
              // proxy will be an instance of 'http-proxy'


  • Type: boolean | CorsOptions

    Configure CORS for the dev server. This is enabled by default and allows any origin. Pass an options object to fine tune the behavior or false to disable.



  • Type: boolean | { protocol?: string, host?: string, port?: number, path?: string, timeout?: number, overlay?: boolean, clientPort?: number, server?: Server }

    Disable or configure HMR connection (in cases where the HMR websocket must use a different address from the http server).

    Set server.hmr.overlay to false to disable the server error overlay.

    clientPort is an advanced option that overrides the port only on the client side, allowing you to serve the websocket on a different port than the client code looks for it on. Useful if you're using an SSL proxy in front of your dev server.

    When using server.middlewareMode and server.https, setting server.hmr.server to your HTTPS server will process HMR secure connection requests through your server. This can be helpful when using self-signed certificates.

  • Type: object

    File system watcher options to pass on to chokidar.

    When running Vite on Windows Subsystem for Linux (WSL) 2, if the project folder resides in a Windows filesystem, you'll need to set this option to { usePolling: true }. This is due to a WSL2 limitation with the Windows filesystem.


  • Type: 'ssr' | 'html'

    Create Vite server in middleware mode. (without a HTTP server)

    • 'ssr' will disable Vite's own HTML serving logic so that you should serve index.html manually.
    • 'html' will enable Vite's own HTML serving logic.
  • Related: SSR - Setting Up the Dev Server

  • Example:

const express = require('express')
const { createServer: createViteServer } = require('vite')

async function createServer() {
  const app = express()

  // Create Vite server in middleware mode.
  const vite = await createViteServer({
    server: { middlewareMode: 'ssr' }
  // Use vite's connect instance as middleware

  app.use('*', async (req, res) => {
    // If `middlewareMode` is `'ssr'`, should serve `index.html` here.
    // If `middlewareMode` is `'html'`, there is no need to serve `index.html`
    // because Vite will do that.



  • Experimental

  • Type: boolean

  • Default: false (will change to true in future versions)

    Restrict serving files outside of workspace root.


  • Experimental

  • Type: string[]

    Restrict files that could be served via /@fs/. When server.fs.strict is set to true, accessing files outside this directory list will result in a 403.

    Vite will search for the root of the potential workspace and use it as default. A valid workspace met the following conditions, otherwise will fallback to the project root.

    • contains workspaces field in package.json
    • contains one of the following file
      • pnpm-workspace.yaml

    Accepts a path to specify the custom workspace root. Could be a absolute path or a path relative to project root. For example

    export default defineConfig({
      server: {
        fs: {
          // Allow serving files from one level up to the project root
          allow: ['..']

Build Options

  • Type: string | string[]

  • Default: 'modules'

  • Related: Browser Compatibility

    Browser compatibility target for the final bundle. The default value is a Vite special value, 'modules', which targets browsers with native ES module support.

    Another special value is 'esnext' - which assumes native dynamic imports support and will transpile as little as possible:

    • If the build.minify option is 'terser' (the default), 'esnext' will be forced down to 'es2019'.
    • In other cases, it will perform no transpilation at all.

    The transform is performed with esbuild and the value should be a valid esbuild target option. Custom targets can either be a ES version (e.g. es2015), a browser with version (e.g. chrome58), or an array of multiple target strings.

    Note the build will fail if the code contains features that cannot be safely transpiled by esbuild. See esbuild docs for more details.


  • Type: boolean

  • Default: true

    Whether to automatically inject module preload polyfill.

    If set to true, the polyfill is auto injected into the proxy module of each index.html entry. If the build is configured to use a non-html custom entry via build.rollupOptions.input, then it is necessary to manually import the polyfill in your custom entry:

    import 'vite/modulepreload-polyfill'

    Note: the polyfill does not apply to Library Mode. If you need to support browsers without native dynamic import, you should probably avoid using it in your library.


  • Type: string

  • Default: dist

    Specify the output directory (relative to project root).


  • Type: string

  • Default: assets

    Specify the directory to nest generated assets under (relative to build.outDir).


  • Type: number

  • Default: 4096 (4kb)

    Imported or referenced assets that are smaller than this threshold will be inlined as base64 URLs to avoid extra http requests. Set to 0 to disable inlining altogether.


    If you specify build.lib, build.assetsInlineLimit will be ignored and assets will always be inlined, regardless of file size.


  • Type: boolean

  • Default: true

    Enable/disable CSS code splitting. When enabled, CSS imported in async chunks will be inlined into the async chunk itself and inserted when the chunk is loaded.

    If disabled, all CSS in the entire project will be extracted into a single CSS file.


  • Type: boolean | 'inline' | 'hidden'

  • Default: false

    Generate production source maps. If true, a separate sourcemap file will be created. If 'inline', the sourcemap will be appended to the resulting output file as a data URI. 'hidden' works like true except that the corresponding sourcemap comments in the bundled files are suppressed.


  • Type: RollupOptions

    Directly customize the underlying Rollup bundle. This is the same as options that can be exported from a Rollup config file and will be merged with Vite's internal Rollup options. See Rollup options docs for more details.




  • Type: { entry: string, name?: string, formats?: ('es' | 'cjs' | 'umd' | 'iife')[], fileName?: string | ((format: ModuleFormat) => string) }

  • Related: Library Mode

    Build as a library. entry is required since the library cannot use HTML as entry. name is the exposed global variable and is required when formats includes 'umd' or 'iife'. Default formats are ['es', 'umd']. fileName is the name of the package file output, default fileName is the name option of package.json, it can also be defined as function taking the format as an argument.


  • Type: boolean

  • Default: false

  • Related: Backend Integration

    When set to true, the build will also generate a manifest.json file that contains a mapping of non-hashed asset filenames to their hashed versions, which can then be used by a server framework to render the correct asset links.


  • Type: boolean

  • Default: false

  • Related: Server-Side Rendering

    When set to true, the build will also generate a SSR manifest for determining style links and asset preload directives in production.


  • Type: boolean | 'terser' | 'esbuild'

  • Default: 'terser'

    Set to false to disable minification, or specify the minifier to use. The default is Terser which is slower but produces smaller bundles in most cases. Esbuild minification is significantly faster but will result in slightly larger bundles.



  • Type: boolean

  • Default: true

    Set to false to disable writing the bundle to disk. This is mostly used in programmatic build() calls where further post processing of the bundle is needed before writing to disk.


  • Type: boolean

  • Default: true if outDir is inside root

    By default, Vite will empty the outDir on build if it is inside project root. It will emit a warning if outDir is outside of root to avoid accidentially removing important files. You can explicitly set this option to suppress the warning. This is also available via command line as --emptyOutDir.


  • Type: boolean

  • Default: true

    Enable/disable brotli-compressed size reporting. Compressing large output files can be slow, so disabling this may increase build performance for large projects.


  • Type: number

  • Default: 500

    Limit for chunk size warnings (in kbs).

  • Type: WatcherOptions| null

  • Default: null

    Set to {} to enable rollup watcher. This is mostly used in cases that involve build-only plugins or integrations processes.

Dep Optimization Options


  • Type: string | string[]

    By default, Vite will crawl your index.html to detect dependencies that need to be pre-bundled. If build.rollupOptions.input is specified, Vite will crawl those entry points instead.

    If neither of these fit your needs, you can specify custom entries using this option - the value should be a fast-glob pattern or array of patterns that are relative from Vite project root. This will overwrite default entries inference.


  • Type: string[]

    Dependencies to exclude from pre-bundling.


    CommonJS dependencies should not be excluded from optimization. If an ESM dependency is excluded from optimization, but has a nested CommonJS dependency, the CommonJS dependency should be added to optimizeDeps.include. Example:

    export default defineConfig({
      optimizeDeps: {
        include: ['esm-dep > cjs-dep']


  • Type: string[]

    By default, linked packages not inside node_modules are not pre-bundled. Use this option to force a linked package to be pre-bundled.


  • Type: boolean

  • Default: false

    The bundler sometimes needs to rename symbols to avoid collisions. Set this to true to keep the name property on functions and classes. See keepNames.

SSR Options


SSR options may be adjusted in minor releases.


  • Type: string[]

    Force externalize dependencies for SSR.


  • Type: string | RegExp | (string | RegExp)[] | true

    Prevent listed dependencies from being externalized for SSR. If true, no dependencies are externalized.

  • Type: 'node' | 'webworker'

  • Default: node

    Build target for the SSR server.