본문으로 건너뛰기

성능 및 테스트

TailwindPHP는 정확성을 우선으로 최적화합니다. 출력 변경 없이 성능을 높이는 PHP 전용 변경은 적용하고 @port-deviation:performance로 표시합니다. TailwindCSS와의 동등성을 가정하지 않고, 자체 테스트 모음인 Tailwind를 기준으로 지속적으로 검증합니다.

성능

PHP 포트는 원시 처리량보다 TailwindCSS 출력과의 일치를 우선시합니다. 원본 TypeScript가 더 빠른 것은 변함없습니다. V8의 JIT는 PHP로는 따라 할 수 없는 방식으로 자주 실행되는 경로를 네이티브 코드로 컴파일합니다. 요청 또는 페이지마다 CSS를 생성한다면 컴파일러 하나를 재사용하고(generateExact() 참고), stateCacheFile로 생성 상태를 유지하세요.

몇 가지 자주 실행되는 경로에는 동일한 출력을 보존하는 수동 조정 최적화가 적용되어 있습니다:

  • ast.php toCss() — 조각을 배열에 누적한 뒤 한 번 implode하고, 문자열을 반복해서 이어 붙이는 대신 미리 계산한 들여쓰기 문자열을 사용합니다.
  • css-parser.php — ord()를 거치지 않고 문자를 직접 비교하며, strlen()를 다시 계산하는 대신 버퍼 길이를 추적합니다.

두 항목 모두 @port-deviation:performance에 문서화되어 있고 테스트 모음으로 보호됩니다. 생성되는 CSS는 변경될 수 없습니다.

벤치마크

benchmarks/ 디렉터리에 비교 도구가 있습니다. 다음 명령으로 실행하세요:

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

Apple M1에서 PHP 8.4.5 / Node.js v22.17.0을 실행한 샘플 결과:

벤치마크 PHP TypeScript
css-parser: preflight.css ~816 ops/s ~15.45K ops/s (≈20× 빠름)
toCss ~65.85K ops/s ~2.59M ops/s (≈39× 빠름)

이러한 저수준 작업에서는 예상대로 TypeScript가 더 빠릅니다. 실제 사용 사례인 전체 페이지 CSS 생성에서는 PHP의 성능도 충분합니다(샘플 실행 기준 페이지당 약 14 ms). 동일한 입력을 반복하면 파일 캐시가 비용을 완전히 없앱니다.

테스트 및 동등성

PHP 포트가 TailwindCSS와 동일한 출력을 생성하는지 보장하는 테스트가 있습니다. 두 가지 방법을 함께 사용합니다.

1. 추출 기반 테스트. test-coverage/의 스크립트는 TailwindCSS 자체 .test.ts 파일을 파싱하고 테스트 사례를 JSON로 추출합니다. 그런 다음 PHPUnit가 해당 사례를 TailwindPHP에 전달하고 출력을 예상 CSS와 비교합니다. 예상 결과가 업스트림에서 직접 가져온 것이므로 PHP 동작에서 벗어나면 실패로 드러납니다. 유틸리티, 변형, 통합, CSS 함수 및 브라우저 수준 ui.spec 테스트 등 복잡한 영역을 다룹니다.

2. 직접 포팅한 단위 테스트. AST, CSS 파싱, 이스케이프, 후보 파싱, 값 파싱 등을 다루는 간단한 TypeScript 테스트 파일은 PHP로 직접 포팅해 원본과 같은 구조 및 검증 내용을 갖춘 *.test.php로 소스 옆에 둡니다.

절차는 추출 → 실행 → 검증입니다. 현재 TailwindCSS 참조에서 다시 추출하고 테스트 모음을 실행하며, 차이가 있으면 실패합니다. 이렇게 하면 포트가 업스트림과 계속 동기화되고 TailwindCSS 업데이트를 직접 살펴보는 대신 자동으로 검증할 수 있습니다. 차이가 있으면 CI가 실패합니다.

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

릴리스 1.7.0 기준 4,427개의 테스트가 통과했습니다(참조 TailwindCSS v4.3.3):

테스트 모음 테스트 출처
추출된 TailwindCSS 테스트 모음 (유틸리티 706, 변형 164, 인덱스 148, css-functions 64, ui.spec 68) 1,150 .test.ts / .spec.ts에서 추출
API 테스트 범위 (유틸리티, 수정자, 변형, 지시문, 플러그인, 가져오기, @source, 캐싱, 공개 API) 2,252 tests/
소스 코드 옆 단위 테스트 (파서, AST, 후보, 테마, 유틸리티, 선택자 파서, lightningcss 변환, 최소화기) 767 *.test.php 포트 및 PHP별 테스트
CLI (인수 파싱, 출력, 빌드) 84 tests/Cli*Test.php
플러그인 포트 (타이포그래피, 폼) 45 플러그인 옆의 *.test.php
함께 제공되는 라이브러리 (clsx, tailwind-merge, CVA) 129 참조 테스트 모음

코드 품질

서식 지정과 정적 분석은 Composer 스크립트로 실행합니다:

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

PHPStan는 레벨 4(phpstan.neon)로 실행하며, 함수 기반 아키텍처에서 사용하는 동적 배열 형태를 대상으로 무시 패턴을 일부 지정합니다. 모든 소스 파일을 분석하고 테스트 파일은 제외합니다.

테스트에서 검증하는 구조와 차이를 기록하는 위치는 아키텍처를 참고하세요.