--- name: unocss-vite-integration description: Setting up UnoCSS with Vite and framework-specific tips --- # UnoCSS Vite Integration The Vite plugin is the most common way to use UnoCSS. ## Installation ```bash pnpm add -D unocss ``` ```ts // vite.config.ts import UnoCSS from 'unocss/vite'; import { defineConfig } from 'vite'; export default defineConfig({ plugins: [UnoCSS()], }); ``` Create config file: ```ts // uno.config.ts import { defineConfig, presetWind3 } from 'unocss'; export default defineConfig({ presets: [presetWind3()], }); ``` Add to entry: ```ts // main.ts import 'virtual:uno.css'; ``` ## Modes ### global (default) Standard mode - generates global CSS injected via `uno.css` import. ```ts import 'virtual:uno.css'; ``` ### vue-scoped Injects generated CSS into Vue SFC `
...
`; ``` ### per-module (experimental) Generates CSS per module with optional scoping. ### dist-chunk (experimental) Generates CSS per chunk on build for MPA. ## DevTools Support Edit classes directly in browser DevTools: ```ts import 'virtual:uno.css'; import 'virtual:unocss-devtools'; ``` **Warning:** Uses MutationObserver to detect changes. Dynamic classes from scripts will also be included. ## Framework-Specific Setup ### React ```ts // vite.config.ts import React from '@vitejs/plugin-react'; import UnoCSS from 'unocss/vite'; export default { plugins: [ UnoCSS(), // Must be before React when using attributify React(), ], }; ``` **Note:** Remove `tsc` from build script if using `@unocss/preset-attributify`. ### Vue Works out of the box with `@vitejs/plugin-vue`. ### Svelte ```ts import { svelte } from '@sveltejs/vite-plugin-svelte'; import extractorSvelte from '@unocss/extractor-svelte'; import UnoCSS from 'unocss/vite'; export default { plugins: [ UnoCSS({ extractors: [extractorSvelte()], }), svelte(), ], }; ``` Supports `class:foo` and `class:foo={bar}` syntax. ### SvelteKit Same as Svelte, use `sveltekit()` from `@sveltejs/kit/vite`. ### Solid ```ts import UnoCSS from 'unocss/vite'; import solidPlugin from 'vite-plugin-solid'; export default { plugins: [UnoCSS(), solidPlugin()], }; ``` ### Preact ```ts import Preact from '@preact/preset-vite'; import UnoCSS from 'unocss/vite'; export default { plugins: [UnoCSS(), Preact()], }; ``` ### Elm ```ts import Elm from 'vite-plugin-elm'; import UnoCSS from 'unocss/vite'; export default { plugins: [Elm(), UnoCSS()], }; ``` ### Web Components (Lit) ```ts UnoCSS({ mode: 'shadow-dom', shortcuts: [{ 'cool-blue': 'bg-blue-500 text-white' }], }); ``` ```ts // my-element.ts @customElement('my-element') export class MyElement extends LitElement { static styles = css` :host { ... } @unocss-placeholder `; } ``` Supports `part-[]:` for `::part` styling. ## Inspector Visit `http://localhost:5173/__unocss` in dev mode to: - Inspect generated CSS rules - See applied classes per file - Test utilities in REPL ## Legacy Browser Support With `@vitejs/plugin-legacy`: ```ts import legacy from '@vitejs/plugin-legacy'; import UnoCSS from 'unocss/vite'; export default { plugins: [ UnoCSS({ legacy: { renderModernChunks: false, }, }), legacy({ targets: ['defaults', 'not IE 11'], renderModernChunks: false, }), ], }; ``` ## VanillaJS / TypeScript By default, `.js` and `.ts` files are not extracted. Configure to include: ```ts // uno.config.ts export default defineConfig({ content: { pipeline: { include: [/\.(vue|svelte|[jt]sx|html)($|\?)/, 'src/**/*.{js,ts}'], }, }, }); ``` Or use magic comment in files: ```ts // @unocss-include export const classes = { active: 'bg-primary text-white', }; ```