Skip to content

Plugin Vite

O plugin Vite é fornecido com o pacote unocss.

Instalação

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

Instale o plugin:

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

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

Crie um arquivo uno.config.ts:

ts
import { defineConfig } from 'unocss'

export default defineConfig({
  // ...opções do UnoCSS
})

Adicione virtual:uno.css ao seu ponto de entrada:

ts
import 'virtual:uno.css'

Modos

O plugin Vite vem com um conjunto de modos que habilitam diferentes comportamentos.

global (padrão)

Este é o modo padrão do plugin: neste modo, você precisa adicionar a importação de uno.css no seu ponto de entrada.

Este modo habilita um conjunto de plugins Vite para build e para dev com suporte a HMR.

O css gerado será uma folha de estilo global injetada no index.html.

vue-scoped

Este modo irá injetar o CSS gerado nos <style scoped> dos Vue SFCs para isolamento.

svelte-scoped

O modo svelte-scoped foi movido para seu próprio pacote, consulte @unocss/svelte-scoped/vite.

shadow-dom

Como os Web Components usam Shadow DOM, não há como estilizar o conteúdo diretamente a partir de uma folha de estilo global (a menos que você use propriedades CSS personalizadas, que penetrarão o Shadow DOM), você precisa inserir o CSS gerado pelo plugin no estilo do Shadow DOM.

Para inserir o CSS gerado, você só precisa configurar o modo do plugin para shadow-dom e incluir o espaço reservado mágico @unocss-placeholder em cada bloco de estilo CSS do componente web. Se você estiver definindo seus Web Components em Vue SFCs e quiser definir estilos personalizados junto com o UnoCSS, pode envolver o espaço reservado em um comentário CSS para evitar erros de sintaxe em seu IDE.

per-module (experimental)

Este modo irá gerar uma folha de estilo CSS para cada módulo, podendo ser com escopo.

dist-chunk (experimental)

Este modo irá gerar uma folha de estilo CSS para cada fragmento de código na compilação, ótimo para MPA.

Editar classes no DevTools

Devido à limitação do "sob demanda", onde o DevTools não conhece aquelas que você ainda não usou em seu código-fonte. Então, se você quiser experimentar como as coisas funcionam alterando diretamente as classes no DevTools, basta adicionar as seguintes linhas ao seu ponto de entrada.

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

WARNING

Use com cautela, nos bastidores usamos MutationObserver para detectar as mudanças de classe. Isso significa que não apenas suas alterações manuais, mas também as alterações feitas por seus scripts serão detectadas e incluídas na folha de estilo. Isso pode causar algum desalinhamento entre o desenvolvimento e a compilação de produção quando você adiciona classes dinâmicas com base em alguma lógica em tags de script. Recomendamos adicionar suas partes dinâmicas à lista de segurança ou configurar testes de regressão de UI para sua compilação de produção, se possível.

Frameworks

Some UI/App frameworks have some caveats that must be fixed to make it work, if you're using one of the following frameworks, just apply the suggestions.

VanillaJS / TypeScript

When using VanillaJS or TypeScript, you need to add js and ts files extensions to allow UnoCSS read and parse the content, by default js and ts files are excluded, check out the Extracting from Build Tools Pipeline section.

React

If you're using @vitejs/plugin-react:

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

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

If you're using @unocss/preset-attributify you should remove tsc from the build script.

If you are using @vitejs/plugin-react with @unocss/preset-attributify, you must add the plugin before @vitejs/plugin-react.

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

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

You have a React example project on examples/vite-react directory using both plugins, check the scripts on package.json and its Vite configuration file.

Preact

If you're using @preact/preset-vite:

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

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

or if you're using @prefresh/vite:

ts
import Prefresh from '@prefresh/vite'
import UnoCSS from 'unocss/vite'

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

If you're using @unocss/preset-attributify you should remove tsc from the build script.

You have a Preact example project on examples/vite-preact directory using both plugins, check the scripts on package.json and its Vite configuration file.

Svelte

You must add the plugin before @sveltejs/vite-plugin-svelte.

To support class:foo and class:foo={bar} add the plugin and configure extractorSvelte on extractors option.

You can use simple rules with class:, for example class:bg-red-500={foo} or using shortcuts to include multiples rules, see src/App.svelte on linked example project below.

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(),
      ],
      /* more options */
    }),
    svelte(),
  ],
}

Sveltekit

To support class:foo and class:foo={bar} add the plugin and configure extractorSvelte on extractors option.

You can use simple rules with class:, for example class:bg-red-500={foo} or using shortcuts to include multiples rules, see src/routes/+layout.svelte on linked example project below.

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

export default defineConfig({
  plugins: [
    UnoCSS({
      extractors: [
        extractorSvelte(),
      ],
      /* more options */
    }),
    sveltekit(),
  ],
})

Web Components

Para trabalhar com web components, você precisa habilitar o modo shadow-dom no plugin.

Não se esqueça de remover a importação de uno.css já que o modo shadow-dom não o expõe e o aplicativo não funcionará.

ts
import UnoCSS from 'unocss/vite'

export default {
  plugins: [
    UnoCSS({
      mode: 'shadow-dom',
      /* mais opções */
    }),
  ],
}

Em cada web component, basta adicionar @unocss-placeholder ao seu bloco de estilo CSS:

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

Se você estiver usando Lit:

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

Você tem um projeto de exemplo de Web Components no diretório examples/vite-lit.

Suporte integrado para ::part

Você pode usar ::part já que o plugin o suporta via shortcuts e usando a regra part-[<part-name>]:<rule|shortcut> do preset-mini, por exemplo, usando-o com regras simples como part-[<part-name>]:bg-green-500 ou usando algum shortcut: verifique src/my-element.ts no projeto de exemplo vinculado abaixo.

O part-[<part-name>]:<rule|shortcut> funcionará apenas com este plugin usando o modo shadow-dom.

O plugin usa nth-of-type para evitar colisões com várias partes no mesmo web component e para as mesmas partes em web components distintos, você não precisa se preocupar com isso, o plugin cuidará disso para você.

ts
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' },
      ],
      /* mais opções */
    }),
  ],
}

então em seus 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

Você precisa adicionar o plugin vite-plugin-solid após o plugin do UnoCSS.

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

export default {
  plugins: [
    UnoCSS({
      /* opções */
    }),
    solidPlugin(),
  ],
}

Elm

Você precisa adicionar o plugin vite-plugin-elm antes do plugin do UnoCSS.

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

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

Legado

Se @vitejs/plugin-legacy com renderModernChunks: false, você precisa adicioná-lo às opções do unocss

ts
import legacy from '@vitejs/plugin-legacy'
import vue from '@vitejs/plugin-vue'
import { presetWind3 } from 'unocss'
import Unocss from 'unocss/vite'
import { defineConfig } from 'vite'

export default defineConfig({
  plugins: [
    vue(),
    Unocss({
      presets: [presetWind3()],
      legacy: {
        renderModernChunks: false,
      },
    }),
    legacy({
      targets: ['defaults', 'not IE 11'],
      renderModernChunks: false,
    }),
  ],
})

Licença

Released under the MIT License.