Ugrás a tartalomhoz

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.php toCss() — töredékeket gyűjt egy tömbbe, majd egyszer végzi el a implode mű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 az ord() 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:

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

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

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