🔄 Миграция Tailwind v3 → v4

Что переехало, что переименовано, план перехода

Зачем этот справочник

Большая часть статей, ответов на форумах и готовых тем написана для Tailwind v3. Их инструкции в v4 не работают или работают иначе. Здесь собраны все различия, с которыми вы столкнётесь.

Как быстро определить версию: есть tailwind.config.js и три директивы @tailwind — это v3. Один @import "tailwindcss" и блок @theme — это v4.

Установка и подключение

Чтоv3v4
Подключение в CSS@tailwind base/components/utilities@import "tailwindcss";
Инициализацияnpx tailwindcss init -pне нужна
Плагин Viteчерез PostCSS@tailwindcss/vite
Плагин PostCSStailwindcss@tailwindcss/postcss
CLItailwindcss@tailwindcss/cli
Автопрефиксыautoprefixerвстроены
Файлы для сканированияполе contentавтоопределение + @source

Тема

❌ v3

module.exports = {
  darkMode: ["class"],
  theme: {
    extend: {
      colors: { brand: { 500: "#4f46e5" } },
      spacing: { huge: "7.5rem" },
      screens: { tablet: "960px" },
      borderRadius: { xl: "1rem" },
    },
  },
  plugins: [require("tailwindcss-animate")],
}

✅ v4

@import "tailwindcss";
@import "tw-animate-css";

@custom-variant dark (&:where(.dark, .dark *));

@theme {
  --color-brand-500: oklch(0.51 0.26 277);
  --spacing-huge: 7.5rem;
  --breakpoint-tablet: 60rem;
  --radius-xl: 1rem;
}
Настройкаv3v4
Цветtheme.extend.colors--color-*
Отступtheme.spacing--spacing-*
Брейкпоинтtheme.screens--breakpoint-*
Шрифтtheme.fontFamily--font-*
Радиусtheme.borderRadius--radius-*
Тёмная темаdarkMode: ["class"]@custom-variant dark (…)
Своя утилитаплагин на JS@utility
Свой вариантaddVariant@custom-variant
Сброс палитрыпереопределение объекта--color-*: initial;

Старый конфиг можно временно подключить: @config "./tailwind.config.js";

Переименованные утилиты

Самая коварная группа: классы существуют в обеих версиях, но означают разное. Ошибок сборки не будет — просто изменится внешний вид.
v3v4Комментарий
shadow-smshadow-xsшкала теней сдвинулась
shadowshadow-smбезымянный вариант убран
rounded-smrounded-xsто же для радиусов
roundedrounded-sm—
blurblur-smто же для фильтров
ring (3px)ring (1px)для прежнего вида — ring-3
outline-noneoutline-hiddenсохраняет контур в режиме высокой контрастности
bg-gradient-to-rbg-linear-to-rпоявились bg-radial, bg-conic
bg-opacity-50bg-black/50прозрачность модификатором
flex-shrink-0shrink-0короче
flex-growgrowкороче
overflow-ellipsistext-ellipsis—
decoration-slicebox-decoration-slice—

Изменения поведения

ЧтоБылоСтало
Цвет границы по умолчаниюсерыйcurrentColor
Цвет палитрыRGBOKLCH — оттенки выглядят чуть иначе
Единицы брейкпоинтовpxrem
Container queriesплагинв ядре
Трансформациинужен класс transformработают сразу
Слои CSSэмуляциянастоящие @layer
Произвольные значенияw-[var(--x)]ещё и w-(--x)

План миграции

  1. Обновить зависимости: tailwindcss, добавить @tailwindcss/vite или @tailwindcss/postcss.
  2. Заменить три директивы на @import "tailwindcss";
  3. Перенести тему из конфига в @theme (или временно подключить конфиг через @config).
  4. Настроить тёмную тему через @custom-variant.
  5. Пройти по таблице переименований — особенно тени, радиусы и ring.
  6. Проверить внешний вид: цвета в OKLCH выглядят немного иначе.
  7. Удалить autoprefixer и плагины, чьи возможности вошли в ядро.
⚠️ Проверить по документации: у Tailwind есть официальный инструмент обновления (npx @tailwindcss/upgrade) — уточните его актуальную форму вызова в разделе Upgrade guide.