Skip to content

Extração ​

O UnoCSS funciona procurando os usos de utilitários em sua base de código e gerando o CSS correspondente sob demanda. Chamamos esse processo de extração.

Fontes de Conteúdo ​

O UnoCSS suporta a extração de usos de utilitários de múltiplas fontes:

  • Pipeline - Extrair diretamente do pipeline de suas ferramentas de construção
  • Sistema de Arquivos - Extrair do seu sistema de arquivos lendo e observando arquivos
  • Inline - Extrair de texto simples inline

Usos de utilitários provenientes de diferentes fontes serão mesclados e gerarão o CSS final.

Extraindo do Pipeline de Ferramentas de Construção ​

Isso é suportado nas integrações do Vite e do Webpack.

O UnoCSS lerá o conteúdo que passa pelo pipeline de suas ferramentas de construção e extrairá os usos de utilitários deles. Esta é a maneira mais eficiente e precisa de extrair, pois extraímos apenas os usos que são realmente utilizados em seu aplicativo de forma inteligente, sem realizar I/O de arquivo adicional durante a extração.

Por padrão, o UnoCSS extrairá o uso de utilitários de arquivos em seu pipeline com extensões .jsx, .tsx, .vue, .md, .html, .svelte, .astro e, em seguida, gerará o CSS apropriado sob demanda. Arquivos .js e .ts NÃO são incluídos por padrão.

Para configurá-los, você pode atualizar seu uno.config.ts:

ts
export default defineConfig({
  content: {
    pipeline: {
      include: [
        // o padrão
        /\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html)($|\?)/,
        // incluir arquivos js/ts
        'src/**/*.{js,ts}',
      ],
      // excluir arquivos
      // exclude: []
    },
  },
})

Você também pode adicionar o comentário mágico @unocss-include em qualquer lugar do arquivo que deseja que o UnoCSS escaneie, em uma base por arquivo. Se precisar escanear arquivos *.js ou *.ts, adicione-os na configuração para incluir todos os arquivos js/ts como alvos de varredura.

ts
// ./some-utils.js

// como os arquivos `.js` não são incluídos por padrão,
// o seguinte comentário diz ao UnoCSS para forçar o escaneamento deste arquivo.
// @unocss-include
export const classes = {
  active: 'bg-primary text-white',
  inactive: 'bg-gray-200 text-gray-500',
}

Da mesma forma, você também pode adicionar @unocss-ignore para ignorar a varredura e transformação para todo o arquivo.

Se você quiser que o UnoCSS pule um bloco de código sem ser extraído em qualquer arquivo de extração, pode usar @unocss-skip-start @unocss-skip-end em pares. Note que deve ser usado em pares para ser efetivo.

html
<p class="text-green text-xl">Verde Grande</p>

<!-- @unocss-skip-start -->
<!-- `text-red` não será extraído -->
<p class="text-red">Vermelho</p>
<!-- @unocss-skip-end -->

Extraindo do Sistema de Arquivos ​

Em casos em que você está usando integrações que não têm acesso ao pipeline de ferramentas de construção (por exemplo, o plugin PostCSS), ou está integrando com frameworks de backend de modo que o código não passa pelo pipeline, você pode especificar manualmente os arquivos a serem extraídos.

ts
export default defineConfig({
  content: {
    filesystem: [
      'src/**/*.php',
      'public/*.html',
    ],
  },
})

Os arquivos correspondentes serão lidos diretamente do sistema de arquivos e observados para mudanças no modo de desenvolvimento.

Extraindo de Texto Inline ​

Adicionalmente, você pode extrair usos de utilitários de texto inline que pode recuperar de outros lugares.

Você também pode passar uma função assíncrona para retornar o conteúdo. Mas note que a função será chamada apenas uma vez no momento da compilação.

ts
export default defineConfig({
  content: {
    inline: [
      // texto simples
      '<div class="p-4 text-red">Algum texto</div>',
      // getter assíncrono
      async () => {
        const response = await fetch('https://example.com')
        return response.text()
      },
    ],
  },
})

Limitações ​

Como o UnoCSS funciona no momento da compilação, significa que apenas os utilitários apresentados estaticamente serão gerados e enviados para seu aplicativo. Utilitários usados dinamicamente ou buscados de recursos externos em tempo de execução podem NÃO ser detectados ou aplicados.

Lista de Segurança (Safelist) ​

Às vezes, você pode querer usar concatenações dinâmicas como:

html
<div class="p-${size}"></div>
<!-- isso não vai funcionar! -->

Devido ao fato de o UnoCSS funcionar no momento da compilação usando extração estática, no momento da compilação, não é possível saber todas as combinações de utilitários. Para isso, você pode configurar a opção safelist.

ts
safelist: 'p-1 p-2 p-3 p-4'.split(' ')

O CSS correspondente será sempre gerado:

css
.p-1 { padding: 0.25rem; }
.p-2 { padding: 0.5rem; }
.p-3 { padding: 0.75rem; }
.p-4 { padding: 1rem; }

Ou de forma mais flexível:

ts
safelist: [
  ...Array.from({ length: 4 }, (_, i) => `p-${i + 1}`),
]

Se você está procurando uma geração verdadeiramente dinâmica em tempo de execução, pode querer conferir o pacote @unocss/runtime.

Combinações de Lista Estática ​

Outra forma de contornar a limitação de utilitários construídos dinamicamente é usar um objeto que liste todas as combinações estaticamente. Por exemplo, se você quiser fazer isso:

html
<div class="text-${color} border-${color}"></div>
<!-- isso não vai funcionar! -->

Você pode criar um objeto que liste todas as combinações (assumindo que você conheça todos os possíveis valores de color que deseja usar)

ts
// Como são estáticos, o UnoCSS poderá extraí-los no momento da compilação
const classes = {
  red: 'text-red border-red',
  green: 'text-green border-green',
  blue: 'text-blue border-blue',
}

E então usá-lo em seu template:

html
<div class="${classes[color]}"></div>

Lista de Bloqueio (Blocklist) ​

Semelhante ao safelist, você também pode configurar blocklist para excluir alguns utilitários de serem gerados. Isso é útil para excluir alguns falsos positivos de extração. Diferente do safelist, blocklist aceita tanto strings para correspondência exata quanto expressões regulares para correspondência de padrão.

ts
blocklist: [
  'p-1',
  /^p-[2-4]$/,
]

Isso excluirá p-1 e p-2, p-3, p-4 de serem gerados.

Released under the MIT License.