Zmogljivost in testiranje
TailwindPHP daje prednost pravilnosti. Sprememba, značilna za PHP, ki pospeši delovanje, ne da bi spremenila izhod, se uporabi in označi z @port-deviation:performance. Enakovrednost z TailwindCSS ni samoumevna — nenehno se preverja z lastno zbirko testov Tailwind.
Zmogljivost
Prenos PHP daje prednost ujemanju z izhodom TailwindCSS pred surovo prepustnostjo, izvirni TypeScript pa ostane hitrejši ne glede na to — JIT v V8 prevede najbolj obremenjene poti v izvorno kodo, česar PHP ne more doseči. Če za vsako zahtevo ali stran ustvarjate CSS, znova uporabite en prevajalnik (glejte generateExact()) in ohranite njegovo stanje ob vzpostavitvi z stateCacheFile.
Nekaj najbolj obremenjenih poti ima ročno uglašene optimizacije, ki ohranijo povsem enak izhod:
ast.phptoCss()— delčke zbira v polju in jih enkrat pretvori v niz zimplode, namesto da bi večkrat združeval nize; uporablja tudi vnaprej izračunane nize za zamike.css-parser.php— primerja znake neposredno, ne prekord(), ter spremlja dolžine medpomnilnika, namesto da bi znova izračunavalstrlen().
Oboje je dokumentirano z @port-deviation:performance in preverjeno z zbirko testov — ne more spremeniti ustvarjenega CSS.
Primerjalni preizkusi
V imeniku benchmarks/ je orodje za primerjavo. Zaženite ga takole:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Vzorčni rezultati na PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| Primerjalni preizkus | PHP | TypeScript |
|---|---|---|
css-parser v preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× hitreje) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× hitreje) |
TypeScript je pričakovano hitrejši pri teh nizkonivojskih operacijah. Za ustvarjanje CSS za celotno stran — kar je dejanski primer uporabe — je zmogljivost PHP ustrezna (v vzorčnem zagonu približno 14 ms na stran). Pri ponovljenem enakem vhodu strošek v celoti odpravi datotečni predpomnilnik.
Testiranje in enakovrednost
Testi zagotavljajo, da prenos PHP ustvari enak izhod kot TailwindCSS. Uporabljata se dva pristopa.
1. Testi z izluščanjem. Skripti v test-coverage/ razčlenita lastne datoteke .test.ts projekta TailwindCSS in izluščita testne primere v JSON. Nato PHPUnit te primere izvede prek TailwindPHP in primerja izhod s pričakovanim CSS. Ker pričakovani rezultati izvirajo neposredno iz izvornega projekta, se vsako odstopanje v vedenju PHP pokaže kot napaka. Testi pokrivajo zapletena področja: pripomočke, različice, integracijo, funkcije CSS in teste na ravni brskalnika ui.spec.
2. Ročno preneseni enotski testi. Preprostejše testne datoteke TypeScript (AST, razčlenjevanje CSS, ubežni znaki, razčlenjevanje kandidatov in vrednosti …) so neposredno prenesene v PHP in shranjene ob izvorni kodi kot *.test.php; njihova struktura in trditve posnemajo izvirnike.
Cikel je izlušči → zaženi → preveri: znova izluščite primere iz trenutne reference TailwindCSS, zaženite zbirko in vsako odstopanje povzroči neuspeh. Tako prenos ostaja usklajen z izvirnim projektom, posodobitev TailwindCSS pa je mogoče preveriti samodejno, namesto z ročnim pregledom. Odstopanja povzročijo neuspeh v CI.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
Od izdaje 1.7.0 je uspešno opravljenih 4,427 testov (referenca TailwindCSS v4.3.3):
| Zbirka | Testi | Vir |
|---|---|---|
Izluščene zbirke TailwindCSS (pripomočki 706, različice 164, index 148, css-functions 64, ui.spec 68) |
1,150 | izluščeno iz .test.ts / .spec.ts |
Pokritost API (pripomočki, modifikatorji, različice, direktive, vtičniki, uvozi, @source, predpomnjenje, javni API) |
2,252 | tests/ |
| Enotski testi ob izvorni kodi (razčlenjevalnik, AST, kandidati, tema, pripomočki, razčlenjevalnik izbirnikov, transformacije lightningcss, minifikator) | 767 | prenosi *.test.php in testi, specifični za PHP |
| CLI (razčlenjevanje argumentov, izhod, gradnje) | 84 | tests/Cli*Test.php |
| Prenosi vtičnikov (tipografija, obrazci) | 45 | ob vtičnikih *.test.php |
| Spremljevalne knjižnice (clsx, tailwind-merge, CVA) | 129 | referenčne zbirke |
Kakovost kode
Oblikovanje in statična analiza se izvajata s skripti Composer:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan deluje na stopnji 4 (phpstan.neon), z nekaj prezrtimi vzorci za dinamične oblike polj, ki jih uporablja arhitektura na podlagi funkcij. Analizirajo se vse izvorne datoteke, testne pa so izključene.
Za zgradbo, ki jo preverjajo ti testi, in mesta, kjer so zabeležena odstopanja, glejte Arhitektura.