Preskoči na vsebino

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.php toCss() — delčke zbira v polju in jih enkrat pretvori v niz z implode, namesto da bi večkrat združeval nize; uporablja tudi vnaprej izračunane nize za zamike.
  • css-parser.php — primerja znake neposredno, ne prek ord(), ter spremlja dolžine medpomnilnika, namesto da bi znova izračunaval strlen().

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:

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

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

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