Prestaties en tests
TailwindPHP geeft prioriteit aan juistheid. Waar een wijziging specifiek voor PHP de prestaties verbetert zonder de uitvoer te veranderen, wordt die toegepast en gemarkeerd als @port-deviation:performance. Overeenkomst met TailwindCSS wordt niet verondersteld, maar voortdurend gecontroleerd met de eigen testsuite van Tailwind.
Prestaties
De PHP-port geeft voorrang aan uitvoer die overeenkomt met die van TailwindCSS boven pure doorvoersnelheid, en de originele TypeScript blijft hoe dan ook sneller — de JIT van V8 compileert de drukst gebruikte codepaden naar native code, iets wat PHP niet kan evenaren. Als CSS per verzoek of pagina wordt gegenereerd, hergebruik dan één compiler (zie generateExact()) en bewaar de initialisatiestatus met stateCacheFile.
Enkele druk gebruikte codepaden zijn handmatig geoptimaliseerd, waarbij de uitvoer identiek blijft:
ast.phptoCss()— verzamelt fragmenten in een array enimplodeze één keer, in plaats van strings herhaaldelijk samen te voegen, en gebruikt vooraf berekende inspringstrings.css-parser.php— vergelijkt tekens rechtstreeks in plaats van viaord(), en houdt bufferlengtes bij in plaats vanstrlen()telkens opnieuw te berekenen.
Beide zijn gedocumenteerd met @port-deviation:performance en afhankelijk gemaakt van de testsuite — ze kunnen de gegenereerde CSS niet veranderen.
Benchmarks
De map benchmarks/ bevat een vergelijkingsscript. Voer het zo uit:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Voorbeeldresultaten op PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| Benchmark | PHP | TypeScript |
|---|---|---|
css-parser op preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× sneller) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× sneller) |
TypeScript is sneller voor deze low-levelbewerkingen, zoals verwacht. Voor het genereren van CSS voor een volledige pagina — het daadwerkelijke gebruik — zijn de prestaties van PHP toereikend (ongeveer 14 ms per pagina in de voorbeeldrun). Bij herhaalde identieke invoer neemt de bestandscache de kosten volledig weg.
Tests en overeenkomst
Tests garanderen dat de PHP-port dezelfde uitvoer produceert als TailwindCSS. Twee benaderingen vullen elkaar aan.
1. Tests op basis van extractie. Scripts in test-coverage/ parsen de eigen .test.ts-bestanden van TailwindCSS en halen de testgevallen eruit naar JSON. PHPUnit voert die gevallen vervolgens uit via TailwindPHP en vergelijkt de uitvoer met de verwachte CSS. Omdat de verwachtingen rechtstreeks uit de upstream-bron komen, leidt elke afwijking in het gedrag van PHP tot een fout. Deze tests dekken de complexe onderdelen: hulpfuncties, varianten, integratie, functies van CSS en browsertests op het niveau van ui.spec.
2. Handmatig geporteerde unittests. Eenvoudigere TypeScript-testbestanden (AST, CSS-parsing, escaping, het parsen van kandidaten en waarden, …) worden rechtstreeks naar PHP geporteerd en staan naast hun broncode als *.test.php. Daarbij volgen ze de structuur en beweringen van de oorspronkelijke tests.
De cyclus is extraheren → uitvoeren → controleren: extraheer opnieuw uit de actuele TailwindCSS-referentie, voer de testsuite uit en elke afwijking leidt tot een fout. Zo blijft de port synchroon met de upstream-bron en kan een update van TailwindCSS mechanisch worden gevalideerd in plaats van handmatig geïnspecteerd. Afwijkingen laten de CI mislukken.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
Er zijn 4,427 tests geslaagd volgens release 1.7.0 (referentie TailwindCSS v4.3.3):
| Suite | Tests | Bron |
|---|---|---|
Geëxtraheerde TailwindCSS-suites (hulpfuncties 706, varianten 164, index 148, css-functions 64, ui.spec 68) |
1,150 | geëxtraheerd uit .test.ts / .spec.ts |
API-dekking (hulpfuncties, modifiers, varianten, richtlijnen, plugins, imports, @source, caching, publieke API) |
2,252 | tests/ |
| Unittests naast de broncode (parser, AST, kandidaten, thema, hulpfuncties, selectorparser, lightningcss-transformaties, minifier) | 767 | *.test.php-ports en PHP-specifieke tests |
| CLI (argumentparsing, uitvoer, builds) | 84 | tests/Cli*Test.php |
| Plugin-ports (typography, forms) | 45 | *.test.php naast de plugins |
| Companion libraries (clsx, tailwind-merge, CVA) | 129 | referentiesuites |
Codekwaliteit
Opmaak en statische analyse worden uitgevoerd met scripts van Composer:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan draait op niveau 4 (phpstan.neon), met een korte lijst genegeerde patronen voor de dynamische arraystructuren die de functiegebaseerde architectuur gebruikt. Alle bronbestanden worden geanalyseerd; testbestanden zijn uitgesloten.
Zie Architectuur voor de structuur die deze tests controleren en waar afwijkingen worden vastgelegd.