الحالة

جميع الأنظمة تعملآخر تحديث 31 أكتوبر 2026
console.logيعمل
قبل 90 يومًااستدعاء واحد لكل إطار متغير، ولا استدعاءات عند الخمول.اليوم
console.clearنادر الاستخدام
قبل 90 يومًاعند الإطار الأول، وبعد invalidate()، وعند الخمول بعد تراكم 100 إطار، وعند 300.اليوم
Yogaيعمل
قبل 90 يومًاتخطيط flexbox باستخدام WebAssembly، بقيمة pointScaleFactor تساوي 1.اليوم
Turbolog encoderيعمل
قبل 90 يومًابوابة تجزئة الصفوف وترميز ⁦%c⁩ بطول التتابع.اليوم
DevTools Throttlerمُراعى
قبل 90 يومًاتقييد تحديث منفذ العرض بفاصل 50 ms. تفصل بين الإطارات مدة لا تقل عن 66 ms.اليوم
textjs.orgيعمل
قبل 90 يومًاالتوثيق، وتعلّم، و Playground، والمدونة، والمتجر.اليوم

اختبار أداء مباشر

يعمل مسار معالجة ⁦@textjs/core⁩ في علامة التبويب هذه على لوحة بحجم ⁦100×32⁩ ويكتب الإطارات في وحدة تحكم داخل الذاكرة.

إطار كامل
—
تخطيط + رسم + ترميز
الكتابة
—
تعديل صف واحد
إطار خامل
—
لم يتغير شيء
عناصر span من نوع ⁦%c⁩
—
3,200 خلية

يبدأ تلقائيًا عند خمول الصفحة.

سجل الأداء

⁦packages/core/test/perf.test.ts⁩ عند كل مرحلة رئيسية، على الجهاز نفسه (Apple M5 Pro · Bun 1.4.4). متوسط 1,000 إطار.

الإصدارإطار كاملالكتابةالخمولعناصر span من نوع ⁦%c⁩
0.1.0مارس 2025 · @textjs/core · 7c91cea0.194ms0.065ms0.043ms205
0.2.0يوليو 2025 · textjs.org · 92437cc0.192ms0.067ms0.042ms205
0.3.0نوفمبر 2025 · 10× input · 8c2d1b10.205ms0.065ms0.043ms146
0.3.0نوفمبر 2025 · Mobile pass · e2e6e460.212ms0.067ms0.045ms146
0.4.0مايو 2026 · Zero-flash frames · f007ade0.184ms0.046ms0.028ms146
1.0.0أكتوبر 2026 · Text.js 1.0 · 57968b60.163ms0.011ms0.000ms149

واجهة DevTools

⁦bench/devtools⁩ في ⁦Chrome for Testing⁩: عمليات الرسم الفارغة، والإطارات المسلّمة، وتأخر العرض، 5 ثوانٍ لكل تشغيل. طريقة القياس.

المشغّلFPSعمليات الرسم الفارغةالمرسوم / المُصدَرالتأخر ⁦p50⁩
الإلحاق (المعتمد)151.0%74 / 7510.4ms
المسح لكل إطار1570.6%70 / 7560.4ms
الإلحاق، بلا ضبط وتيرة600.8%67 / 29531.2ms
المسح لكل إطار6081.1%45 / 3009.8ms

الحوادث السابقة

الأحدث أولًا. الأوقات بتوقيت UTC.

أكتوبر 2026

  • صفحات عالقة تحت الترويسة في Safari على iOS27 أكتوبر – 28 أكتوبر 2026 · حُلّت
    1. حُلّت

      حُلّت هذه الحادثة.

    2. قيد المراقبة

      نُشر إصلاح. عُطّل تثبيت التمرير (overflow-anchor: none). نراقب الحالة.

    3. حُدّد السبب

      قد يظل العنوان الرئيسي عالقًا تحت الترويسة الثابتة بعد التمرير إلى الأسفل ثم العودة إلى الأعلى. تضبط ميزة تثبيت التمرير في Safari موضع التمرير.

    4. قيد المراقبة

      نُشر إصلاح. تتمرر هذه العناصر أفقيًا فقط الآن، ويُطبّق scrollbar-gutter: stable على الأجهزة التي تستخدم الفأرة فقط.

    5. حُدّد السبب

      تتجاوز علامات تبويب الملفات وكتل الشيفرة وجداول النصوص حدودها رأسيًا بمقدار 1 px بسبب تسطير علامة التبويب النشطة، لذا تتمرر على المحورين ويوجّه iOS إليها السحبات الرأسية المقصودة للصفحة. يتسبب scrollbar-gutter: stable أيضًا في قفزة عند التمرير الأول على iOS.

    6. قيد التحقيق

      نتحقق من بلاغات عن تعذر التمرير إلى أعلى صفحات textjs.org في Safari على iOS.

    أثّرت هذه الحادثة في: textjs.org.

    تحليل ما بعد الحادثة

    لا تتحرك صفحات textjs.org أثناء تحميلها، لذا لم يكن هناك ما يصححه تثبيت التمرير. في Safari على iOS، ثبّت القسم الرئيسي تحت الترويسة الثابتة ومنع التمرير إلى الأعلى. يعرض ?debug=scroll على textjs.org الآن قراءة مباشرة لأحداث التمرير واللمس وتغيير الحجم، ويحدد الجهة المستدعية لكل استدعاء برمجي للتركيز أو التمرير.

    الإصلاحات: 297c5d7, 55da525, 8424fcd · سجل التغييرات: 1.0.0

  • فشل اختبارات قواعد التدقيق في CI23 أكتوبر 2026 · حُلّت
    1. حُلّت

      يقرأ المختبِر الآن it.only عند الحاجة، حين يستدعي اختبار RuleTester.itOnly. تنجح اختبارات CI الآن.

    2. حُدّد السبب

      يرمي Bun استثناءً عند قراءة it.only حين يكون متغير البيئة CI معيّنًا. يعيّن مختبِر القواعد RuleTester.itOnly = it.only عند الاستيراد، لذا يفشل تحميله.

    3. قيد التحقيق

      تفشل مجموعة اختبارات eslint-plugin-textjs في CI قبل تشغيل أي اختبار للقواعد. تنجح الاختبارات محليًا.

    تحليل ما بعد الحادثة

    يأخذ @typescript-eslint/rule-tester دوال الاختبار كخصائص ساكنة في RuleTester. يغلّف الإصلاح it.only بدالة. لم تتأثر أي حزمة أو صفحة.

    الإصلاح: eca3f78

  • تغير التخطيط في ⁦/playground⁩ و ⁦/opencode⁩21 أكتوبر – 22 أكتوبر 2026 · حُلّت
    1. حُلّت

      إزاحة التخطيط التراكمية تساوي 0 في كل مسار.

    2. قيد المراقبة

      نُشر إصلاح. تشترك الصفحتان في تخطيط واحد للوحة، ويُلحق الحجم دون تحريك «ملاءمة وحدة التحكم». نراقب الوضع.

    3. حُدّد السبب

      يُلحق عنصر التحكم بحجم وحدة التحكم الحجم المقاس بتسميته بعد التهيئة (Fit console · 120×36)، مما يحرك عقدة النص «ملاءمة وحدة التحكم». يختلف أيضًا ارتفاع الصفين العلوي والسفلي للوحة بين الصفحتين، لذا تعود اللوحة إلى التمركز عند التنقل.

    4. قيد التحقيق

      يسجل تدقيق تغير التخطيط لدينا تغيرًا تراكميًا في التخطيط بقيمة 0.0001 في ⁦/playground⁩ و ⁦/opencode⁩. يسجل كل مسار آخر يشمله التدقيق القيمة 0. تتحرك لوحة التركيز أيضًا عند التنقل بين الصفحتين.

    أثّرت هذه الحادثة في: textjs.org.

    تحليل ما بعد الحادثة

    تحتوي اللوحة الآن على منطقتين علوية وسفلية بارتفاع ثابت، ويحجز كل عرض توضيحي الصفوف نفسها، فلا يتحرك شيء عند تغيير الصفحات أو العروض. تعرض لوحة اتصال OpenCode سطر حالة واحدًا في كل حالة، مع هيكل مؤقت حتى اكتمال التفعيل. يتحقق apps/web/scripts/e2e-layout.mjs من تطابق الأبعاد والمواضع عبر المسارات والعروض وأحجام إطار العرض وحالات الاتصال.

    الإصلاح: 8f22b9b · سجل التغييرات: 1.0.0

  • اختفاء الشريط الجانبي للتوثيق عند التمرير إلى نهاية الصفحات الطويلة16 أكتوبر – 17 أكتوبر 2026 · حُلّت
    1. حُلّت

      حُلّت هذه الحادثة.

    2. قيد المراقبة

      نُشر إصلاح. تعرض فصول قسم تعلّم التذييل داخل عمود المحتوى أيضًا. نراقب الوضع.

    3. حُدّد السبب

      تواجه قائمة الفصول الجانبية في قسم تعلّم المشكلة نفسها.

    4. قيد المراقبة

      نُشر إصلاح. تعرض صفحات التوثيق التذييل داخل عمود المحتوى، فيصل التخطيط إلى أسفل الصفحة.

    5. حُدّد السبب

      يستخدم الشريط الجانبي position: sticky داخل تخطيط التوثيق، ويُعرض تذييل الموقع بعد ذلك التخطيط. يظل العنصر اللاصق ثابتًا فقط ما دامت الكتلة الحاوية له على الشاشة، لذا عند ظهور التذييل بالتمرير، يسحب الشريط الجانبي معه.

    6. قيد التحقيق

      نحقق في بلاغات عن اختفاء الشريط الجانبي للتوثيق عند التمرير إلى أسفل الصفحات الطويلة.

    أثّرت هذه الحادثة في: textjs.org.

    تحليل ما بعد الحادثة

    تعرض الصفحات ذات الشريط الجانبي اللاصق (التوثيق وفصول قسم تعلّم) التذييل داخل عمود المحتوى. وتحتفظ الصفحات الأخرى بالتذييل المشترك.

    الإصلاح: 131ac96 · سجل التغييرات: 1.0.0

  • اسم الحزمة textjs غير متاح على npm14 أكتوبر – 15 أكتوبر 2026 · حُلّت
    1. حُلّت

      حُلّت هذه الحادثة.

    2. قيد المراقبة

      أصبحت حزمة إطار العمل وواجهة سطر الأوامر @textjs/next، ضمن النطاق نفسه لحزمتي @textjs/core و @textjs/react. تتغير الاستيرادات من textjs إلى @textjs/next.

    3. حُدّد السبب

      ينتمي الاسم textjs إلى حزمة أخرى على npm منذ 25 مارس 2016.

    4. قيد التحقيق

      يفشل نشر حزمة إطار العمل textjs على npm مع الخطأ 403 Forbidden.

    تحليل ما بعد الحادثة

    بدءًا من ⁦Text.js 1.0⁩، تستورد التطبيقات من @textjs/next بدلًا من textjs، ويكون جسر OpenCode هو bunx @textjs/app proxy، الذي يعمل من أي دليل.

    ⁦Text.js 1.0⁩: تغيير اسم واحد · سجل التغييرات: 1.0.0

سبتمبر 2026

  • طبقات رسم فارغة عند فواصل الصفوف15 سبتمبر – 16 سبتمبر 2026 · حُلّت
    1. حُلّت

      حُلّت هذه الحادثة.

    2. قيد المراقبة

      نُشر إصلاح. تعيد فواصل الصفوف التي لا تواصل تسلسلًا ضبط %c إلى نمط فارغ أولًا، فتُصدر DevTools سطرًا جديدًا عاديًا. يحمل كل إطار ستارًا واحدًا.

    3. حُدّد السبب

      عندما ينتهي تسلسل منسق عند فاصل صف، يُكتب \n داخل span الخاص بالتسلسل والمحدد بـ %c. تقسم DevTools عنصر span عند فاصل السطر، وتصبح البقية الفارغة عنصر span بنمط display: inline-block مع contain: paint، فتُخصص له طبقة رسم مستقلة.

    4. قيد التحقيق

      نحقق في وجود عناصر <span> فارغة عند معظم فواصل الصفوف في إطارات DevTools، وتضاعف span الستار في بعض الإطارات.

    أثّرت هذه الحادثة في: Turbolog encoder.

    تحليل ما بعد الحادثة

    تظل عناصر span ذات النمط نفسه تندمج عبر فواصل الصفوف. وانتقل الستار أيضًا إلى سطر مستقل: تعوّم DevTools رابط المصدر (VM12:1) إلى يمين السطر الأول من الرسالة، وكان الستار المضمّن يترك ذلك الرابط بجانب الصف 0، فيضيّقه.

    سجل التغييرات: 1.0.0

أغسطس 2026

  • زيادة زمن تأخر العرض بعد console.clear27 أغسطس – 31 أغسطس 2026 · حُلّت
    1. حُلّت

      وسيط تأخر العرض في bench/devtools هو 10.4 ms. يصدر الإصلاح ضمن ⁦Text.js 1.0⁩.

    2. قيد المراقبة

      نُشر إصلاح. بعد أي إطار يمسح وحدة التحكم، ينتظر العارض 110 ms مرة واحدة، فتصل الإطارات اللاحقة بعد أكثر من 50 ms من التحديث السابق في DevTools وتسلك مسار التنفيذ الفوري.

    3. حُدّد السبب

      بعد المسح، تُدرج DevTools صفًا يقول «تم محو وحدة التحكم». يشغل هذا الصف خانة التنفيذ الفوري في آلية الخنق ويدفع الإطار التالي إلى مؤقت 50 ms. ومع تباعد الإطارات بمقدار 66 ms، يظل كل إطار لاحق على ذلك المؤقت.

    4. قيد التحقيق

      يسجل bench/devtools وسيط تأخر عرض قدره 63 ms بعد مسح وحدة التحكم. يبقى التأخر عند هذا المستوى في كل إطار لاحق.

    أثّرت هذه الحادثة في: DevTools Throttler, console.clear.

    تحليل ما بعد الحادثة

    يظل الإدخال المنفصل يُعرض تزامنيًا عندما يسمح الفاصل الزمني بين الإطارات بذلك.

    كسر قفل الطور · سجل التغييرات: 1.0.0

  • مؤشر التحميل يخل بمحاذاة الصفوف في وحدة التحكم في DevTools11 أغسطس – 12 أغسطس 2026 · حُلّت
    1. حُلّت

      حُلّت هذه الحادثة. يصدر الإصلاح ضمن ⁦Text.js 1.0⁩.

    2. قيد المراقبة

      نُشر إصلاح. يرسم مؤشر التحميل الافتراضي dots الآن كتلًا ربعية (▘ ▝ ▗ ▖)، تشغل كل منها خلية واحدة في Menlo. تتوفر إطارات برايل عبر variant="braille" للطرفيات.

    3. حُدّد السبب

      يرسم مؤشر التحميل الافتراضي أنماط برايل (من ⁦U+2800⁩ إلى ⁦U+28FF⁩). يقيس Text.js كل نمط كخلية واحدة، لكن Menlo، خط وحدة التحكم في DevTools على macOS، لا يحتوي على محارف برايل. يكون المحرف البديل أعرض من خلية ويدفع بقية الصف إلى اليمين.

    4. قيد التحقيق

      على macOS، تختل محاذاة الصفوف التي تحتوي على <Spinner> في DevTools. تقع الخلايا إلى يمين مؤشر التحميل خارج الشبكة.

    أثّرت هذه الحادثة في: console.log.

    تحليل ما بعد الحادثة

    يرسم LineChart نقاطًا ربعية افتراضيًا للسبب نفسه. تتوفر برايل عبر marker="braille".

    سجل التغييرات: 1.0.0

مايو 2026

  • ارتفاع نسبة عمليات الرسم الفارغة في وحدة التحكم في DevTools5 مايو – 19 مايو 2026 · حُلّت
    1. حُلّت

      صدر الإصلاح ضمن ⁦Text.js 0.4.0⁩. بلغت نسبة عمليات الرسم الفارغة ⁦1.0%⁩، وجميعها في الإطار الأول.

    2. قيد المراقبة

      يُلحق textjs.org الإطارات الآن بدلًا من المسح. يُبقي span ستار بعرض صفري الإطارات السابقة خارج العرض، وتُضبط وتيرة الإطارات بفاصل لا يقل عن 66 ms.

    3. حُدّد السبب

      تطبق DevTools الأمر console.clear() تزامنيًا لكنها ترسم الرسائل الجديدة بخنق قدره 50 ms. يزيل كل إطار سابقه فورًا ويُرسم بعد مدة تصل إلى 50 ms. في bench/devtools، كانت لوحة معلومات بحجم ⁦100×32⁩ فارغة في ⁦70.6%⁩ من عمليات رسم DevTools عند 15 إطارًا في الثانية و⁦81.1%⁩ عند 60 إطارًا في الثانية.

    4. قيد التحقيق

      نحقق في بلاغات عن وميض وحدة التحكم في DevTools فارغة بين الإطارات تحت الحمل.

    أثّرت هذه الحادثة في: console.clear, DevTools Throttler.

    تحليل ما بعد الحادثة

    منذ 0.1.0، كان Turbolog يرسل استدعاءً واحدًا لـ console.clear() وآخر لـ console.log() لكل إطار متغير. بُني bench/devtools، الذي يشغّل واجهة DevTools الفعلية في ⁦Chrome for Testing⁩، لقياس هذه الحادثة وأنتج الأرقام في جدول واجهة DevTools أعلاه.

    الإصلاح: f007ade · ⁦Turbolog⁩: إزالة الوميض · سجل التغييرات: 0.4.0

أبريل 2026

  • إعادة تنسيق مسارات الملفات في إطارات وحدة التحكم كروابط14 أبريل – 15 أبريل 2026 · حُلّت
    1. حُلّت

      حُلّت هذه الحادثة.

    2. قيد المراقبة

      نُشر إصلاح. يُدرج المرمّز محرف ⁦word joiner⁩ (⁦U+2060⁩) في نصوص path:line و //host:port و data:، إلا إذا كانت الخلية تسمح بالروابط.

    3. حُدّد السبب

      تحوّل DevTools عناوين URL ونصوص path:line و //host:port في رسائل وحدة التحكم إلى روابط وتفرض عليها ألوان سمتها. كان المرمّز يفصل :// و www. بالفعل، لكن path:line و //host:port بعد مخطط العنوان ما زالا يطابقان النمط.

    4. قيد التحقيق

      تُعرض نصوص مثل src/app.tsx:12 و http://localhost:3000 بلون روابط DevTools بدلًا من نمط %c الخاص بها.

    أثّرت هذه الحادثة في: Turbolog encoder.

    تحليل ما بعد الحادثة

    يحتوي :// و www. على محرف ⁦word joiner⁩ منذ 0.1.0. تضبط الخلايا التي ينبغي أن تبقى قابلة للنقر سمة السماح بالروابط وتُكتب دون تغيير.

    سجل التغييرات: 0.4.0

نوفمبر 2025

  • تأخر ضغطات المفاتيح في تطبيقات وحدة التحكم4 نوفمبر – 18 نوفمبر 2025 · حُلّت
    1. حُلّت

      صدر الإصلاح في ⁦Text.js 0.3.0⁩.

    2. قيد المراقبة

      نُشر إصلاح. يُعرض الإدخال المنفصل، مثل ضغطة مفتاح أو لصق، تزامنيًا الآن في المهمة نفسها. وتظل التحديثات الأخرى تُعتمد عند requestAnimationFrame.

    3. حُدّد السبب

      ينتظر كل تحديث، بما في ذلك ضغطة المفتاح، استدعاء requestAnimationFrame التالي قبل أن تعتمد React التغييرات ويُسجّل الإطار.

    4. قيد التحقيق

      تتأخر الكتابة في تطبيقات وحدة التحكم عن لوحة المفاتيح، ويظهر ذلك بوضوح أكبر في OpenCode على textjs.org.

    أثّرت هذه الحادثة في: textjs.org.

    تحليل ما بعد الحادثة

    لم تعد ضغطات المفاتيح تنتظر إطار الحركة التالي. وتظل التحديثات التي لا تأتي من الإدخال، مثل المؤقتات والبيانات المتدفقة، تُجمّع لكل إطار حركة.

    الإصلاح: 8c2d1b1 · سجل التغييرات: 0.3.0