Производителност и тестване
TailwindPHP поставя коректността на първо място. Когато промяна, специфична за PHP, ускорява работата, без да променя изхода, тя се прилага и се обозначава с @port-deviation:performance. Съответствието с TailwindCSS не се приема на доверие — то се проверява постоянно спрямо собствения набор от тестове на Tailwind.
Производителност
Портът PHP дава приоритет на съвпадението с изхода на TailwindCSS пред суровата пропускателна способност, а оригиналът на TypeScript остава по-бърз при всички положения — JIT на V8 компилира често изпълняваните пътища до машинен код по начин, който PHP не може да постигне. За CSS, генериран при всяка заявка или страница, използвайте повторно един компилатор (вижте generateExact()) и запазете състоянието му при създаване чрез stateCacheFile.
Няколко често изпълнявани пътя имат ръчно настроени оптимизации, които запазват идентичния изход:
ast.phptoCss()— натрупва фрагменти в масив и извикваimplodeведнъж, вместо да конкатенира низове многократно, както и използва предварително изчислени низове за отстъп.css-parser.php— сравнява символите директно, вместо да използваord(), и следи дължините на буферите, вместо да преизчисляваstrlen().
И двете са документирани с @port-deviation:performance и проверяват резултатите спрямо набора от тестове — те не могат да променят генерирания CSS.
Бенчмаркове
Директорията benchmarks/ съдържа програма за сравнение. Стартирайте я така:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Примерни резултати при PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| Бенчмарк | PHP | TypeScript |
|---|---|---|
css-parser върху preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× по-бързо) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× по-бързо) |
TypeScript е по-бърз при тези операции на ниско ниво, както се очаква. За генериране на CSS на цяла страница — реалният сценарий на употреба — производителността на PHP е достатъчна (около 14 ms на страница в примерното изпълнение). При многократно подаване на един и същ вход файловият кеш премахва разхода изцяло.
Тестване и съответствие
Тестовете гарантират, че портът PHP генерира същия изход като TailwindCSS. Два подхода работят заедно.
1. Тестове чрез извличане. Скриптовете в test-coverage/ анализират собствените файлове .test.ts на TailwindCSS и извличат тестовите случаи в JSON. След това PHPUnit подава тези случаи към TailwindPHP и сравнява изхода с очаквания CSS. Тъй като очакваните резултати идват директно от upstream, всяко отклонение в поведението на PHP се проявява като неуспешен тест. Тестовете обхващат сложните области: помощни класове, варианти, интеграция, функции CSS и тестове ui.spec на ниво браузър.
2. Ръчно пренесени модулни тестове. По-простите тестови файлове на TypeScript (AST, анализ на CSS, екраниране, анализ на кандидати, анализ на стойности, …) се пренасят директно в PHP и се съхраняват до съответния изходен код като *.test.php, като повтарят структурата и проверките на оригиналите.
Цикълът е извлечи → изпълни → провери: извлечете тестовете отново от актуалната референтна версия на TailwindCSS, изпълнете набора и всяко отклонение ще доведе до неуспех. Така портът остава синхронизиран с upstream и актуализация на TailwindCSS може да се провери автоматично, вместо чрез преглед. При отклонение CI се проваля.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
Към издание 1.7.0 има 4,427 преминали теста (референтна версия TailwindCSS v4.3.3):
| Набор | Тестове | Източник |
|---|---|---|
Извлечени TailwindCSS набора (utilities 706, variants 164, index 148, css-functions 64, ui.spec 68) |
1,150 | извлечени от .test.ts / .spec.ts |
Покритие API (utilities, modifiers, variants, directives, plugins, imports, @source, кеширане, публични API) |
2,252 | tests/ |
| Модулни тестове до изходния код (parser, AST, кандидати, тема, utils, parser на селектори, lightningcss трансформации, minifier) | 767 | портове и специфични за PHP тестове *.test.php |
| CLI (разбор на аргументи, изход, компилации) | 84 | tests/Cli*Test.php |
| Портове на плъгини (типография, формуляри) | 45 | *.test.php до плъгините |
| Съпътстващи библиотеки (clsx, tailwind-merge, CVA) | 129 | референтни набори |
Качество на кода
Форматирането и статичният анализ се изпълняват чрез скриптовете Composer:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan се изпълнява на ниво 4 (phpstan.neon), с кратък списък от игнорирани шаблони за динамичните форми на масиви, използвани от архитектурата, базирана на функции. Анализират се всички изходни файлове; тестовите файлове се изключват.
За структурата, която тези тестове проверяват, и местата, където са записани отклонения, вижте Архитектура.