Liigu sisu juurde

Jõudlus ja testimine

TailwindPHP seab esikohale õigsuse. Kui PHP-põhine muudatus kiirendab tööd väljundit muutmata, võetakse see kasutusele ja märgitakse tähisega @port-deviation:performance. Samaväärsust TailwindCSS-iga ei eeldata — seda kontrollitakse pidevalt Tailwind enda testikomplekti abil.

Jõudlus

PHP port seab prioriteediks TailwindCSS väljundiga sobitumise, mitte toorkiiruse, ning algne TypeScript on igal juhul kiirem — V8 JIT kompileerib kuumad kooditeed masinkoodiks viisil, mida PHP ei suuda jäljendada. Kui CSS luuakse iga päringu või lehe jaoks, taaskasuta üht kompilaatorit (vt generateExact()) ja salvesta selle loomise olek püsivalt vahemällu (stateCacheFile).

Mõned kuumad kooditeed kasutavad käsitsi häälestatud optimeerimisi, mis säilitavad identse väljundi:

  • ast.php toCss() — kogub fragmendid massiivi ja implode-ib need ühe korraga, mitte ei liida korduvalt stringe kokku, ning kasutab ette arvutatud taande stringe.
  • css-parser.php — võrdleb märke otse, kasutamata ord()-it, ning jälgib puhvri pikkust, selle asemel et strlen() uuesti arvutada.

Mõlemad on dokumenteeritud tähisega @port-deviation:performance ja testikomplekt kontrollib neid — need ei saa genereeritud CSS muuta.

Jõudlustestid

Võrdluse tööriistakomplekt asub kataloogis benchmarks/. Käivita see nii:

Shell
composer bench         # PHP vs TypeScript
composer bench:save    # write benchmarks/results.json

Näidistulemused keskkonnas PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

Jõudlustest PHP TypeScript
css-parser kataloogis preflight.css ~816 op/s ~15.45K op/s (≈20× kiirem)
toCss ~65.85K op/s ~2.59M op/s (≈39× kiirem)

TypeScript on nende madala taseme toimingute puhul ootuspäraselt kiirem. Täislehe CSS genereerimiseks — tegelikuks kasutusjuhuks — on PHP jõudlus piisav (näidiskäivituses umbes 14 ms lehe kohta). Korduva identse sisendi korral kaob failivahemälu abil kulu täielikult.

Testimine ja samaväärsus

Testid tagavad, et PHP port toodab sama väljundi nagu TailwindCSS. Koos kasutatakse kaht lähenemist.

1. Eraldamisel põhinevad testid. Kataloogi test-coverage/ skriptid pargivad TailwindCSS enda .test.ts failid ja eraldavad testjuhtumid JSON-i jaoks. Seejärel suunab PHPUnit need juhtumid läbi TailwindPHP ning võrdleb väljundit eeldatava CSS-ga. Kuna eeldused pärinevad otse algsest projektist, ilmneb iga erinevus PHP käitumises veana. Need testid katavad keerukamad osad: utiliidid, variandid, integratsiooni, CSS funktsioonid ja brauseritaseme ui.spec testid.

2. Käsitsi üle kantud ühiktestid. Lihtsamad TypeScript testifailid (AST, CSS parsimine, paomärgistamine, kandidaatide parsimine, väärtuste parsimine, …) kantakse otse üle PHP-i ja asuvad lähtekoodi kõrval failidena *.test.php, järgides algsete testide struktuuri ja väiteid.

Tsükkel on eraldamine → käivitamine → kontrollimine: eralda testid praegusest TailwindCSS-i viitest uuesti, käivita komplekt ja kõik erinevused annavad vea. Nii püsib port algse projektiga samas taktis ning TailwindCSS uuendust saab kontrollida automaatselt, mitte käsitsi üle vaadates. Erinevused põhjustavad CI-s vea.

Shell
composer extract   # re-extract test cases from the TailwindCSS reference
composer test      # run the full suite

Väljalaske 1.7.0 seisuga on edukalt läbitud 4,427 testi (viide TailwindCSS v4.3.3):

Komplekt Testid Allikas
Eraldatud TailwindCSS komplektid (utiliidid 706, variandid 164, indeks 148, css-functions 64, ui.spec 68) 1,150 eraldatud kataloogidest .test.ts / .spec.ts
API katvus (utiliidid, modifikaatorid, variandid, direktiivid, pluginad, impordid, @source, vahemällu salvestamine, avalik API) 2,252 tests/
Lähtekoodi kõrval asuvad ühikutestid (parser, AST, kandidaadid, teema, utiliidid, selektoriparser, lightningcss-i teisendused, minimeerija) 767 *.test.php pordid ja PHP-i testid
CLI (argumentide parsimine, väljund, järgud) 84 tests/Cli*Test.php
Pluginate pordid (tüpograafia, vormid) 45 *.test.php pluginate kõrval
Kaasnevad teegid (clsx, tailwind-merge, CVA) 129 võrdlustestide komplektid

Koodi kvaliteet

Vormindamine ja staatiline analüüs käivitatakse skriptide Composer kaudu:

Shell
composer lint      # Pint --test  (check formatting)
composer format    # Pint         (fix formatting)
composer analyse   # PHPStan      (static analysis, level 4)
composer quality   # lint + analyse

PHPStan töötab tasemel 4 (phpstan.neon), kasutades lühikest loendit dünaamiliste massiivikujude ignoreerimise mustritest, mida funktsioonipõhine arhitektuur kasutab. Analüüs hõlmab kõiki lähtefaile, kuid jätab testifailid välja.

Testidega kontrollitava struktuuri ja dokumenteeritud kõrvalekallete kohta vaata lehte Arhitektuur.