Skip to main content
Aero is configured through the aero() Vite plugin. For larger projects, you can move Aero options into a dedicated aero.config.ts.

The Vite plugin

Add aero() to vite.config.ts:
vite.config.ts
import { defineConfig } from 'vite'
import { aero } from '@aero-js/vite'

export default defineConfig({
	plugins: [aero()],
})

Plugin options

OptionTypeDescription
contentboolean | objectEnable content collections. Default false.
serverbooleanEnable Nitro for API routes. Default false.
sitestring | objectCanonical site URL. Exposed as import.meta.env.SITE and Aero.site.
redirectsArray<{ from, to, status? }>Path redirects for dev and production.
middlewareArrayDev-only request handlers.
dirsobjectOverride client, server, and dist directory names.
apiPrefixstringURL prefix for API routes. Default '/api'.
vite.config.ts
import { defineConfig } from 'vite'
import { aero } from '@aero-js/vite'

export default defineConfig({
	plugins: [
		aero({
			site: 'https://example.com',
			content: true,
			server: true,
		}),
	],
})

Dedicated aero.config.ts

For projects with more complex configuration, use @aero-js/config to keep Aero options separate from Vite:
aero.config.ts
import { defineConfig } from '@aero-js/config'

export default defineConfig({
	site: { url: 'https://example.com' },
	content: true,
	server: true,
})
vite.config.ts
import { createViteConfig } from '@aero-js/config/vite'

export default createViteConfig()
createViteConfig() with no arguments auto-loads aero.config.ts from the project root.

Env-aware config

Pass a function to defineConfig() to vary options by mode:
aero.config.ts
import { defineConfig } from '@aero-js/config'

export default defineConfig(env => ({
	site: env.mode === 'production' ? 'https://example.com' : 'http://localhost:5173',
	content: true,
	server: true,
}))

Path aliases

Aero injects default path aliases so imports work without tsconfig.json configuration:
AliasResolves to
@components/*client/components/*
@layouts/*client/layouts/*
@pages/*client/pages/*
@content/*content/*
@styles/*client/assets/styles/*
@scripts/*client/assets/scripts/*
@images/*client/assets/images/*
<script is:build>
	import base from '@layouts/base'
	import header from '@components/header'
</script>

<link rel="stylesheet" href="@styles/global.css" />
Add custom aliases in tsconfig.json under compilerOptions.paths. They merge with the defaults.

Environment variables

Aero uses Vite’s environment variable system. Variables in .env files are available in build scripts by default. Prefix with VITE_ to expose them to client scripts:
PrefixAvailable in
(none)Build scripts and server only
VITE_Build scripts and client scripts
.env
API_SECRET=xxx
VITE_PUBLIC_API=https://api.example.com
<script is:build>
	const secret = import.meta.env.API_SECRET
	const publicApi = import.meta.env.VITE_PUBLIC_API
</script>
Vite loads .env, .env.local, .env.[mode], and .env.[mode].local in order. Shell variables override file values.