Hoppa till innehåll

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.php toCss() – samlar fragment i en array och anropar implode en 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å via ord(), och håller reda på buffertlängder i stället för att räkna om strlen().

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:

Shell
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.

Shell
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:

Shell
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.