Compartilhe

avatar

Este guia abrangente orienta você na configuração do Tailwind CSS versões 3 e 4 em projetos React e Next.js, cobrindo etapas de instalação, configuração, padrões de componentes, implementação de modo escuro, práticas recomendadas e cenários comuns de solução de problemas.

Se você criou aplicativos da web recentemente, provavelmente já ouviu falar sobre Tailwind CSS. A forma como muitos de nós abordamos o estilo mudou, permitindo-nos compor designs diretamente em nossa marcação usando classes utilitárias. Chega de ficar pulando entre arquivos HTML e CSS ou de lidar com convenções de nomenclatura que inevitavelmente falham à medida que os projetos crescem.

Este guia aborda a configuração do Tailwind CSS em projetos React e Next.js, cobrindo a versão 3 (ainda amplamente usada na produção) e a versão 4 (a versão mais recente com melhorias significativas). Também abordaremos a configuração do modo escuro, às vezes confusa, que confunde até mesmo desenvolvedores experientes.

Compreendendo a filosofia do Tailwind

Antes de mergulhar na configuração, vale a pena entender o que torna o Tailwind diferente. Em vez de escrever CSS personalizado para cada componente, você aplica classes de utilitários pré-construídas diretamente aos seus elementos.

Pense nisso como ter um enorme kit de ferramentas onde cada classe faz uma coisa específica muito bem. Quer preenchimento? Adicionar p-4. Precisa de resposta? Faça isso md:p-8. Essa abordagem parece estranha no início se você vier do CSS tradicional, mas assim que clicar, você se verá construindo interfaces incrivelmente rápido.

A mágica acontece durante o tempo de construção, quando o Tailwind verifica seus arquivos e inclui apenas os estilos que você realmente usa. Isso significa que apesar de ter milhares de utilitários disponíveis, seu pacote CSS final permanece enxuto.

Configurando Tailwind CSS v3 em React com Vite

Vamos começar com a versão 3 em um projeto React usando Vite. A versão 3 continua incrivelmente popular, especialmente em bases de código existentes, e compreender sua configuração ajuda na manutenção de projetos mais antigos.

Primeiro, crie seu projeto React com Vite:

npm create vite@latest my-react-app -- --template react-ts
cd my-react-app

Agora instale o Tailwind e suas dependências de pares. Essas dependências de pares (PostCSS e Autoprefixer) lidam com o pipeline de transformação CSS do qual o Tailwind depende:

npm install -D tailwindcss@3 postcss autoprefixer
npx tailwindcss init -p

Que init -p comando cria dois arquivos de configuração. O -p flag gera especificamente uma configuração PostCSS junto com a configuração do Tailwind, evitando uma etapa manual.

Abra o gerado tailwind.config.js e diga ao Tailwind onde procurar classes em seu projeto:

/** @type {import('tailwindcss').Config} */
export default {
  content: (
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ),
  theme: {
    extend: {
      // Your custom design tokens go here
    },
  },
  plugins: (),
}

O content matriz é crucial. Ele informa ao Tailwind quais arquivos devem ser verificados em busca de nomes de classes. Perca um caminho aqui e você se perguntará por que seus estilos não estão funcionando.

Em seguida, substitua o conteúdo de src/index.css com as diretivas do Tailwind:

@tailwind base;
@tailwind components;
@tailwind utilities;

Essas diretivas injetam estilos do Tailwind em seu CSS. A ordem é importante: os estilos básicos fornecem redefinições e padrões, os componentes são para classes de componentes pré-construídas e os utilitários são suas classes de utilitários básicos.

Por fim, certifique-se de que este arquivo CSS seja importado em seu src/main.tsx:

import './index.css'

Correr npm run dev e você está pronto para começar a usar classes Tailwind em seus componentes!

Configurando Tailwind CSS v4 em React

A versão 4, lançada no final de 2024, representa uma mudança arquitetônica significativa. A maior mudança? Não há mais dependência de PostCSS para a maioria dos casos de uso. Tailwind agora inclui seu próprio mecanismo extremamente rápido escrito em Rust, tornando a configuração mais simples e a construção mais rápida.

Comece com a mesma configuração do Vite:

npm create vite@latest my-react-app -- --template react-ts
cd my-react-app

A instalação é notavelmente mais simples para v4:

npm install tailwindcss @tailwindcss/vite

Em vez da configuração PostCSS, você adicionará o Tailwind diretamente à configuração do Vite. Atualizar vite.config.ts:

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'

export default defineConfig({
  plugins: (
    react(),
    tailwindcss(),
  ),
})

Em seu src/index.cssa sintaxe muda ligeiramente:

@import "tailwindcss";

É isso! A versão 4 detecta automaticamente seus arquivos de conteúdo sem configuração explícita. O novo mecanismo cuida de tudo internamente, resultando em compilações mais rápidas e recargas a quente.

Configurando Tailwind CSS v3 em Next.js

Os projetos Next.js têm suas próprias considerações, especialmente com o App Router introduzido na versão 13. Vamos examinar a configuração da v3 para Next.js:

npx create-next-app@latest my-next-app --typescript --app
cd my-next-app

Instale a pilha Tailwind:

npm install -D tailwindcss@3 postcss autoprefixer
npx tailwindcss init -p

Configurar tailwind.config.js com caminhos específicos do Next.js:

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: (
    "./app/**/*.{js,ts,jsx,tsx,mdx}",
    "./pages/**/*.{js,ts,jsx,tsx,mdx}",  // if using pages directory
    "./components/**/*.{js,ts,jsx,tsx,mdx}",
  ),
  theme: {
    extend: {},
  },
  plugins: (),
}

Observe que incluímos ambos app e pages diretórios. Isso garante compatibilidade quer você esteja usando o App Router mais recente ou o Pages Router tradicional.

Adicione diretivas Tailwind a app/globals.css:

@tailwind base;
@tailwind components;
@tailwind utilities;

Certifique-se de que este arquivo CSS seja importado em seu layout raiz (app/layout.tsx):

import './globals.css'

export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    
      {children}
    
  )
}

Configurando Tailwind CSS v4 em Next.js

Para a versão 4 em Next.js, o processo aproveita PostCSS (que Next.js usa internamente de qualquer maneira):

npx create-next-app@latest my-next-app --typescript --app
cd my-next-app

Instale a v4 com seu plugin PostCSS:

npm install tailwindcss @tailwindcss/postcss

Crie um postcss.config.mjs arquivo:

/** @type {import('postcss-load-config').Config} */
const config = {
  plugins: {
    "@tailwindcss/postcss": {},
  },
};

export default config;

Atualizar app/globals.css:

@import "tailwindcss";

A instrução de importação no seu layout permanece a mesma. A inteligência da versão 4 significa que ela encontra automaticamente seus arquivos de conteúdo em um projeto Next.js.

Trabalhando com Componentes

Depois de configurado, o uso do Tailwind é idêntico em todas as versões. Aqui está um componente prático de cartão que mostra padrões comuns:

function Card({ title, description, highlighted = false }) {
  return (
    
max-w-sm rounded-lg overflow-hidden shadow-lg p-6 ${highlighted ? 'bg-blue-50 border-2 border-blue-500' : 'bg-white'} hover:shadow-xl transition-shadow duration-300 `}>

{title} {description}
); }

Observe como lidamos com estilos condicionais com literais de modelo. Esse padrão mantém seu JSX legível enquanto aproveita os utilitários do Tailwind.

Implementando o modo escuro corretamente

O modo escuro é onde muitos desenvolvedores enfrentam obstáculos. A abordagem difere entre v3 e v4 e a documentação pode ser confusa. Deixe-me explicar isso claramente.

Modo escuro no Tailwind v3

Primeiro, habilite o modo escuro baseado em classe em seu tailwind.config.js:

module.exports = {
  darkMode: 'class',  // This enables manual control
  // ... rest of your config
}

Agora crie um componente de alternância de tema que gerencia a classe escura em seu elemento HTML:

// components/ThemeToggle.tsx
import { useEffect, useState } from 'react';

export function ThemeToggle() {
  const (theme, setTheme) = useState('light');

  useEffect(() => {
    // Check for saved preference or default to light
    const savedTheme = localStorage.getItem('theme');
    const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
    
    const initialTheme = savedTheme || (prefersDark ? 'dark' : 'light');
    setTheme(initialTheme);
    
    // Apply the theme
    if (initialTheme === 'dark') {
      document.documentElement.classList.add('dark');
    }
  }, ());

  const toggleTheme = () => {
    const newTheme = theme === 'light' ? 'dark' : 'light';
    setTheme(newTheme);
    
    // Update DOM
    if (newTheme === 'dark') {
      document.documentElement.classList.add('dark');
    } else {
      document.documentElement.classList.remove('dark');
    }
    
    // Save preference
    localStorage.setItem('theme', newTheme);
  };

  return (
    
  );
}

Para evitar o flash do tema incorreto no carregamento da página, adicione este script ao cabeçalho do documento. Em Next.js, crie um componente:

// app/ThemeScript.tsx
export function ThemeScript() {
  const themeScript = `
    (function() {
      const theme = localStorage.getItem('theme');
      const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
      
      if (theme === 'dark' || (!theme && prefersDark)) {
        document.documentElement.classList.add('dark');
      }
    })();
  `;

  return (