Skip to content

Plugin Vite

Le plugin Vite est fourni avec le package unocss.

Installation

bash
pnpm add -D unocss
bash
yarn add -D unocss
bash
npm install -D unocss
bash
bun add -D unocss

Installez le plugin :

ts
import UnoCSS from 'unocss/vite'
import { defineConfig } from 'vite'

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

Créez un fichier uno.config.ts :

ts
import { defineConfig } from 'unocss'

export default defineConfig({
  // ...options UnoCSS
})

Ajoutez virtual:uno.css à votre point d'entrée principal :

ts
import 'virtual:uno.css'

Modes

Le plugin Vite propose plusieurs modes qui activent différents comportements.

global (par défaut)

C'est le mode par défaut du plugin : dans ce mode, vous devez importer uno.css dans votre point d'entrée.

Ce mode active un ensemble de plugins Vite pour la build et pour le dev avec support HMR.

Le css généré sera une feuille de style globale injectée dans le index.html.

vue-scoped

Ce mode injecte le CSS généré dans les <style scoped> des SFC Vue pour l'isolation.

svelte-scoped

Le mode svelte-scoped a été déplacé dans son propre package, voir @unocss/svelte-scoped/vite.

shadow-dom

Comme les Web Components utilisent le Shadow DOM, il n'est pas possible de styliser le contenu directement depuis une feuille de style globale (sauf si vous utilisez des CSS custom properties, qui pénètrent le Shadow DOM). Vous devez inclure le CSS généré par le plugin dans le style du Shadow DOM.

Pour inclure le CSS généré, il suffit de configurer le mode du plugin sur shadow-dom et d'inclure le placeholder magique @unocss-placeholder dans chaque bloc CSS de style de composant web. Si vous définissez vos Web Components dans des SFC Vue et souhaitez définir des styles personnalisés avec UnoCSS, vous pouvez entourer le placeholder d'un commentaire CSS pour éviter les erreurs de syntaxe dans votre IDE.

per-module (expérimental)

Ce mode génère une feuille CSS pour chaque module, peut être scoped.

dist-chunk (expérimental)

Ce mode génère une feuille CSS pour chaque chunk de code lors de la build, idéal pour les MPA.

Modifier les classes dans DevTools

En raison de la limitation du mode "on-demand" où les DevTools ne connaissent pas les classes que vous n'avez pas encore utilisées dans votre code source, si vous souhaitez tester en modifiant directement les classes dans DevTools, ajoutez simplement les lignes suivantes à votre point d'entrée principal.

ts
import 'uno.css'
import 'virtual:unocss-devtools'

WARNING

À utiliser avec précaution : en interne, nous utilisons MutationObserver pour détecter les changements de classe. Cela signifie que non seulement vos modifications manuelles mais aussi celles faites par vos scripts seront détectées et incluses dans la feuille de style. Cela peut entraîner des différences entre le développement et la build de production si vous ajoutez des classes dynamiques via des scripts. Nous recommandons d'ajouter vos parties dynamiques à la safelist ou de mettre en place des tests de régression UI pour votre build de production si possible.

Frameworks

Certains frameworks UI/App nécessitent des ajustements pour fonctionner correctement. Si vous utilisez l'un des frameworks suivants, appliquez simplement les suggestions.

VanillaJS / TypeScript

Lorsque vous utilisez VanillaJS ou TypeScript, vous devez ajouter les extensions de fichiers js et ts pour permettre à UnoCSS de lire et d'analyser le contenu. Par défaut, les fichiers js et ts sont exclus, consultez la section Extraction depuis la pipeline des outils de build.

React

Si vous utilisez @vitejs/plugin-react :

ts
import React from '@vitejs/plugin-react'
import UnoCSS from 'unocss/vite'

export default {
  plugins: [
    React(),
    UnoCSS(),
  ],
}

Si vous utilisez @unocss/preset-attributify, vous devez retirer tsc du script build.

Si vous utilisez @vitejs/plugin-react avec @unocss/preset-attributify, vous devez ajouter le plugin avant @vitejs/plugin-react.

ts
import React from '@vitejs/plugin-react'
import UnoCSS from 'unocss/vite'

export default {
  plugins: [
    UnoCSS(),
    React(),
  ],
}

Vous pouvez trouver un projet exemple React utilisant les deux plugins dans le dossier examples/vite-react, consultez les scripts dans package.json et le fichier de config Vite.

Preact

Si vous utilisez @preact/preset-vite :

ts
// vite.config.js
import Preact from '@preact/preset-vite'
import UnoCSS from 'unocss/vite'

export default {
  plugins: [
    UnoCSS(),
    Preact(),
  ],
}

Ou si vous utilisez @prefresh/vite :

ts
// vite.config.js
import Prefresh from '@prefresh/vite'
import UnoCSS from 'unocss/vite'

export default {
  plugins: [
    UnoCSS(),
    Prefresh(),
  ],
}

Si vous utilisez @unocss/preset-attributify, vous devez retirer tsc du script build.

Vous pouvez trouver un projet exemple Preact utilisant les deux plugins dans le dossier examples/vite-preact, consultez les scripts dans package.json et le fichier de config Vite.

Svelte

Le plugin doit être ajouté avant @sveltejs/vite-plugin-svelte.

Pour supporter class:foo et class:foo={bar}, ajoutez le plugin et configurez extractorSvelte dans l'option extractors.

Vous pouvez utiliser des règles simples pour class: comme class:bg-red-500={foo} ou utiliser des shortcuts contenant plusieurs règles, voir src/App.svelte dans le projet exemple ci-dessous.

ts
// vite.config.js
import { svelte } from '@sveltejs/vite-plugin-svelte'
import extractorSvelte from '@unocss/extractor-svelte'
import UnoCSS from 'unocss/vite'

export default {
  plugins: [
    UnoCSS({
      extractors: [
        extractorSvelte(),
      ],
      /* plus d'options */
    }),
    svelte(),
  ],
}

Sveltekit

Pour supporter class:foo et class:foo={bar}, ajoutez le plugin et configurez extractorSvelte dans l'option extractors.

Vous pouvez utiliser des règles simples pour class: comme class:bg-red-500={foo} ou utiliser des shortcuts contenant plusieurs règles, voir src/routes/+layout.svelte dans le projet exemple ci-dessous.

ts
// vite.config.js
import { sveltekit } from '@sveltejs/kit/vite'
import extractorSvelte from '@unocss/extractor-svelte'
import UnoCSS from 'unocss/vite'

/** @type {import('vite').UserConfig} */
const config = {
  plugins: [
    UnoCSS({
      extractors: [
        extractorSvelte(),
      ],
      /* plus d'options */
    }),
    sveltekit(),
  ],
}

Web Components

Pour utiliser UnoCSS avec les web components, vous devez activer le mode shadow-dom sur le plugin.

N'oubliez pas de retirer l'import de uno.css car le mode shadow-dom ne l'exposera pas et l'application ne fonctionnera pas.

ts
import UnoCSS from 'unocss/vite'

export default {
  plugins: [
    UnoCSS({
      mode: 'shadow-dom',
      /* plus d'options */
    }),
  ],
}

Dans chaque web component, ajoutez simplement @unocss-placeholder dans le bloc CSS du style :

ts
const template = document.createElement('template')
template.innerHTML = `
<style>
:host {...}
@unocss-placeholder
</style>
<div class="m-1em">
...
</div>
`

Si vous utilisez Lit :

ts
@customElement('my-element')
export class MyElement extends LitElement {
  static styles = css`
    :host {...}
    @unocss-placeholder
  `
  // ...
}

Vous trouverez un projet exemple Web Components dans le dossier examples/vite-lit.

Support intégré de ::part

Vous pouvez utiliser ::part car le plugin le prend en charge via les shortcuts et la règle part-[<part-name>]:<rule|shortcut> du preset-mini, par exemple en l'utilisant avec des règles simples comme part-[<part-name>]:bg-green-500 ou avec un shortcut : voir src/my-element.ts dans le projet exemple ci-dessous.

La règle part-[<part-name>]:<rule|shortcut> ne fonctionne qu'avec ce plugin en mode shadow-dom.

Le plugin utilise nth-of-type pour éviter les collisions avec plusieurs parts dans le même web component et pour les mêmes parts sur différents web components, vous n'avez pas à vous en soucier, le plugin s'en charge pour vous.

ts
// vite.config.js
import UnoCSS from 'unocss/vite'

export default {
  plugins: [
    UnoCSS({
      mode: 'shadow-dom',
      shortcuts: [
        { 'cool-blue': 'bg-blue-500 text-white' },
        { 'cool-green': 'bg-green-500 text-black' },
      ],
      /* plus d'options */
    }),
  ],
}

puis dans vos web components :

ts
// my-container-wc.ts
const template = document.createElement('template')
template.innerHTML = `
<style>
@unocss-placeholder
</style>
<my-wc-with-parts class="part-[cool-part]:cool-blue part-[another-cool-part]:cool-green">...</my-wc-with-parts>
`
ts
// my-wc-with-parts.ts
const template = document.createElement('template')
template.innerHTML = `
<style>
@unocss-placeholder
</style>
<div>
  <div part="cool-part">...</div>
  <div part="another-cool-part">...</div>
</div>
`

Solid

Vous devez ajouter le plugin vite-plugin-solid après le plugin UnoCSS.

ts
// vite.config.js
import UnoCSS from 'unocss/vite'
import solidPlugin from 'vite-plugin-solid'

export default {
  plugins: [
    UnoCSS({
      /* options */
    }),
    solidPlugin(),
  ],
}

Vous trouverez un projet exemple Solid dans le dossier examples/vite-solid.

Elm

Vous devez ajouter le plugin vite-plugin-elm avant le plugin UnoCSS.

ts
// vite.config.js
import UnoCSS from 'unocss/vite'
import { defineConfig } from 'vite'
import Elm from 'vite-plugin-elm'

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

Vous trouverez un projet exemple Elm dans le dossier examples/vite-elm.

Exemples

Exemple de base

Vous trouverez un projet exemple Vite de base dans le dossier examples/vite-basic.

Exemples de frameworks

Nous fournissons des projets exemples pour différents frameworks :

Performance

Released under the MIT License.