Suorituskyky ja testaus
TailwindPHP optimoi ensisijaisesti oikeellisuuden. Kun PHP-kohtainen muutos nopeuttaa toimintaa tulostetta muuttamatta, se otetaan käyttöön ja merkitään tunnisteella @port-deviation:performance. Vastaavuutta TailwindCSSn kanssa ei oleteta — se tarkistetaan jatkuvasti Tailwindn omalla testisarjalla.
Suorituskyky
PHP-porttauksen etusijalla on TailwindCSS-tulosteen vastaavuus raakasuoritusnopeuteen nähden, ja alkuperäinen TypeScript on joka tapauksessa nopeampi — V8n JIT kääntää kuumat koodipolut natiivikoodiksi tavalla, johon PHP ei pysty. Jos CSS luodaan jokaisella pyynnöllä tai sivulla, käytä samaa kääntäjää uudelleen (katso generateExact()) ja säilytä sen alustustila käyttämällä kohdetta stateCacheFile.
Muutamassa kuumassa koodipolussa on käsin viritettyjä optimointeja, jotka säilyttävät tulosteen ennallaan:
ast.phptoCss()— kokoaa osat taulukkoon ja suorittaaimploden kerran toistuvan merkkijonojen yhdistämisen sijaan sekä käyttää valmiiksi muodostettuja sisennysmerkkijonoja.css-parser.php— vertaa merkkejä suoraanord()n kautta kulkemisen sijaan ja seuraa puskurien pituuksiastrlen()n uudelleenlaskennan sijaan.
Molemmat on dokumentoitu tunnisteella @port-deviation:performance ja testisarja varmistaa ne — ne eivät voi muuttaa luotua CSSa.
Vertailutestit
Hakemisto benchmarks/ sisältää vertailutestikehikon. Suorita se näin:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Esimerkkituloksia ympäristössä PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| Vertailutesti | PHP | TypeScript |
|---|---|---|
css-parser ympäristössä preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× nopeampi) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× nopeampi) |
TypeScript on odotetusti nopeampi näissä matalan tason operaatioissa. Koko sivun CSS-generoinnissa – varsinaisessa käyttötapauksessa – PHP suoriutuu riittävän hyvin (esimerkkiajossa noin 14 ms sivua kohden). Kun syöte on toistuvasti sama, tiedostovälimuisti poistaa kustannuksen kokonaan.
Testaus ja vastaavuus
Testien tarkoitus on taata, että PHP-porttaus tuottaa saman tulosteen kuin TailwindCSS. Kaksi menetelmää täydentää toisiaan.
1. Poimintaan perustuvat testit. Hakemiston test-coverage/ skriptit jäsentävät TailwindCSSn omat .test.ts-tiedostot ja poimivat testitapaukset JSONiin. PHPUnit suorittaa tapaukset TailwindPHPn kautta ja vertaa tulostetta odotettuun CSSiin. Koska odotukset tulevat suoraan alkupään projektista, poikkeama PHPn toiminnassa havaitaan virheenä. Testit kattavat monimutkaiset osa-alueet: apufunktiot, variantit, integraation, CSS-funktiot ja selaintason ui.spec-testit.
2. Käsin portatut yksikkötestit. Yksinkertaisemmat TypeScript-testitiedostot (AST, CSS-jäsennys, escapointi, ehdokkaiden jäsennys, arvojen jäsennys, …) portataan suoraan kohteeseen PHP, ja ne sijaitsevat lähdekoodin vieressä *.test.php-tiedostoina alkuperäisten rakennetta ja tarkistuksia mukaillen.
Silmukka on poimi → suorita → varmista: poimi testit uudelleen nykyisestä TailwindCSS-viitteestä, suorita sarja, ja poikkeamat aiheuttavat virheen. Näin porttaus pysyy ajan tasalla alkupään projektin kanssa, ja TailwindCSSn päivitys voidaan validoida mekaanisesti tarkastelun sijaan. Poikkeama aiheuttaa virheen CI:ssä.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
Julkaisun 1.7.0 (TailwindCSS v4.3.3-viite) yhteydessä läpäistään 4,427 testiä:
| Sarja | Testit | Lähde |
|---|---|---|
Poimitut TailwindCSS-sarjat (apufunktiot 706, variantit 164, index 148, css-functions 64, ui.spec 68) |
1,150 | poimittu lähteistä .test.ts / .spec.ts |
API-kattavuus (apufunktiot, muuntimet, variantit, direktiivit, lisäosat, tuonnit, @source, välimuisti, julkiset APIt) |
2,252 | tests/ |
| Lähdekoodin viereiset yksikkötestit (jäsennin, AST, ehdokkaat, teema, apufunktiot, valitsinjäsennin, lightningcss-muunnokset, pienentäjä) | 767 | *.test.php-porttaukset ja PHP-kohtaiset testit |
| CLI (argumenttien jäsennys, tulosteet, koontiversiot) | 84 | tests/Cli*Test.php |
| Lisäosaporttaukset (typografia, lomakkeet) | 45 | *.test.php lisäosien vieressä |
| Kumppanikirjastot (clsx, tailwind-merge, CVA) | 129 | viitesarjat |
Koodin laatu
Muotoilu ja staattinen analyysi suoritetaan Composer-skripteillä:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan suoritetaan tasolla 4 (phpstan.neon), ja käytössä on lyhyt luettelo ohitettavia malleja funktionaalisen arkkitehtuurin käyttämille dynaamisille taulukkorakenteille. Kaikki lähdetiedostot analysoidaan, mutta testitiedostot jätetään pois.
Katso Arkkitehtuuri, jossa kuvataan testien varmistama rakenne ja kirjataan poikkeamat.