Teljesítmény és tesztelés
A TailwindPHP elsődlegesen a helyességre törekszik. Ha egy PHP-specifikus módosítás gyorsítja a működést a kimenet megváltoztatása nélkül, alkalmazzuk, és @port-deviation:performance jelöléssel látjuk el. A TailwindCSS rendszerrel való egyezést nem feltételezzük — folyamatosan ellenőrizzük a Tailwind saját tesztcsomagjával.
Teljesítmény
A PHP port az TailwindCSS kimenetének egyezését helyezi előtérbe a nyers sebességgel szemben, az eredeti TypeScript pedig ettől függetlenül gyorsabb marad — a V8 JIT-fordítója natív kódra fordítja a gyakran használt kódrészeket, amire a PHP nem képes. A kérésenként vagy oldalanként előállított CSS esetében használjon újra egy fordítót (lásd: generateExact()), és őrizze meg az inicializálási állapotát a stateCacheFile segítségével.
Néhány gyakran használt kódrészlet kézzel hangolt optimalizálásokat tartalmaz, amelyek azonos kimenetet biztosítanak:
ast.phptoCss()— töredékeket gyűjt egy tömbbe, majd egyszer végzi el aimplodeműveletet az ismételt karakterlánc-összefűzés helyett, és előre kiszámított behúzási karakterláncokat használ.css-parser.php— karaktereket közvetlenül hasonlít össze azord()használata helyett, és újraszámítás helyett nyomon követi a pufferhosszakat:strlen().
Mindkettőt @port-deviation:performance dokumentálja, és a tesztcsomag eredményétől teszi függővé — nem változtathatják meg a létrehozott CSS kimenetet.
Teljesítménymérések
A benchmarks/ könyvtár összehasonlító tesztkörnyezetet tartalmaz. Futtassa így:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Példaeredmények PHP 8.4.5 / Node.js v22.17.0 környezetben (Apple M1):
| Teljesítménymérés | PHP | TypeScript |
|---|---|---|
css-parser a következőn: preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× gyorsabb) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× gyorsabb) |
Az TypeScript a várakozásoknak megfelelően gyorsabb ezeknél az alacsony szintű műveleteknél. Teljes oldalak CSS előállításakor — ez a tényleges felhasználási eset — a PHP teljesítménye megfelelő (a mintafuttatásban oldalanként körülbelül 14 ms). Az ismétlődő, azonos bemeneteknél a fájlgyorsítótár teljesen kiküszöböli a költséget.
Tesztelés és egyezés
A tesztek garantálják, hogy a PHP portja ugyanazt a kimenetet állítja elő, mint a TailwindCSS. Két módszer egészíti ki egymást.
1. Kinyerésen alapuló tesztek. A test-coverage/ szkriptjei feldolgozzák a TailwindCSS saját .test.ts fájljait, és kinyerik belőlük a teszteseteket a JSON számára. Ezután a PHPUnit végigfuttatja ezeket az eseteket a TailwindPHP rendszeren, és összehasonlítja a kimenetet a várt CSS értékkel. Mivel az elvárások közvetlenül az upstream forrásból származnak, a PHP működésétől való bármilyen eltérés hibaként jelenik meg. Ezek a tesztek az összetettebb területeket fedik le: segédfüggvények, variánsok, integráció, CSS függvények és böngészőszintű ui.spec tesztek.
2. Kézzel portolt egységtesztek. Az egyszerűbb TypeScript tesztfájlokat (AST, CSS-feldolgozás, escape-elés, jelöltfeldolgozás, értékfeldolgozás, …) közvetlenül portoljuk PHP környezetbe, és a forrásuk mellett *.test.php fájlként tároljuk, az eredetiek felépítését és ellenőrzéseit követve.
A ciklus: kinyerés → futtatás → ellenőrzés: nyerje ki újra a teszteket az aktuális TailwindCSS referenciából, futtassa le a tesztcsomagot, és az eltérések hibát okoznak. Ez szinkronban tartja a portot az upstream forrással, és lehetővé teszi, hogy egy TailwindCSS frissítését kézi átvizsgálás helyett géppel ellenőrizzük. Az eltérések meghiúsítják a CI-folyamatot.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
A 1.7.0 kiadás (TailwindCSS v4.3.3 referencia) alapján 4,427 sikeres teszt van:
| Csomag | Tesztek | Forrás |
|---|---|---|
Kinyert TailwindCSS csomagok (segédeszközök 706, változatok 164, index 148, css-functions 64, ui.spec 68) |
1,150 | kinyerve innen: .test.ts / .spec.ts |
API lefedettség (segédeszközök, módosítók, változatok, direktívák, bővítmények, importok, @source, gyorsítótárazás, nyilvános API) |
2,252 | tests/ |
| A forrás mellett található egységtesztek (feldolgozó, AST, jelöltek, téma, segédeszközök, szelektorfeldolgozó, lightningcss-átalakítások, minifikáló) | 767 | *.test.php portok és PHP-specifikus tesztek |
| CLI (argumentumfeldolgozás, kimenet, összeállítások) | 84 | tests/Cli*Test.php |
| Bővítményportok (tipográfia, űrlapok) | 45 | *.test.php a bővítmények mellett |
| Kiegészítő könyvtárak (clsx, tailwind-merge, CVA) | 129 | referencia-csomagok |
Kódminőség
A formázás és a statikus elemzés a Composer szkriptjeivel fut:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
A PHPStan 4-es szinten fut (phpstan.neon); csak a függvényalapú architektúra által használt dinamikus tömbformák néhány mintája van kizárva. Minden forrásfájlt elemez, a tesztfájlokat viszont kihagyja.
A tesztek által ellenőrzött felépítésről és az eltérések rögzítésének helyéről lásd: Architektúra.