
Это подробное руководство шаг за шагом расскажет вам о настройке Tailwind CSS версий 3 и 4 в проектах React и Next.js, охватывая этапы установки, конфигурацию, шаблоны компонентов, реализацию темного режима, лучшие практики и распространенные сценарии устранения неполадок.
Если вы в последнее время занимаетесь разработкой веб-приложений, вы, вероятно, слышали о Tailwind CSS. Он изменил подход многих из нас к стилизации, позволив создавать дизайн непосредственно в разметке с помощью вспомогательных классов. Больше не нужно переключаться между HTML и CSS файлами или разбираться с соглашениями об именовании, которые неизбежно нарушаются по мере роста проекта.
В этом руководстве описана настройка Tailwind CSS в проектах React и Next.js, охватывающая как версию 3 (по-прежнему широко используемую в продакшене), так и версию 4 (последняя версия со значительными улучшениями). Мы также рассмотрим порой сложную настройку темного режима, которая ставит в тупик даже опытных разработчиков.
Прежде чем приступить к настройке, стоит понять, чем Tailwind отличается от других подобных сервисов. Вместо написания собственных CSS-стилей для каждого компонента, вы применяете готовые вспомогательные классы непосредственно к своим элементам.
Представьте, что у вас есть огромный набор инструментов, где каждый класс отлично справляется с одной конкретной задачей. Нужен отступ? Добавьте p-4. Нужен адаптивный дизайн? Сделайте его md:p-8. Этот подход поначалу может показаться непривычным, если вы привыкли к традиционному CSS, но как только вы поймете, как это работает, вы обнаружите, что создаете интерфейсы невероятно быстро.
Волшебство происходит во время сборки, когда Tailwind сканирует ваши файлы и включает только те стили, которые вы действительно используете. Это означает, что, несмотря на наличие тысяч доступных утилит, ваш итоговый CSS-пакет остается компактным.
Начнём с версии 3 в проекте React с использованием Vite. Версия 3 остаётся невероятно популярной, особенно в существующих кодовых базах, и понимание её настройки помогает при поддержке старых проектов.
Для начала создайте структуру вашего React-проекта с помощью Vite:
npm create vite@latest my-react-app -- --template react-ts
cd my-react-appТеперь установите Tailwind и его зависимости. Эти зависимости (PostCSS и Autoprefixer) обрабатывают конвейер преобразования CSS, на который опирается Tailwind:
npm install -D tailwindcss@3 postcss autoprefixer
npx tailwindcss init -pЭта init -p команда создает два конфигурационных файла. -p Флаг специально генерирует конфигурационный файл PostCSS вместе с конфигурационным файлом Tailwind, что избавляет вас от необходимости выполнять операцию вручную.
Откройте сгенерированный файл tailwind.config.js и укажите Tailwind, где в вашем проекте искать классы:
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {
// Your custom design tokens go here
},
},
plugins: [],
}Массив content имеет решающее значение. Он указывает Tailwind, какие файлы следует сканировать на наличие имен классов. Если вы пропустите этот путь, вы будете удивляться, почему ваши стили не работают.
Далее замените содержимое src/index.css директивами Tailwind:
@tailwind base;
@tailwind components;
@tailwind utilities;Эти директивы внедряют стили Tailwind в ваш CSS. Порядок имеет значение: базовые стили обеспечивают сброс и значения по умолчанию, компоненты — это готовые классы компонентов, а утилиты — это ваши основные вспомогательные классы.
Наконец, убедитесь, что этот CSS-файл импортирован в ваш проект src/main.tsx:
import './index.css'Запустите npm run dev , и вы будете готовы начать использовать классы Tailwind в своих компонентах!
Версия 4, выпущенная в конце 2024 года, представляет собой значительный архитектурный сдвиг. Самое большое изменение? В большинстве случаев больше нет зависимости от PostCSS. Tailwind теперь включает в себя собственный молниеносно быстрый движок, написанный на Rust, что упрощает настройку и ускоряет сборку.
Начните с тех же настроек Vite:
npm create vite@latest my-react-app -- --template react-ts
cd my-react-appУстановка версии 4 значительно проще:
npm install tailwindcss @tailwindcss/viteВместо конфигурации PostCSS, вы добавите Tailwind непосредственно в конфигурацию Vite. Обновление vite.config.ts:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [
react(),
tailwindcss(),
],
})В вашем src/index.css варианте синтаксис немного отличается:
@import "tailwindcss";Вот и всё! Версия 4 автоматически обнаруживает ваши файлы контента без явной настройки. Новый движок обрабатывает всё внутри себя, что приводит к более быстрой сборке и перезагрузке.
У проектов Next.js есть свои особенности, особенно с учетом App Router, представленного в версии 13. Давайте рассмотрим настройку Next.js для версии 3:
npx create-next-app@latest my-next-app --typescript --app
cd my-next-appУстановите стек Tailwind:
npm install -D tailwindcss@3 postcss autoprefixer
npx tailwindcss init -pУкажите tailwind.config.js пути, специфичные для 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: [],
}Обратите внимание, что мы включаем оба app каталога pages . Это обеспечивает совместимость независимо от того, используете ли вы более новую версию App Router или традиционную версию Pages Router.
Добавьте директивы Tailwind в app/globals.css:
@tailwind base;
@tailwind components;
@tailwind utilities;Убедитесь, что этот CSS-файл импортирован в корневой каталог макета ( app/layout.tsx):
import './globals.css'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}Для версии 4 в Next.js используется PostCSS (который Next.js и так использует внутри себя):
npx create-next-app@latest my-next-app --typescript --app
cd my-next-appУстановите версию 4 вместе с плагином PostCSS:
npm install tailwindcss @tailwindcss/postcssСоздайте postcss.config.mjs файл:
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
"@tailwindcss/postcss": {},
},
};
export default config;Обновите app/globals.css:
@import "tailwindcss";Оператор импорта в вашем макете остается прежним. Благодаря интеллектуальной системе версии 4, она автоматически находит ваши файлы контента в проекте Next.js.
После установки использование Tailwind идентично во всех версиях. Вот наглядный пример карточки, демонстрирующий распространенные шаблоны:
function Card({ title, description, highlighted = false }) {
return (
<div className={`
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
`}>
<h2 className="font-bold text-xl mb-2 text-gray-900">
{title}
</h2>
<p className="text-gray-700 text-base leading-relaxed">
{description}
</p>
</div>
);
}Обратите внимание, как мы обрабатываем условное оформление с помощью шаблонных литералов. Этот подход сохраняет читаемость вашего JSX-кода, одновременно используя вспомогательные функции Tailwind.
Темный режим — это то, где многие разработчики сталкиваются с трудностями. Подход к его использованию различается в версиях 3 и 4, а документация может быть запутанной. Давайте я объясню это более понятно.
Сначала включите темный режим на основе классов в вашем файле tailwind.config.js:
module.exports = {
darkMode: 'class', // Это обеспечивает ручное управление
// ... остальная часть вашей конфигурации
}Теперь создайте компонент переключения темы, который будет управлять классом «dark» для вашего 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 (
<button
onClick={toggleTheme}
className="p-2 rounded-lg bg-gray-200 dark:bg-gray-700
text-gray-900 dark:text-gray-100
hover:bg-gray-300 dark:hover:bg-gray-600
transition-colors"
aria-label="Toggle theme"
>
{theme === 'light' ? '🌙' : '☀️'}
</button>
);
}Чтобы предотвратить отображение некорректной темы при загрузке страницы, добавьте этот скрипт в раздел <head> вашего документа. В Next.js создайте компонент:
// 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 (
<script dangerouslySetInnerHTML={{ __html: themeScript }} />
);
}Добавьте это в корневой раздел перед элементом body:
// app/layout.tsx
import { ThemeScript } from './ThemeScript';
export default function RootLayout({ children }) {
return (
<html lang="en">
<head>
<ThemeScript />
</head>
<body>{children}</body>
</html>
);
}В версии 4 подход немного изменился. Вместо параметра конфигурации вы определяете поведение темного режима с помощью CSS. Добавьте это в свой глобальный CSS-файл после импорта Tailwind:
@import "tailwindcss";
/* Enable class-based dark mode */
@variant dark (&:where(.dark, .dark *));Компонент переключения темы остался прежним, но движок версии 4 обрабатывает этот вариант более эффективно.
Для более сложного подхода с использованием пользовательских свойств CSS (работает в обеих версиях):
@import "tailwindcss";
:root {
--color-background: 255 255 255; /* white */
--color-text: 17 24 39; /* gray-900 */
--color-primary: 59 130 246; /* blue-500 */
}
.dark {
--color-background: 17 24 39; /* gray-900 */
--color-text: 243 244 246; /* gray-100 */
--color-primary: 96 165 250; /* blue-400 */
}Затем расширьте конфигурацию Tailwind, чтобы использовать следующие переменные:
module.exports = {
theme: {
extend: {
colors: {
background: 'rgb(var(--color-background) / <alpha-value>)',
text: 'rgb(var(--color-text) / <alpha-value>)',
primary: 'rgb(var(--color-primary) / <alpha-value>)',
},
},
},
}Теперь вы можете использовать классы bg-background, text-text, и , text-primary которые автоматически адаптируются к теме оформления.
После работы с Tailwind над многочисленными проектами я выявил следующие методы, которые неизменно оказываются ценными:
Старайтесь, чтобы ваша конфигурация была максимально простой. Расширяйте тему только тогда, когда вам необходимы согласованные пользовательские значения во всем проекте. Для отдельных стилей можно использовать произвольные значения, например bg-[#1da1f2], .
Используйте компонентные шаблоны. Хотя Tailwind поощряет использование вспомогательных классов, не стесняйтесь создавать компонентные классы для действительно повторяющихся шаблонов. Используйте директиву @apply экономно:
@layer components {
.btn-primary {
@apply px-4 py-2 bg-blue-500 text-white rounded-lg
hover:bg-blue-600 transition-colors;
}
}Используйте официальный плагин Prettier. Установите его prettier-plugin-tailwindcss , чтобы автоматически сортировать ваши классы в единообразном порядке. Это значительно упростит проверку кода.
Используйте IntelliSense. Официальное расширение VS Code предоставляет автозаполнение, предварительный просмотр при наведении курсора и проверку синтаксиса. Оно незаменимо для запоминания названий классов и выявления опечаток.
Учитывайте доступность. Tailwind позволяет легко создавать недоступные интерфейсы, если не проявлять осторожность. Всегда тестируйте с помощью клавиатуры и программ чтения с экрана. Используйте семантические HTML и атрибуты ARIA там, где это уместно.
Если стили не применяются, проверьте их в указанном порядке:
Если в производственной сборке отображаются ошибки, скорее всего, вы динамически генерируете имена классов. Tailwind не может их обнаружить. Всегда используйте полные имена классов или добавьте их в список разрешенных в вашей конфигурации.
Tailwind CSS коренным образом изменил подход многих из нас к созданию интерфейсов. Независимо от того, выберете ли вы стабильную версию 3 или воспользуетесь улучшениями в версии 4, вы получите проверенный временем инструмент, масштабируемый от прототипов до готовых приложений.
Ключ к освоению Tailwind заключается не в запоминании всех вспомогательных классов. Он состоит в понимании ментальной модели создания дизайна из небольших, целенаправленных элементов. Начните с основ, постепенно изучайте продвинутые функции, такие как анимация и пользовательские варианты, и не стесняйтесь заглядывать в исходный код сайтов, которые вам нравятся.
Помните, Tailwind — это инструмент. Сочетайте его с другими подходами, когда это целесообразно. Используйте CSS-модули для сложных анимаций. Пишите собственный CSS, когда это необходимо. Цель — создавать превосходный пользовательский опыт, и Tailwind — это просто один из мощных способов быстрее достичь этой цели.