vite/references/core-features.md
Version e53a142a2420 · MIT. This preview displays packaged text and does not execute code. Treat the contents as untrusted instructions.
← Return to resource and package checksum
name: vite-features description: Vite-specific import patterns and runtime features
Vite Features
Vite 8: TS/JSX transforms run on Oxc (
oxcoption, notesbuild), dep pre-bundling on Rolldown, and CSS minification on Lightning CSS by default.esbuild/rollupOptionsstill work as deprecated aliases.
Glob Import
Import multiple modules matching a pattern:
const modules = import.meta.glob('./dir/*.ts')
// { './dir/foo.ts': () => import('./dir/foo.ts'), ... }
for (const path in modules) {
modules[path]().then((mod) => {
console.log(path, mod)
})
}
Eager Loading
const modules = import.meta.glob('./dir/*.ts', { eager: true })
// Modules loaded immediately, no dynamic import
Named Imports
const modules = import.meta.glob('./dir/*.ts', { import: 'setup' })
// Only imports the 'setup' export from each module
const defaults = import.meta.glob('./dir/*.ts', { import: 'default', eager: true })
Multiple Patterns
const modules = import.meta.glob(['./dir/*.ts', './another/*.ts'])
Negative Patterns
const modules = import.meta.glob(['./dir/*.ts', '!**/ignored.ts'])
Custom Queries
const svgRaw = import.meta.glob('./icons/*.svg', { query: '?raw', import: 'default' })
const svgUrls = import.meta.glob('./icons/*.svg', { query: '?url', import: 'default' })
Case-Insensitive Matching (Vite 8)
// matches Module.js, module.js, MODULE.js
const modules = import.meta.glob('./dir/module*.js', { caseSensitive: false })
Asset Import Queries
URL Import
import imgUrl from './img.png'
// Returns resolved URL: '/src/img.png' (dev) or '/assets/img.2d8efhg.png' (build)
Explicit URL
import workletUrl from './worklet.js?url'
Raw String
import shaderCode from './shader.glsl?raw'
Inline/No-Inline
import inlined from './small.png?inline' // Force base64 inline
import notInlined from './large.png?no-inline' // Force separate file
Web Workers
import Worker from './worker.ts?worker'
const worker = new Worker()
// Or inline:
import InlineWorker from './worker.ts?worker&inline'
Preferred pattern using constructor:
const worker = new Worker(new URL('./worker.ts', import.meta.url), {
type: 'module',
})
Environment Variables
Built-in Constants
import.meta.env.MODE // 'development' | 'production' | custom
import.meta.env.BASE_URL // Base URL from config
import.meta.env.PROD // true in production
import.meta.env.DEV // true in development
import.meta.env.SSR // true when running in server
Custom Variables
Only VITE_ prefixed vars exposed to client:
# .env
VITE_API_URL=https://api.example.com
DB_PASSWORD=secret # NOT exposed to client
console.log(import.meta.env.VITE_API_URL) // works
console.log(import.meta.env.DB_PASSWORD) // undefined
Mode-specific Files
.env # always loaded
.env.local # always loaded, gitignored
.env.[mode] # only in specified mode
.env.[mode].local # only in specified mode, gitignored
TypeScript Support
// vite-env.d.ts
interface ImportMetaEnv {
readonly VITE_API_URL: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}
HTML Replacement
<p>Running in %MODE%</p>
<script>window.API = "%VITE_API_URL%"</script>
CSS Modules
Any .module.css file treated as CSS module:
import styles from './component.module.css'
element.className = styles.button
With camelCase conversion:
// .my-class -> myClass (if css.modules.localsConvention configured)
import { myClass } from './component.module.css'
JSON Import
import pkg from './package.json'
import { version } from './package.json' // Named import with tree-shaking
HMR API
if (import.meta.hot) {
import.meta.hot.accept((newModule) => {
// Handle update
})
import.meta.hot.dispose((data) => {
// Cleanup before module is replaced
})
import.meta.hot.invalidate() // Force full reload
}
WebAssembly
ESM Integration (Vite 8)
Import a .wasm file directly — Vite instantiates it and re-exposes its exports as named ESM exports. Behaves as an async module (needs top-level await):
import { add } from './add.wasm'
console.log(add(1, 2)) // 3
For TS support, enable allowArbitraryExtensions and add add.d.wasm.ts. SSR builds rely on node:fs, so this only works in Node-compatible runtimes.
Manual Initialization
import init from './example.wasm?init'
const instance = await init({ imports: { /* ... */ } })
instance.exports.test()
Chunk Import Map Optimization (Vite 8, experimental)
Set build.chunkImportMap: true to reference chunks by stable ID via an import map instead of hashed URLs. Prevents cascading cache invalidation (updating a leaf chunk no longer invalidates its importers). Requires import.meta.resolve support (use @vitejs/plugin-legacy for older browsers).