Gå til indhold

Ydeevne og test

TailwindPHP prioriterer korrekthed. Når en ændring specifik for PHP øger hastigheden uden at ændre output, indføres den og markeres som @port-deviation:performance. Paritet med TailwindCSS antages ikke — den verificeres løbende mod Tailwinds egen testsuite.

Ydeevne

PHP-porteringen prioriterer at matche TailwindCSSs output over rå gennemløbshastighed, og den oprindelige TypeScript er stadig hurtigere — V8s JIT kompilerer de mest brugte kodeveje til native kode på en måde, som PHP ikke kan matche. Ved generering af CSS pr. forespørgsel eller side kan du genbruge én compiler (se generateExact()) og gemme dens opbygningstilstand med stateCacheFile.

Nogle få mest brugte kodeveje har håndoptimeringer, der bevarer identisk output:

  • ast.php toCss() — samler fragmenter i et array og implodeer én gang i stedet for gentagen strengsammenkædning, og bruger forudberegnede indrykningsstrenge.
  • css-parser.php — sammenligner tegn direkte i stedet for at gå gennem ord() og holder styr på bufferlængder i stedet for at genberegne strlen().

Begge er dokumenteret med @port-deviation:performance og kontrolleres mod testsuiten — de kan ikke ændre det genererede CSS.

Benchmarks

Mappen benchmarks/ indeholder et sammenligningsværktøj. Kør det med:

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

Eksempelresultater på PHP 8.4.5 / Node.js v22.17.0 (Apple M1):

Benchmark PHP TypeScript
css-parser på preflight.css ~816 ops/s ~15.45K ops/s (≈20× hurtigere)
toCss ~65.85K ops/s ~2.59M ops/s (≈39× hurtigere)

TypeScript er hurtigere til disse lavniveauoperationer, som forventet. Til generering af CSS for en hel side — det faktiske anvendelsesområde — er PHPs ydeevne tilstrækkelig (omkring 14 ms pr. side i testkørslen). Ved gentagne, identiske input fjerner filcachen omkostningen helt.

Test og paritet

Testene skal sikre, at PHP-porteringen giver samme output som TailwindCSS. To metoder supplerer hinanden.

1. Udtrækningsbaserede tests. Scripts i test-coverage/ fortolker TailwindCSSs egne .test.ts-filer og udtrækker testtilfældene til JSON. Derefter sender PHPUnit tilfældene gennem TailwindPHP og sammenligner outputtet med den forventede CSS. Forventningerne kommer direkte fra upstream, så enhver afvigelse i PHPs adfærd medfører en fejl. Testene dækker de komplekse områder: hjælpeprogrammer, varianter, integration, funktionerne CSS og browserens ui.spec-tests.

2. Håndporterede enhedstests. Enklere TypeScript-testfiler (AST, CSS-fortolkning, escaping, kandidatanalyse, værdianalyse, …) porteres direkte til PHP og ligger ved siden af deres kilde som *.test.php, med samme struktur og kontroller som originalerne.

Processen er udtræk → kør → verificer: udtræk på ny fra den aktuelle reference TailwindCSS, kør testsuiten, og enhver afvigelse medfører fejl. Sådan holdes porteringen synkroniseret med upstream, og en opdatering af TailwindCSS kan valideres automatisk i stedet for ved gennemgang. Afvigelser får CI til at fejle.

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

Der er 4,427 beståede tests fra og med udgivelse 1.7.0 (referencen TailwindCSS v4.3.3):

Suite Tests Kilde
Udtrukne TailwindCSS-suiter (hjælpefunktioner 706, varianter 164, indeks 148, css-funktioner 64, ui.spec 68) 1,150 udtrukket fra .test.ts / .spec.ts
API-dækning (hjælpefunktioner, modifikatorer, varianter, direktiver, plugins, importer, @source, caching, offentligt API) 2,252 tests/
Enhedstests ved siden af kilden (parser, AST, kandidater, tema, hjælpefunktioner, selector-parser, lightningcss-transformationer, minifier) 767 *.test.php-porte og tests specifikke for PHP
CLI (argumentparsing, output, builds) 84 tests/Cli*Test.php
Plugin-porte (typografi, formularer) 45 *.test.php ved siden af plugins
Tilhørende biblioteker (clsx, tailwind-merge, CVA) 129 referencesuiter

Kodekvalitet

Formatering og statisk analyse køres via Composer-scripts:

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

PHPStan køres på niveau 4 (phpstan.neon) med en kort liste over mønstre, der ignoreres for de dynamiske arraystrukturer, som den funktionsbaserede arkitektur bruger. Alle kildefiler analyseres; testfiler udelades.

Se Arkitektur for at få mere at vide om strukturen, disse tests verificerer, og hvor afvigelser registreres.