Совместимость и обновление
На этой странице собрана информация, которая понадобится перед обновлением или при точном сравнении результатов: требования к среде выполнения, версии TailwindCSS, с которыми совместим порт, известные отличия реализации TailwindPHP от TailwindCSS и примечания к каждому выпуску. Полная история изменений приведена в CHANGELOG.md.
Требования
- PHP версии 8.2 или новее. Набор тестов запускается на PHP версий 8.2, 8.3 и 8.4.
- Расширения
ctypeиmbstring. Компилятор вызываетctype_*иmb_chr(). Они входят в большинство сборок PHP и официальные образы Docker, ноcomposer.jsonпока не объявляет их зависимостями (#11), поэтому сборка без них установит пакет, но тот не запустится. - Необязательно:
pcntl. Позволяет режиму--watchу CLI корректно останавливаться при полученииSIGINT/SIGTERM. Без него режим наблюдения по-прежнему работает.
Здесь не используются Node.js, FFI или нативные двоичные файлы.
Версия TailwindCSS, с которой синхронизируется порт
Порт версии 1.7.0 синхронизирован с TailwindCSS v4.3.3. Репозиторий оригинального проекта закреплен в виде подмодуля git в reference/tailwindcss. Наборы тестов извлекаются из этой закрепленной копии, а тесты 4,427 запускаются при каждом отправлении изменений (см. раздел Производительность и тестирование). Перенесенные плагины соответствуют @tailwindcss/typography и @tailwindcss/forms, а вспомогательные средства для классов — clsx, tailwind-merge и CVA; все они закреплены таким же образом.
Известные отличия от TailwindCSS
Особенности сериализации
Сгенерированный CSS проходит эталонные наборы тестов. Некоторые детали сериализации отличаются от результата TailwindCSS CLI; на каскад они не влияют:
- Префиксы поставщиков: если эталон добавляет к авторской строке
-webkit-*сгенерированную строку, TailwindPHP выводит одну строку. - Пониженные псевдоэлементы (
::file-selector-button,::-webkit-datetime-edit-*) остаются в исходных списках селекторов, а не разделяются на отдельные правила для каждого псевдоэлемента. - Строки, записанные в одинарных кавычках, сохраняют их (
'Segoe UI'), а не преобразуются в двойные. - Совместно встречающиеся длинные формы свойств не объединяются в сокращенное свойство (собственный вывод Tailwind в этом не нуждается).
.p-0сохраняетpadding: 0px, тогда как эталонный CLI выводитpadding: 0, поскольку извлеченный корпус тестов фиксирует вариант0px. Минификатор сокращает его до0.
Что не включено
TailwindPHP — компилятор CSS. В нем нет инструментов редактирования из экосистемы Tailwind (IntelliSense, автодополнение, сортировка классов) и исходных карт, поэтому в CLI отсутствует параметр --map.
Сканирование содержимого
tw::generate() и TailwindCompiler::generate() извлекают имена классов только из атрибутов class и className. Чтобы использовать имена классов из строк PHP или JavaScript, задайте tw::extractCandidatesFromStrings() либо @source inline("…"). Формы путей в @source игнорируются API и учитываются CLI лишь частично (см. ниже).
Известные проблемы текущего выпуска
| Область | Текущее поведение | Проблема |
|---|---|---|
CLI @source |
Пути и glob-шаблоны не применяются; вместо этого сканируется каталог входного файла, а @source not ничего не исключает. См. Что сканирует CLI |
#8 |
CLI --optimize |
Минифицирует, как --minify |
#9 |
| Длинные параметры CLI | --input file.css (разделенные пробелами) игнорируются; используйте --input=file.css или -i file.css |
#13 |
| Варианты плагинов | Варианты addVariant()/matchVariant() и модификаторы типографических элементов (prose-headings: …) компилируются без селектора |
#10 |
Миксины @apply |
@apply --my-mixin; удаляется вместо передачи дальше |
#12 |
| Импорты эталонной реализации | Если перед импортом утилит указан эталонный импорт, результат пуст; @import "tailwindcss" reference не влияет |
#14 |
Примечания к обновлению
1.7.0
- Байтовое представление вывода меняется по сравнению с 1.6.x, но функционально он остается эквивалентным эталону TailwindCSS v4.3.3. Среди видимых изменений:
- Множители пробелов:
p-1выводитpadding: var(--spacing)вместоcalc(), а множитель0выводит нулевую длину без единицы измерения. - Дробные значения преобразуются в проценты:
w-1/2выводитwidth: 50%. - Цвета: светлота в
oklch()/oklab()сериализуется в процентах (oklch(62.3% .214 259.815)),whiteиblackсокращаются до#fffи#000. - Псевдоэлементы CSS2 сериализуются с одним двоеточием (
:before,:after,:first-letter,:first-line). - Вложенные правила
@media/@supports/@containerуплощаются на месте в исходном порядке, а не переносятся в конец; объявления упорядочиваются как в lightningcss; затененные дублирующиеся объявления удаляются.
- Множители пробелов:
- Кэши с ключами, зависящими от вывода, сбрасываются один раз. Ключ файлового кэша
tw::generate()не содержит версию TailwindPHP, поэтому после обновления выполнитеtw::clearCache()(или очистите каталог, переданный какcache). кэш состояния компилятора обновляется автоматически. - Новое:
@variantв авторском CSS, миксины CSS в@apply,@media referenceи@import "…" reference, полный движок--value()/--modifier()для функционального@utility, более строгая проверка имен@utilityи параметрpolyfillsуtw::compile().
1.6.1
- Новое: утилита
container(width: 100%и одинmax-widthдля каждой контрольной точки). - Составные переменные
--tw-*(перемещение, масштабирование, поворот, наклон, фильтры и другие) теперь регистрируются в@property. Поэтому таблицы стилей получают соответствующие правила@property, а преобразования, напримерtranslate-x-7, применяются в браузере.
1.6.0
- Новое: постоянный кэш состояния компилятора (
stateCacheFileвtw::compile()иTailwindCompiler,StateCache\compileCssCached()), а также отдельные функцииparseCssState()/finalizeCssState()/compileParsed(). Существующие вызовы работают точно так же, как раньше.
1.5.0
- Подклассы
TailwindCompiler, переопределяющиеgenerate()илиcss(), должны добавить необязательный параметрbool $minify = false; PHP отклоняет переопределения, в которых опущен необязательный параметр родительского класса. - Минифицированный вывод создается сериализатором, поэтому его байты немного отличаются от 1.4.x (кэш минифицированного вывода сбрасывается один раз).
- Новое:
generateExact()иcssExact()позволяют получать CSS для каждой страницы с помощью одного долго живущего компилятора.