انتقل إلى المحتوى

الأداء والاختبار

يعطي TailwindPHP الأولوية للصحة. وعندما يسرّع تغيير خاص بـPHP التنفيذ دون تغيير المخرجات، يُطبّق ويُعلّم بـ@port-deviation:performance. لا يُفترض التكافؤ مع TailwindCSS، بل يُتحقق منه باستمرار باستخدام مجموعة اختبارات Tailwind نفسها.

الأداء

تعطي نسخة PHP الأولوية لمطابقة مخرجات TailwindCSS على حساب سرعة المعالجة الخام، وتظل النسخة الأصلية من TypeScript أسرع على أي حال؛ إذ يترجم JIT في V8 المسارات الساخنة إلى شيفرة أصلية بطريقة لا يستطيع 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

نتائج نموذجية على 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)، مع قائمة قصيرة من الأنماط المستثناة لأشكال المصفوفات الديناميكية التي تستخدمها البنية القائمة على الدوال. تُحلل جميع ملفات المصدر، وتُستثنى ملفات الاختبار.

للاطلاع على البنية التي تتحقق منها هذه الاختبارات والمواضع التي تُسجّل فيها الانحرافات، راجع البنية.