Performances et tests
TailwindPHP privilégie d'abord la conformité. Lorsqu'une modification propre à PHP accélère le traitement sans altérer la sortie, elle est appliquée et signalée par @port-deviation:performance. La parité avec TailwindCSS n'est pas présumée : elle est vérifiée en continu à l'aide de la suite de tests de Tailwind.
Performances
Le port PHP privilégie la conformité à la sortie de TailwindCSS plutôt que le débit brut, et l'original en TypeScript reste de toute façon plus rapide : le JIT de V8 compile les chemins critiques en code natif, ce que PHP ne peut égaler. Pour le CSS généré à chaque requête ou page, réutilisez un compilateur (voir generateExact()) et conservez son état de construction avec stateCacheFile.
Quelques chemins critiques bénéficient d'optimisations réglées à la main qui préservent une sortie identique :
ast.phptoCss()— accumule les fragments dans un tableau et lesimplodeen une seule fois au lieu de concaténer les chaînes à répétition, et utilise des chaînes d'indentation précalculées.css-parser.php— compare directement les caractères au lieu de passer parord(), et suit la longueur des tampons au lieu de recalculerstrlen().
Les deux sont documentées avec @port-deviation:performance et soumises à la suite de tests : elles ne peuvent pas modifier le CSS généré.
Benchmarks
Le répertoire benchmarks/ contient un banc d'essai comparatif. Lancez-le avec :
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Résultats indicatifs sur PHP 8.4.5 / Node.js v22.17.0 (Apple M1) :
| Benchmark | PHP | TypeScript |
|---|---|---|
css-parser sur preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× plus rapide) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× plus rapide) |
TypeScript est plus rapide pour ces opérations de bas niveau, comme prévu. Pour générer une page entière de CSS — le cas d'usage réel —, les performances de PHP sont suffisantes (environ 14 ms par page lors de l'exécution d'exemple). Pour une même entrée répétée, le cache de fichiers élimine entièrement ce coût.
Tests et parité
Les tests garantissent que le port PHP produit la même sortie que TailwindCSS. Deux approches se complètent.
1. Tests fondés sur l'extraction. Les scripts dans test-coverage/ analysent les fichiers .test.ts de TailwindCSS et en extraient les cas de test dans JSON. PHPUnit exécute ensuite ces cas avec TailwindPHP et compare la sortie à la valeur CSS attendue. Comme les attentes proviennent directement du projet d'origine, tout écart de comportement de PHP entraîne un échec. Ces tests couvrent les cas complexes : utilitaires, variantes, intégration, fonctions CSS et tests ui.spec dans le navigateur.
2. Tests unitaires portés à la main. Les fichiers de test TypeScript plus simples (AST, analyse de CSS, échappement, analyse des candidats et des valeurs, …) sont portés directement vers PHP et placés à côté de leur source sous forme de *.test.php, en reprenant la structure et les assertions des originaux.
La boucle suit les étapes extraire → exécuter → vérifier : réextrayez les tests depuis la référence TailwindCSS actuelle, puis lancez la suite ; tout écart entraîne un échec. Le port reste ainsi en phase avec le projet d'origine et une mise à jour de TailwindCSS peut être validée automatiquement plutôt que par inspection. Tout écart fait échouer l'intégration continue.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
La version 1.7.0 (référence TailwindCSS v4.3.3) compte 4,427 tests réussis :
| Suite | Tests | Source |
|---|---|---|
Suites TailwindCSS extraites (utilitaires 706, variantes 164, index 148, css-functions 64, ui.spec 68) |
1,150 | extraits de .test.ts / .spec.ts |
Couverture de API (utilitaires, modificateurs, variantes, directives, plugins, imports, @source, mise en cache, API publique) |
2,252 | tests/ |
| Tests unitaires près du code source (analyseur, AST, candidats, thème, utilitaires, analyseur de sélecteurs, transformations lightningcss, minificateur) | 767 | ports de *.test.php et tests propres à PHP |
| CLI (analyse des arguments, sortie, compilations) | 84 | tests/Cli*Test.php |
| Ports des plugins (typographie, formulaires) | 45 | *.test.php, à côté des plugins |
| Bibliothèques associées (clsx, tailwind-merge, CVA) | 129 | suites de référence |
Qualité du code
Le formatage et l'analyse statique sont exécutés par les scripts Composer :
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan s'exécute au niveau 4 (phpstan.neon), avec une courte liste de motifs ignorés pour les formes de tableaux dynamiques utilisées par l'architecture fondée sur les fonctions. Tous les fichiers source sont analysés, les fichiers de test sont exclus.
Pour connaître la structure vérifiée par ces tests et les écarts consignés, consultez Architecture.