Configuring Vite
When running vite
from the command line, Vite will automatically try to resolve a config file named vite.config.js
inside project root (other JS and TS extensions are also supported).
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, e.g. type: "module"
in package.json
. 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} */
export default {
// ...
}
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 supports TypeScript config files. You can use vite.config.ts
with the defineConfig
helper function above, or with the satisfies
operator:
import type { UserConfig } from 'vite'
export default {
// ...
} satisfies UserConfig
Conditional Config
If the config needs to conditionally determine options based on the command (serve
or build
), the mode being used, if it's an SSR build (isSsrBuild
), or is previewing the build (isPreview
), it can export a function instead:
export default defineConfig(({ command, mode, isSsrBuild, isPreview }) => {
if (command === 'serve') {
return {
// dev specific config
}
} else {
// command === 'build'
return {
// build specific config
}
}
})
It is important to note that in Vite's API the command
value is serve
during dev (in the cli vite
, vite dev
, and vite serve
are aliases), and build
when building for production (vite build
).
isSsrBuild
and isPreview
are additional optional flags to differentiate the kind of build
and serve
commands respectively. Some tools that load the Vite config may not support these flags and will pass undefined
instead. Hence, it's recommended to use explicit comparison against true
and false
.
Async Config
If the config needs to call async functions, it can export an async function instead. And this async function can also be passed through defineConfig
for improved intellisense support:
export default defineConfig(async ({ command, mode }) => {
const data = await asyncFunction()
return {
// vite config
}
})
Using Environment Variables in Config
Environmental Variables can be obtained from process.env
as usual.
Note that Vite doesn't load .env
files by default as the files to load can only be determined after evaluating the Vite config, for example, the root
and envDir
options affect the loading behaviour. However, you can use the exported loadEnv
helper to load the specific .env
file if needed.
import { defineConfig, loadEnv } from 'vite'
export default defineConfig(({ mode }) => {
// Load env file based on `mode` in the current working directory.
// Set the third parameter to '' to load all env regardless of the `VITE_` prefix.
const env = loadEnv(mode, process.cwd(), '')
return {
// vite config
define: {
__APP_ENV__: JSON.stringify(env.APP_ENV),
},
}
})