الأداء والاختبار
يعطي TailwindPHP الأولوية للصحة. وعندما يسرّع تغيير خاص بـPHP التنفيذ دون تغيير المخرجات، يُطبّق ويُعلّم بـ@port-deviation:performance. لا يُفترض التكافؤ مع TailwindCSS، بل يُتحقق منه باستمرار باستخدام مجموعة اختبارات Tailwind نفسها.
الأداء
تعطي نسخة PHP الأولوية لمطابقة مخرجات TailwindCSS على حساب سرعة المعالجة الخام، وتظل النسخة الأصلية من TypeScript أسرع على أي حال؛ إذ يترجم JIT في V8 المسارات الساخنة إلى شيفرة أصلية بطريقة لا يستطيع PHP مجاراتها. عند إنشاء CSS لكل طلب أو صفحة، أعد استخدام مترجم واحد (راجع generateExact()) واحفظ حالة إنشائه باستخدام stateCacheFile.
تتضمن بعض المسارات الساخنة تحسينات مضبوطة يدويًا تحافظ على تطابق المخرجات:
ast.phptoCss()— يجمع الأجزاء في مصفوفة ويُجري عمليةimplodeمرة واحدة بدلًا من تكرار ضم السلاسل النصية، ويستخدم سلاسل مسافات بادئة محسوبة مسبقًا.css-parser.php— يقارن المحارف مباشرة بدلًا من المرور عبرord()، ويتتبع أطوال المخازن المؤقتة بدلًا من إعادة حسابstrlen().
كلاهما موثّق باستخدام @port-deviation:performance ومشروط باجتياز مجموعة الاختبارات؛ ولا يمكنهما تغيير CSS الناتج.
المقاييس المعيارية
يحتوي المجلد benchmarks/ على أداة لمقارنة الأداء. شغّلها باستخدام:
composer bench # PHP vs TypeScript
composer bench:save # write benchmarks/results.json
نتائج نموذجية على PHP 8.4.5 / Node.js v22.17.0 (Apple M1):
| المقياس المعياري | PHP | TypeScript |
|---|---|---|
css-parser على preflight.css |
~816 عملية/ثانية | ~15.45K عملية/ثانية (≈ أسرع 20 مرة) |
toCss |
~65.85K عملية/ثانية | ~2.59M عملية/ثانية (≈ أسرع 39 مرة) |
TypeScript أسرع في هذه العمليات منخفضة المستوى، كما هو متوقع. أما إنشاء CSS لصفحة كاملة — وهو الاستخدام الفعلي — فأداء PHP كافٍ (نحو 14 مللي ثانية لكل صفحة في التشغيل النموذجي). وعند تكرار الإدخال نفسه، تلغي ذاكرة التخزين المؤقت للملفات التكلفة بالكامل.
الاختبار والتكافؤ
تهدف الاختبارات إلى ضمان أن منفذ PHP ينتج المخرجات نفسها التي ينتجها TailwindCSS. ويعمل نهجان معًا لتحقيق ذلك.
1. اختبارات قائمة على الاستخراج. تحلل النصوص البرمجية في test-coverage/ ملفات .test.ts الخاصة بـTailwindCSS وتستخرج حالات الاختبار إلى JSON. ثم يمرر PHPUnit تلك الحالات عبر TailwindPHP ويقارن المخرجات بـCSS المتوقعة. ولأن التوقعات مأخوذة مباشرة من المشروع الأصلي، فإن أي اختلاف في سلوك PHP يظهر على هيئة فشل. وتغطي هذه الاختبارات الجوانب المعقدة: الأدوات المساعدة، والمتغيرات، والتكامل، ودوال CSS، واختبارات ui.spec على مستوى المتصفح.
2. اختبارات وحدات منقولة يدويًا. تُنقل ملفات اختبارات TypeScript الأبسط (AST، وتحليل CSS، والهروب، وتحليل المرشحين، وتحليل القيم، …) مباشرة إلى PHP، وتوضع بجوار مصدرها بصيغة *.test.php، مع محاكاة بنية الاختبارات والتأكيدات الأصلية.
تسير العملية وفق استخراج ← تشغيل ← تحقق: أعد الاستخراج من مرجع TailwindCSS الحالي، وشغّل مجموعة الاختبارات، وسيؤدي أي اختلاف إلى الفشل. يُبقي هذا المنفذ متزامنًا مع المشروع الأصلي، ويتيح التحقق آليًا من تحديث TailwindCSS بدلًا من فحصه يدويًا. وأي اختلاف يؤدي إلى فشل CI.
composer extract # re-extract test cases from the TailwindCSS reference
composer test # run the full suite
هناك 4,427 اختبارًا ناجحًا اعتبارًا من الإصدار 1.7.0 (مرجع TailwindCSS v4.3.3):
| مجموعة الاختبارات | الاختبارات | المصدر |
|---|---|---|
مجموعات TailwindCSS المستخرجة (الأدوات المساعدة 706، والمتغيرات 164، والفهرس 148، ودوال css 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)، مع قائمة قصيرة من الأنماط المستثناة لأشكال المصفوفات الديناميكية التي تستخدمها البنية القائمة على الدوال. تُحلل جميع ملفات المصدر، وتُستثنى ملفات الاختبار.
للاطلاع على البنية التي تتحقق منها هذه الاختبارات والمواضع التي تُسجّل فيها الانحرافات، راجع البنية.