Desempenho e testes
TailwindPHP prioriza a correção. Quando uma alteração específica de PHP melhora o desempenho sem alterar a saída, ela é aplicada e marcada como @port-deviation:performance. A paridade com TailwindCSS não é presumida — ela é verificada continuamente com o próprio conjunto de testes de Tailwind.
Desempenho
A versão portada de PHP prioriza a correspondência com a saída de TailwindCSS em vez da velocidade bruta, e o original em TypeScript continua mais rápido de qualquer forma — o JIT de V8 compila os trechos mais executados em código nativo de um modo que PHP não consegue igualar. Para CSS gerado por requisição ou página, reutilize um compilador (consulte generateExact()) e persista seu estado de construção com stateCacheFile.
Alguns trechos mais executados contam com otimizações ajustadas manualmente que preservam uma saída idêntica:
ast.phptoCss()— acumula fragmentos em um array e osimplodeuma só vez, em vez de concatenar strings repetidamente, e usa strings de recuo pré-calculadas.css-parser.php— compara caracteres diretamente, sem passar porord(), e acompanha o tamanho dos buffers em vez de recalcularstrlen().
Ambas estão documentadas com @port-deviation:performance e condicionadas ao conjunto de testes — não podem alterar o CSS gerado.
Benchmarks
O diretório benchmarks/ contém um script de comparação. Execute-o com:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
Resultados de exemplo em PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| Benchmark | PHP | TypeScript |
|---|---|---|
css-parser em preflight.css |
~816 ops/s | ~15.45K ops/s (≈20× mais rápido) |
toCss |
~65.85K ops/s | ~2.59M ops/s (≈39× mais rápido) |
TypeScript é mais rápido nessas operações de baixo nível, como esperado. Para a geração de CSS de páginas completas — o caso de uso real —, o desempenho de PHP é adequado (cerca de 14 ms por página na execução de exemplo). Para entradas idênticas repetidas, o cache de arquivos elimina totalmente esse custo.
Testes e paridade
Os testes garantem que a versão portada de PHP produza a mesma saída que TailwindCSS. Duas abordagens funcionam em conjunto.
1. Testes baseados em extração. Os scripts em test-coverage/ analisam os próprios arquivos .test.ts de TailwindCSS e extraem os casos de teste para JSON. Em seguida, PHPUnit executa esses casos por meio de TailwindPHP e compara a saída com o CSS esperado. Como as expectativas vêm diretamente do projeto upstream, qualquer divergência no comportamento de PHP aparece como falha. Esses testes cobrem os aspectos mais complexos: utilitários, variantes, integração, funções CSS e testes ui.spec no navegador.
2. Testes unitários portados manualmente. Arquivos de teste mais simples de TypeScript (AST, análise de CSS, escape, análise de candidatos, análise de valores, …) são portados diretamente para PHP e ficam ao lado do código-fonte como *.test.php, espelhando a estrutura e as asserções dos originais.
O ciclo é extrair → executar → verificar: extrair novamente da referência atual de TailwindCSS, executar o conjunto de testes e detectar qualquer divergência como falha. Isso mantém a versão portada em sincronia com o projeto upstream e permite validar mecanicamente uma atualização de TailwindCSS, em vez de inspecioná-la manualmente. Divergências fazem o CI falhar.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
Há 4,427 testes aprovados na versão 1.7.0 (referência TailwindCSS v4.3.3):
| Conjunto | Testes | Fonte |
|---|---|---|
Conjuntos de TailwindCSS extraídos (utilitários 706, variantes 164, índice 148, css-functions 64, ui.spec 68) |
1,150 | extraídos de .test.ts / .spec.ts |
Cobertura de API (utilitários, modificadores, variantes, diretivas, plugins, importações, @source, cache, API público) |
2,252 | tests/ |
| Testes unitários junto ao código-fonte (parser, AST, candidatos, tema, utilitários, parser de seletores, transformações de lightningcss, minificador) | 767 | versões portadas de *.test.php e testes específicos de PHP |
| CLI (análise de argumentos, saída, builds) | 84 | tests/Cli*Test.php |
| Versões portadas de plugins (tipografia, formulários) | 45 | *.test.php junto aos plugins |
| Bibliotecas complementares (clsx, tailwind-merge, CVA) | 129 | conjuntos de referência |
Qualidade do código
A formatação e a análise estática são executadas por meio dos scripts de Composer:
composer lint # Pint --test (check formatting)
composer format # Pint (fix formatting)
composer analyse # PHPStan (static analysis, level 4)
composer quality # lint + analyse
PHPStan é executado no nível 4 (phpstan.neon), com uma pequena lista de padrões ignorados para as estruturas dinâmicas de array usadas pela arquitetura baseada em funções. Todos os arquivos-fonte são analisados; os arquivos de teste são excluídos.
Para ver a estrutura verificada por esses testes e onde os desvios são registrados, consulte Arquitetura.