الحالة
console.logيعملconsole.clearنادر الاستخدامYogaيعملTurbolog encoderيعملDevTools Throttlerمُراعىtextjs.orgيعملاختبار أداء مباشر
يعمل مسار معالجة @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 · 7c91cea | 0.194ms | 0.065ms | 0.043ms | 205 |
0.2.0يوليو 2025 · textjs.org · 92437cc | 0.192ms | 0.067ms | 0.042ms | 205 |
0.3.0نوفمبر 2025 · 10× input · 8c2d1b1 | 0.205ms | 0.065ms | 0.043ms | 146 |
0.3.0نوفمبر 2025 · Mobile pass · e2e6e46 | 0.212ms | 0.067ms | 0.045ms | 146 |
0.4.0مايو 2026 · Zero-flash frames · f007ade | 0.184ms | 0.046ms | 0.028ms | 146 |
1.0.0أكتوبر 2026 · Text.js 1.0 · 57968b6 | 0.163ms | 0.011ms | 0.000ms | 149 |
واجهة DevTools
bench/devtools في Chrome for Testing: عمليات الرسم الفارغة، والإطارات المسلّمة، وتأخر العرض، 5 ثوانٍ لكل تشغيل. طريقة القياس.
| المشغّل | FPS | عمليات الرسم الفارغة | المرسوم / المُصدَر | التأخر p50 |
|---|---|---|---|---|
| الإلحاق (المعتمد) | 15 | 1.0% | 74 / 75 | 10.4ms |
| المسح لكل إطار | 15 | 70.6% | 70 / 75 | 60.4ms |
| الإلحاق، بلا ضبط وتيرة | 60 | 0.8% | 67 / 295 | 31.2ms |
| المسح لكل إطار | 60 | 81.1% | 45 / 300 | 9.8ms |
الحوادث السابقة
الأحدث أولًا. الأوقات بتوقيت UTC.
أكتوبر 2026
صفحات عالقة تحت الترويسة في Safari على iOS27 أكتوبر – 28 أكتوبر 2026 · حُلّت
- حُلّت
حُلّت هذه الحادثة.
- قيد المراقبة
نُشر إصلاح. عُطّل تثبيت التمرير (
overflow-anchor: none). نراقب الحالة. - حُدّد السبب
قد يظل العنوان الرئيسي عالقًا تحت الترويسة الثابتة بعد التمرير إلى الأسفل ثم العودة إلى الأعلى. تضبط ميزة تثبيت التمرير في Safari موضع التمرير.
- قيد المراقبة
نُشر إصلاح. تتمرر هذه العناصر أفقيًا فقط الآن، ويُطبّق
scrollbar-gutter: stableعلى الأجهزة التي تستخدم الفأرة فقط. - حُدّد السبب
تتجاوز علامات تبويب الملفات وكتل الشيفرة وجداول النصوص حدودها رأسيًا بمقدار 1 px بسبب تسطير علامة التبويب النشطة، لذا تتمرر على المحورين ويوجّه iOS إليها السحبات الرأسية المقصودة للصفحة. يتسبب
scrollbar-gutter: stableأيضًا في قفزة عند التمرير الأول على iOS. - قيد التحقيق
نتحقق من بلاغات عن تعذر التمرير إلى أعلى صفحات textjs.org في Safari على iOS.
أثّرت هذه الحادثة في: textjs.org.
تحليل ما بعد الحادثة
لا تتحرك صفحات textjs.org أثناء تحميلها، لذا لم يكن هناك ما يصححه تثبيت التمرير. في Safari على iOS، ثبّت القسم الرئيسي تحت الترويسة الثابتة ومنع التمرير إلى الأعلى. يعرض
?debug=scrollعلى textjs.org الآن قراءة مباشرة لأحداث التمرير واللمس وتغيير الحجم، ويحدد الجهة المستدعية لكل استدعاء برمجي للتركيز أو التمرير.الإصلاحات:
297c5d7,55da525,8424fcd· سجل التغييرات: 1.0.0- حُلّت
فشل اختبارات قواعد التدقيق في CI23 أكتوبر 2026 · حُلّت
- حُلّت
يقرأ المختبِر الآن
it.onlyعند الحاجة، حين يستدعي اختبارRuleTester.itOnly. تنجح اختبارات CI الآن. - حُدّد السبب
يرمي Bun استثناءً عند قراءة
it.onlyحين يكون متغير البيئةCIمعيّنًا. يعيّن مختبِر القواعدRuleTester.itOnly = it.onlyعند الاستيراد، لذا يفشل تحميله. - قيد التحقيق
تفشل مجموعة اختبارات
eslint-plugin-textjsفي CI قبل تشغيل أي اختبار للقواعد. تنجح الاختبارات محليًا.
تحليل ما بعد الحادثة
يأخذ
@typescript-eslint/rule-testerدوال الاختبار كخصائص ساكنة فيRuleTester. يغلّف الإصلاحit.onlyبدالة. لم تتأثر أي حزمة أو صفحة.الإصلاح:
eca3f78- حُلّت
تغير التخطيط في /playground و /opencode21 أكتوبر – 22 أكتوبر 2026 · حُلّت
- حُلّت
إزاحة التخطيط التراكمية تساوي 0 في كل مسار.
- قيد المراقبة
نُشر إصلاح. تشترك الصفحتان في تخطيط واحد للوحة، ويُلحق الحجم دون تحريك «ملاءمة وحدة التحكم». نراقب الوضع.
- حُدّد السبب
يُلحق عنصر التحكم بحجم وحدة التحكم الحجم المقاس بتسميته بعد التهيئة (
Fit console · 120×36)، مما يحرك عقدة النص «ملاءمة وحدة التحكم». يختلف أيضًا ارتفاع الصفين العلوي والسفلي للوحة بين الصفحتين، لذا تعود اللوحة إلى التمركز عند التنقل. - قيد التحقيق
يسجل تدقيق تغير التخطيط لدينا تغيرًا تراكميًا في التخطيط بقيمة 0.0001 في /playground و /opencode. يسجل كل مسار آخر يشمله التدقيق القيمة 0. تتحرك لوحة التركيز أيضًا عند التنقل بين الصفحتين.
أثّرت هذه الحادثة في: textjs.org.
تحليل ما بعد الحادثة
تحتوي اللوحة الآن على منطقتين علوية وسفلية بارتفاع ثابت، ويحجز كل عرض توضيحي الصفوف نفسها، فلا يتحرك شيء عند تغيير الصفحات أو العروض. تعرض لوحة اتصال OpenCode سطر حالة واحدًا في كل حالة، مع هيكل مؤقت حتى اكتمال التفعيل. يتحقق
apps/web/scripts/e2e-layout.mjsمن تطابق الأبعاد والمواضع عبر المسارات والعروض وأحجام إطار العرض وحالات الاتصال.الإصلاح:
8f22b9b· سجل التغييرات: 1.0.0- حُلّت
اسم الحزمة textjs غير متاح على npm14 أكتوبر – 15 أكتوبر 2026 · حُلّت
- حُلّت
حُلّت هذه الحادثة.
- قيد المراقبة
أصبحت حزمة إطار العمل وواجهة سطر الأوامر
@textjs/next، ضمن النطاق نفسه لحزمتي@textjs/coreو@textjs/react. تتغير الاستيرادات منtextjsإلى@textjs/next. - حُدّد السبب
ينتمي الاسم
textjsإلى حزمة أخرى على npm منذ 25 مارس 2016. - قيد التحقيق
يفشل نشر حزمة إطار العمل
textjsعلى npm مع الخطأ403 Forbidden.
تحليل ما بعد الحادثة
بدءًا من Text.js 1.0، تستورد التطبيقات من
@textjs/nextبدلًا منtextjs، ويكون جسر OpenCode هوbunx @textjs/app proxy، الذي يعمل من أي دليل.- حُلّت
سبتمبر 2026
طبقات رسم فارغة عند فواصل الصفوف15 سبتمبر – 16 سبتمبر 2026 · حُلّت
- حُلّت
حُلّت هذه الحادثة.
- قيد المراقبة
نُشر إصلاح. تعيد فواصل الصفوف التي لا تواصل تسلسلًا ضبط
%cإلى نمط فارغ أولًا، فتُصدر DevTools سطرًا جديدًا عاديًا. يحمل كل إطار ستارًا واحدًا. - حُدّد السبب
عندما ينتهي تسلسل منسق عند فاصل صف، يُكتب
\nداخل span الخاص بالتسلسل والمحدد بـ%c. تقسم DevTools عنصر span عند فاصل السطر، وتصبح البقية الفارغة عنصر span بنمطdisplay: inline-blockمعcontain: paint، فتُخصص له طبقة رسم مستقلة. - قيد التحقيق
نحقق في وجود عناصر
<span>فارغة عند معظم فواصل الصفوف في إطارات DevTools، وتضاعف span الستار في بعض الإطارات.
أثّرت هذه الحادثة في: Turbolog encoder.
تحليل ما بعد الحادثة
تظل عناصر span ذات النمط نفسه تندمج عبر فواصل الصفوف. وانتقل الستار أيضًا إلى سطر مستقل: تعوّم DevTools رابط المصدر (
VM12:1) إلى يمين السطر الأول من الرسالة، وكان الستار المضمّن يترك ذلك الرابط بجانب الصف 0، فيضيّقه.- حُلّت
أغسطس 2026
زيادة زمن تأخر العرض بعد console.clear27 أغسطس – 31 أغسطس 2026 · حُلّت
- حُلّت
وسيط تأخر العرض في
bench/devtoolsهو 10.4 ms. يصدر الإصلاح ضمن Text.js 1.0. - قيد المراقبة
نُشر إصلاح. بعد أي إطار يمسح وحدة التحكم، ينتظر العارض 110 ms مرة واحدة، فتصل الإطارات اللاحقة بعد أكثر من 50 ms من التحديث السابق في DevTools وتسلك مسار التنفيذ الفوري.
- حُدّد السبب
بعد المسح، تُدرج DevTools صفًا يقول «تم محو وحدة التحكم». يشغل هذا الصف خانة التنفيذ الفوري في آلية الخنق ويدفع الإطار التالي إلى مؤقت 50 ms. ومع تباعد الإطارات بمقدار 66 ms، يظل كل إطار لاحق على ذلك المؤقت.
- قيد التحقيق
يسجل
bench/devtoolsوسيط تأخر عرض قدره 63 ms بعد مسح وحدة التحكم. يبقى التأخر عند هذا المستوى في كل إطار لاحق.
أثّرت هذه الحادثة في: DevTools Throttler, console.clear.
تحليل ما بعد الحادثة
يظل الإدخال المنفصل يُعرض تزامنيًا عندما يسمح الفاصل الزمني بين الإطارات بذلك.
- حُلّت
مؤشر التحميل يخل بمحاذاة الصفوف في وحدة التحكم في DevTools11 أغسطس – 12 أغسطس 2026 · حُلّت
- حُلّت
حُلّت هذه الحادثة. يصدر الإصلاح ضمن Text.js 1.0.
- قيد المراقبة
نُشر إصلاح. يرسم مؤشر التحميل الافتراضي
dotsالآن كتلًا ربعية (▘ ▝ ▗ ▖)، تشغل كل منها خلية واحدة في Menlo. تتوفر إطارات برايل عبرvariant="braille"للطرفيات. - حُدّد السبب
يرسم مؤشر التحميل الافتراضي أنماط برايل (من U+2800 إلى U+28FF). يقيس Text.js كل نمط كخلية واحدة، لكن Menlo، خط وحدة التحكم في DevTools على macOS، لا يحتوي على محارف برايل. يكون المحرف البديل أعرض من خلية ويدفع بقية الصف إلى اليمين.
- قيد التحقيق
على macOS، تختل محاذاة الصفوف التي تحتوي على
<Spinner>في DevTools. تقع الخلايا إلى يمين مؤشر التحميل خارج الشبكة.
أثّرت هذه الحادثة في: console.log.
تحليل ما بعد الحادثة
يرسم
LineChartنقاطًا ربعية افتراضيًا للسبب نفسه. تتوفر برايل عبرmarker="braille".- حُلّت
مايو 2026
ارتفاع نسبة عمليات الرسم الفارغة في وحدة التحكم في DevTools5 مايو – 19 مايو 2026 · حُلّت
- حُلّت
صدر الإصلاح ضمن Text.js 0.4.0. بلغت نسبة عمليات الرسم الفارغة 1.0%، وجميعها في الإطار الأول.
- قيد المراقبة
يُلحق textjs.org الإطارات الآن بدلًا من المسح. يُبقي span ستار بعرض صفري الإطارات السابقة خارج العرض، وتُضبط وتيرة الإطارات بفاصل لا يقل عن 66 ms.
- حُدّد السبب
تطبق DevTools الأمر
console.clear()تزامنيًا لكنها ترسم الرسائل الجديدة بخنق قدره 50 ms. يزيل كل إطار سابقه فورًا ويُرسم بعد مدة تصل إلى 50 ms. فيbench/devtools، كانت لوحة معلومات بحجم 100×32 فارغة في 70.6% من عمليات رسم DevTools عند 15 إطارًا في الثانية و81.1% عند 60 إطارًا في الثانية. - قيد التحقيق
نحقق في بلاغات عن وميض وحدة التحكم في 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 · حُلّت
- حُلّت
حُلّت هذه الحادثة.
- قيد المراقبة
نُشر إصلاح. يُدرج المرمّز محرف word joiner (U+2060) في نصوص
path:lineو//host:portوdata:، إلا إذا كانت الخلية تسمح بالروابط. - حُدّد السبب
تحوّل DevTools عناوين URL ونصوص
path:lineو//host:portفي رسائل وحدة التحكم إلى روابط وتفرض عليها ألوان سمتها. كان المرمّز يفصل://وwww.بالفعل، لكنpath:lineو//host:portبعد مخطط العنوان ما زالا يطابقان النمط. - قيد التحقيق
تُعرض نصوص مثل
src/app.tsx:12وhttp://localhost:3000بلون روابط DevTools بدلًا من نمط%cالخاص بها.
أثّرت هذه الحادثة في: Turbolog encoder.
تحليل ما بعد الحادثة
يحتوي
://وwww.على محرف word joiner منذ 0.1.0. تضبط الخلايا التي ينبغي أن تبقى قابلة للنقر سمة السماح بالروابط وتُكتب دون تغيير.- حُلّت
نوفمبر 2025
تأخر ضغطات المفاتيح في تطبيقات وحدة التحكم4 نوفمبر – 18 نوفمبر 2025 · حُلّت
- حُلّت
صدر الإصلاح في Text.js 0.3.0.
- قيد المراقبة
نُشر إصلاح. يُعرض الإدخال المنفصل، مثل ضغطة مفتاح أو لصق، تزامنيًا الآن في المهمة نفسها. وتظل التحديثات الأخرى تُعتمد عند
requestAnimationFrame. - حُدّد السبب
ينتظر كل تحديث، بما في ذلك ضغطة المفتاح، استدعاء
requestAnimationFrameالتالي قبل أن تعتمد React التغييرات ويُسجّل الإطار. - قيد التحقيق
تتأخر الكتابة في تطبيقات وحدة التحكم عن لوحة المفاتيح، ويظهر ذلك بوضوح أكبر في OpenCode على textjs.org.
أثّرت هذه الحادثة في: textjs.org.
تحليل ما بعد الحادثة
لم تعد ضغطات المفاتيح تنتظر إطار الحركة التالي. وتظل التحديثات التي لا تأتي من الإدخال، مثل المؤقتات والبيانات المتدفقة، تُجمّع لكل إطار حركة.
الإصلاح:
8c2d1b1· سجل التغييرات: 0.3.0- حُلّت