Как понять, что проблема в проекте связана с Tailwind CSS, а не с API, сетью, дизайном состояния или плохой архитектурой?
Локализация проблемы начинается с воспроизведения в изоляции: убираем Tailwind-классы, проверяем нативный CSS, затем сеть, API и state — последовательно сужая область поиска.
Принцип локализации
Большинство багов в frontend-проектах не принадлежат одному слою. Чтобы понять, виноват ли Tailwind CSS, нужно изолировать его от остальной системы. Стратегия: минимальный воспроизводимый пример → отключение Tailwind → сравнение с нативным CSS.
Шаг 1 — Воспроизвести изолированно
Создайте минимальный компонент без API-запросов, без Redux/Zustand, без React Query:
// Тест: проблема в Tailwind или в данных?
function IsolatedTest() {
// Хардкодим данные, убираем зависимость от API
return (
<div className="flex items-center gap-4 rounded-lg bg-white p-4 shadow">
<span className="text-red-500">Test</span>
</div>
);
}
Если визуальная проблема воспроизводится без данных — виноват CSS/Tailwind слой. Если нет — проблема в state или API.
Шаг 2 — Проверить сгенерированный CSS
Tailwind JIT генерирует CSS только для классов, найденных в content-сканировании. Возможные причины «пропавших» стилей:
- Динамически собранный className:
`text-${color}-500`— JIT не найдёт такой класс. - Класс есть в JS, но файл не в
contentpaths — нужно проверитьtailwind.config.js → contentили@sourceв v4. - Specificity-конфликт: глобальный CSS переопределяет Tailwind-класс — проверяем DevTools → Computed Styles → Overridden rules.
# Проверить, что класс попал в итоговый CSS
grep -r 'text-red-500' .next/static/css/
# или через PostCSS debug
npx tailwindcss -i ./src/globals.css -o /tmp/out.css --content './src/**/*.tsx'
grep 'text-red-500' /tmp/out.css
Шаг 3 — Отделить API/сеть
Если компонент рендерится не так при реальных данных, но корректно при хардкоде:
- Проверьте Network tab — может прийти пустой массив или null, вызывающий conditional rendering.
- Проверьте React DevTools — правильный ли state передаётся в компонент.
- Добавьте
console.logпрямо перед return, чтобы убедиться, что className формируется корректно.
Шаг 4 — Проверить дизайн состояния
Частая ошибка: className зависит от состояния, но условие записано неверно:
// Ошибка: оба класса могут применяться одновременно при неверной логике
const cls = isError ? 'border-red-500' : '';
const cls2 = isValid ? 'border-green-500' : '';
// Правильно: один источник состояния
const borderCls = isError ? 'border-red-500' : isValid ? 'border-green-500' : 'border-gray-300';
Шаг 5 — Исключить архитектурные причины
- CSS Cascade: если стили определены в
@layer baseили@layer components, они имеют меньший specificity, чем inline styles. - CSS-in-JS конфликт: если рядом используется Emotion/styled-components, их runtime-стили могут перекрывать Tailwind.
- Purge в production: в dev Tailwind генерирует все классы, в production — только используемые. «Работает в dev, сломано в prod» — первый признак проблемы с
contentpaths.
Подводные камни
- «Работает локально, сломано в production» — почти всегда проблема с JIT content paths, не с Tailwind как таковым.
- DevTools показывает класс на элементе, но стиль не применяется — проверьте
!importantили specificity в глобальном CSS. - Tailwind v4 изменил приоритет слоёв — правила из
@layer utilitiesимеют иной порядок, чем в v3. - При использовании
clsxилиcnлегко передать конфликтующие классы (p-2 p-4) — используйтеtailwind-mergeдля разрешения конфликтов. - Responsive-классы (
md:flex) не работают при неправильном viewport meta — убедитесь, что<meta name="viewport">установлен. - Dark mode классы (
dark:bg-gray-800) требуют настройкиdarkMode: 'class'в конфиге и добавления классаdarkна<html>. - Не обвиняйте Tailwind до проверки браузерной совместимости — некоторые утилиты используют CSS Grid subgrid или
:has(), не поддерживаемые в старых Chrome. - Проблема может быть в порядке импортов CSS — если глобальный reset импортируется после Tailwind base, он перезатирает стили.
What hurts your answer
- Сразу обвинять Tailwind CSS, не проверив соседние слои системы
- Чинить симптом без минимального воспроизведения и evidence
- Не учитывать версии, конфигурацию, окружение и recent changes
What they're listening for
- Умеет локализовать проблему вокруг Tailwind CSS
- Двигается от симптома к гипотезам и проверкам
- Отличает баг инструмента от ошибки использования или окружения