Siirry sisältöön

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.php toCss() — kokoaa osat taulukkoon ja suorittaa imploden kerran toistuvan merkkijonojen yhdistämisen sijaan sekä käyttää valmiiksi muodostettuja sisennysmerkkijonoja.
  • css-parser.php — vertaa merkkejä suoraan ord()n kautta kulkemisen sijaan ja seuraa puskurien pituuksia strlen()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:

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

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

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