Treci la conținut

Performanță și testare

TailwindPHP optimizează în primul rând pentru corectitudine. Când o modificare specifică PHP accelerează execuția fără să schimbe rezultatul, aceasta este aplicată și marcată @port-deviation:performance. Paritatea cu TailwindCSS nu este presupusă — este verificată continuu cu suita de teste proprie a lui Tailwind.

Performanță

Portarea PHP prioritizează potrivirea rezultatului TailwindCSS în locul debitului brut, iar originalul TypeScript rămâne oricum mai rapid — compilatorul JIT al lui V8 compilează căile intens utilizate în cod nativ într-un mod pe care PHP nu îl poate egala. Pentru CSS generat la fiecare cerere sau pagină, reutilizați un singur compilator (consultați generateExact()) și persistați starea de inițializare cu stateCacheFile.

Câteva căi intens utilizate au optimizări ajustate manual care păstrează rezultatul identic:

  • ast.php toCss() — adună fragmente într-un tablou și le implode o singură dată, în loc să concateneze repetat șiruri, și folosește șiruri de indentare precomputate.
  • css-parser.php — compară caracterele direct, fără să treacă prin ord(), și urmărește lungimea bufferelor în loc să recalculeze strlen().

Ambele sunt documentate cu @port-deviation:performance și condiționate de suita de teste — nu pot modifica CSS generat.

Teste de performanță

Directorul benchmarks/ conține un instrument de comparare. Rulați-l astfel:

Shell
composer bench         # PHP vs TypeScript
composer bench:save    # write benchmarks/results.json

Rezultate de probă pe PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

Test de performanță PHP TypeScript
css-parser pe preflight.css ~816 ops/s ~15.45K ops/s (≈20× mai rapid)
toCss ~65.85K ops/s ~2.59M ops/s (≈39× mai rapid)

TypeScript este mai rapid pentru aceste operații de nivel scăzut, așa cum era de așteptat. Pentru generarea CSS a unei pagini întregi — cazul de utilizare real — performanța PHP este adecvată (aproximativ 14 ms per pagină în rularea de probă). Pentru intrări identice repetate, cache-ul de fișiere elimină complet acest cost.

Testare și paritate

Testele garantează că portarea PHP produce același rezultat ca TailwindCSS. Două abordări funcționează împreună.

1. Teste bazate pe extragere. Scripturile din test-coverage/ analizează fișierele .test.ts proprii ale lui TailwindCSS și extrag cazurile de test în JSON. Apoi, PHPUnit rulează cazurile prin TailwindPHP și compară rezultatul cu valoarea CSS așteptată. Deoarece așteptările provin direct din amonte, orice abatere de la comportamentul PHP devine vizibilă printr-un eșec. Aceste teste acoperă componentele complexe: utilitare, variante, integrare, funcții CSS și testele ui.spec la nivel de browser.

2. Teste unitare portate manual. Fișierele de testare TypeScript mai simple (AST, analiză sintactică CSS, escape, analiza candidaților, analiza valorilor, …) sunt portate direct în PHP și se află lângă sursa lor ca *.test.php, oglindind structura și aserțiunile originalelor.

Bucla este extrage → rulează → verifică: extrageți din nou din referința TailwindCSS actuală, rulați suita, iar orice abatere provoacă un eșec. Astfel, portarea rămâne sincronizată cu sursa din amonte, iar o actualizare TailwindCSS poate fi validată automat, în loc să fie verificată prin inspecție. Abaterile provoacă eșecul CI.

Shell
composer extract   # re-extract test cases from the TailwindCSS reference
composer test      # run the full suite

La versiunea 1.7.0 sunt 4,427 teste trecute (referința TailwindCSS v4.3.3):

Suită Teste Sursă
Suite TailwindCSS extrase (utilitare 706, variante 164, index 148, css-functions 64, ui.spec 68) 1,150 extrase din .test.ts / .spec.ts
Acoperirea API (utilitare, modificatori, variante, directive, pluginuri, importuri, @source, cache, API public) 2,252 tests/
Teste unitare lângă sursă (parser, AST, candidați, temă, utils, parser de selectori, transformări lightningcss, minificator) 767 portări *.test.php și teste specifice PHP
CLI (analiza argumentelor, rezultate, compilări) 84 tests/Cli*Test.php
Portări de pluginuri (typography, forms) 45 *.test.php lângă pluginuri
Biblioteci auxiliare (clsx, tailwind-merge, CVA) 129 suite de referință

Calitatea codului

Formatarea și analiza statică rulează prin scripturile 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 rulează la nivelul 4 (phpstan.neon), cu o listă scurtă de tipare ignorate pentru formele dinamice de tablou folosite de arhitectura bazată pe funcții. Sunt analizate toate fișierele sursă; fișierele de test sunt excluse.

Pentru structura verificată de aceste teste și locurile unde sunt consemnate abaterile, consultați Arhitectură.