Prestanda & testning
TailwindPHP prioriterar korrekthet. Ändringar specifika för PHP som ökar hastigheten utan att ändra utdata tillämpas och märks med @port-deviation:performance. Likvärdighet med TailwindCSS tas inte för given – den verifieras kontinuerligt mot Tailwinds egen testsvit.
Prestanda
Portningen av PHP prioriterar att matcha utdata från TailwindCSS framför rå genomströmning, och originalet TypeScript är ändå snabbare – JIT-kompilatorn i V8 kompilerar de mest använda kodvägarna till maskinkod på ett sätt som PHP inte kan matcha. För CSS som genereras per begäran eller sida återanvänder du en kompilator (se generateExact()) och sparar dess konstruktionstillstånd med stateCacheFile.
Några mycket använda kodvägar har handoptimerats så att de bevarar identisk utdata:
ast.phptoCss()– samlar fragment i en array och anroparimplodeen gång i stället för att upprepade gånger slå ihop strängar, och använder förberäknade indragna strängar.css-parser.php– jämför tecken direkt i stället för att gå viaord(), och håller reda på buffertlängder i stället för att räkna omstrlen().
Båda dokumenteras med @port-deviation:performance och styrs av testsviten – de kan inte ändra genererad CSS.
Riktmärken
Katalogen benchmarks/ innehåller ett jämförelseverktyg. Kör det med:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Exempelresultat på PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| Riktmärke | PHP | TypeScript |
|---|---|---|
css-parser på preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× snabbare) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× snabbare) |
TypeScript är snabbare för dessa lågnivåoperationer, som väntat. För generering av CSS för hela sidor – det faktiska användningsfallet – är prestandan i PHP tillräcklig (cirka 14 ms per sida i provkörningen). Vid upprepad identisk indata eliminerar filcachen kostnaden helt.
Testning och likvärdighet
Tester säkerställer att portningen av PHP ger samma utdata som TailwindCSS. Två metoder kompletterar varandra.
1. Extraktionsbaserade tester. Skript i test-coverage/ tolkar TailwindCSSs egna .test.ts-filer och extraherar testfallen till JSON. Därefter kör PHPUnit fallen genom TailwindPHP och jämför utdata med förväntad CSS. Eftersom förväntningarna kommer direkt från uppströms syns varje avvikelse i PHPs beteende som ett fel. Tester täcker komplexa delar: verktyg, varianter, integration, CSS-funktioner och tester på webbläsarnivå för ui.spec.
2. Handporterade enhetstester. Enklare TypeScript-testfiler (AST, CSS-tolkning, escaping, kandidattolkning, värdetolkning, …) porteras direkt till PHP och ligger bredvid källkoden som *.test.php. De speglar originalens struktur och kontroller.
Testloopen är extrahera → kör → verifiera: extrahera på nytt från den aktuella referensen TailwindCSS, kör sviten och upptäck alla avvikelser. Det håller portningen i takt med uppströms och innebär att en uppdatering av TailwindCSS kan verifieras mekaniskt i stället för genom granskning. Avvikelser gör att CI misslyckas.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
Från och med version 1.7.0 (referensen TailwindCSS v4.3.3) är 4,427 tester godkända:
| Testsvit | Tester | Källa |
|---|---|---|
Extraherade TailwindCSS-sviter (verktyg 706, varianter 164, index 148, css-funktioner 64, ui.spec 68) |
1,150 | extraherade från .test.ts / .spec.ts |
API-täckning (verktyg, modifierare, varianter, direktiv, plugin-program, importer, @source, cachning, publikt API) |
2,252 | tests/ |
| Enhetstester intill källkoden (parser, AST, kandidater, tema, verktyg, selektorparser, lightningcss-transformeringar, minifierare) | 767 | portningar av *.test.php och tester specifika för PHP |
| CLI (argumenttolkning, utdata, byggen) | 84 | tests/Cli*Test.php |
| Plugin-portningar (typografi, formulär) | 45 | *.test.php intill plugin-programmen |
| Kompletterande bibliotek (clsx, tailwind-merge, CVA) | 129 | referenssviter |
Kodkvalitet
Formatering och statisk analys körs via skript för Composer:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan körs på nivå 4 (phpstan.neon), med en kort lista ignorerade mönster för de dynamiska arrayformer som den funktionsbaserade arkitekturen använder. Alla källfiler analyseras; testfiler undantas.
Se Arkitektur för strukturen som testerna verifierar och var avvikelser dokumenteras.