تازههای Text.js
همهٔ تغییرات مهم Text.js در این فایل ثبت شدهاند.
افزودهها
- textjs.org: نسخههای اسپانیایی، فرانسوی، آلمانی، پرتغالی برزیلی، کرهای و چینی سادهشده و سنتی در textjs.org/es، /fr، /de، /pt-br، /ko، /zh-cn و /zh-tw از حالت پیشنویس خارج شدهاند. انتخابگر زبان پابرگ و دکمهٔ زبان مرورگر، مانند زبان ژاپنی، این زبانها را ارائه میکنند. موتورهای جستوجو صفحههای ترجمهشده را نمایهسازی میکنند و هرکدام را با نسخهٔ انگلیسی آن تطبیق میدهند.
- textjs.org: نسخههای ایتالیایی، روسی، ترکی، لهستانی، اندونزیایی، ویتنامی و هندی در textjs.org/it، /ru، /tr، /pl، /id، /vi و /hi از حالت پیشنویس خارج شدهاند. انتخابگر زبان پابرگ و دکمهٔ زبان مرورگر، مانند زبانهای دیگر، این زبانها را ارائه میکنند. موتورهای جستوجو صفحههای ترجمهشده را نمایهسازی میکنند و هرکدام را با نسخهٔ انگلیسی آن تطبیق میدهند.
- textjs.org: نسخههای عربی، عبری، فارسی و اردو در textjs.org/ar، /he، /fa و /ur از حالت پیشنویس خارج شدهاند. انتخابگر زبان پابرگ و دکمهٔ زبان مرورگر، مانند زبانهای دیگر، این زبانها را ارائه میکنند. موتورهای جستوجو صفحههای ترجمهشده را نمایهسازی میکنند و هرکدام را با نسخهٔ انگلیسی آن تطبیق میدهند.
تغییرات
@textjs/react: کامپوننتهای<FocusPad>و<ViewportControl>برچسبهای تکعرض خود را با مجموعهفونت--monoصفحه نمایش میدهند، اگر صفحه آن را تعریف کرده باشد، و مانند قبل در نبود آن از Geist Mono استفاده میکنند. صفحهای با برچسبهای عربی یا عبری میتواند فونتهای خط خود را به--monoاضافه کند.
رفع اشکالها
- textjs.org: در تلفنها، کد درونخطی بلندتر از خط، بهجای عریض کردن صفحه به خط بعد میرود. عرض textjs.org/docs/internationalization در صفحهنمایش 390 px، بهاندازهٔ 92 px بیش از حد بود.
افزودهها
@textjs/react: کامپوننت<FocusPad messages>برای سایتهای ترجمهشده، هرکدام از رشتههای داخلی پد را جایگزین میکند. این قابلیت همهٔ سطرها، برچسبهای صفحهخوان و کنترل اندازهٔ کنسول را پوشش میدهد. کامپوننتهای<TextCanvas>و<ViewportControl>نیزmessagesرا میپذیرند. کامپوننت<ViewportControl>فقط از کلیدهای کنترل اندازه استفاده میکند. رشتههایی که مقداری در خود دارند، مانند «سپس اینجا کلیک کنید و ↑ ↓ را فشار دهید.»، تابعهایی هستند که جملهٔ کامل را برمیگردانند. متن انگلیسی درdefaultFocusPadMessagesقرار دارد. ترجمهٔ پد فوکوس را ببینید.@textjs/react: در صفحههای راستبهچپ، پد فوکوس کلیدهایی مانند ⌘ ⌥ J و اندازههای کنسول مانند 120×36 را چپبهراست نگه میدارد و کنترل اندازه و نوار مراحل را قرینه میکند. در صفحههای چینی و ژاپنی، فاصلهٔ میان دو جملهٔ خود را حذف میکند؛ در کرهای این فاصله حفظ میشود.- textjs.org: نسخهٔ textjs.org/ja از حالت پیشنویس خارج شده است. انتخابگر زبان پابرگ، همان صفحه را به انگلیسی یا ژاپنی باز میکند. مرورگری که زبانش ژاپنی است دکمهٔ «خواندن به ژاپنی» را نشان میدهد و مرورگر انگلیسی در textjs.org/ja دکمهٔ «خواندن به انگلیسی» را نشان میدهد. پس از انتخاب زبان یا بستن دکمه، دیگر نمایش داده نمیشود. موتورهای جستوجو صفحههای ترجمهشدهٔ ژاپنی را نمایهسازی میکنند و هرکدام را با نسخهٔ انگلیسی آن تطبیق میدهند.
- textjs.org: در textjs.org/ja، پد فوکوس در همهٔ صفحهها ژاپنی است، از جمله برچسبهای زیر کلیدهای هر دمو.
تغییرات
@textjs/core: کنسولهای Chromium و Firefox خروجی اسپرایت متحرک را در 16 MB بهجای 4 MB پاک میکنند، بنابراین textjs.org/doom پیام «کنسول پاک شد» را حدود هر 19 ثانیه بهجای هر 4.5 ثانیه نشان میدهد. Safari و اسپرایتهایی که با نیمبلوکهای▀رسم میشوند، همان 4 MB را نگه میدارند. اوج حافظهٔ هیپ صفحه در textjs.org/doom از 10.8 MB به حدود 12–13 MB میرسد.- textjs.org: هر صفحهٔ مستندات فقط Markdown خودش را بهجای هر 33 صفحه بارگیری میکند، بنابراین صفحههای مستندات انگلیسی 43–47 KB جاوااسکریپت کمتر (gzip) و صفحههای مستندات /ja مقدار 60–64 KB کمتر بارگیری میکنند. قرار دادن نشانگر روی پیوند صفحهٔ دیگری از مستندات یا فوکوس کردن آن، آن صفحه را زودتر دریافت میکند تا همچنان بیدرنگ باز شود.
رفع اشکالها
- textjs.org/ja: جستوجوی ⌘K عنوانهای ژاپنی مستندات را نشان میدهد و پرسوجوهای ژاپنی را با آنها تطبیق میدهد. پیشتر عنوانهای انگلیسی را زیر عنوان صفحههای ژاپنی فهرست میکرد. نامهای انگلیسی همچنان صفحهها را پیدا میکنند:
routingمسیریابی را پیدا میکند وopen the consoleباز کردن کنسول را پیدا میکند. - textjs.org: نمونهٔ مستنداتی که در کنسول شما اجرا میشود، دوباره تغییراتش را در پیشنمایش صفحه در textjs.org/ja و برای نمونهٔ متن دوجهته در textjs.org/docs/internationalization نشان میدهد. سطر بالای نمونه در کنسول اکنون بهجای «▼ مستندات › مقدمه › شمارنده»، «▼ مستندات › شمارنده» است.
افزودهها
- textjs.org/doom جلوههای صوتی Doom را با جابهجایی استریو و کاهش صدا برحسب فاصلهٔ خود Doom پخش میکند. صدا با نخستین کلیک یا فشردن کلید در صفحه شروع میشود، همراه بازی متوقف میشود و از گزینهٔ حجم جلوههای صوتی در منوی گزینهها ← حجم صدا در Doom پیروی میکند. موسیقی ندارد.
تغییرات
@textjs/react،@textjs/app: راهنمای فوکوس («برای استفاده از صفحهکلید، روی صفحه کلیک کنید») در همهٔ پوستهها نواری کهربایی با متن سیاه پررنگ است. پیشتر رنگهای معکوس پوسته را داشت. هر بار که ظاهر میشود، طی حدود 6 ثانیه 4 بار چشمک میزند و سپس کهربایی میماند. وقتی کاهش حرکت فعال است، چشمک نمیزند. هر چرخهٔ چشمک تا 8 فریم اضافی در کنسول ثبت میکند.- textjs.org: بازی Doom به textjs.org/doom منتقل شد. نشانی textjs.org/playground/doom به آنجا هدایت میشود.
رفع اشکالها
@textjs/core،@textjs/react: پنل «مشکلات» Chrome دیگر در هر صفحه پیام «عنصر فیلد فرم باید ویژگی id یا name داشته باشد» را گزارش نمیکند. عنصر پنهان<textarea>برای صفحهکلید،textjs-inputنام دارد و عنصر<select>اندازهٔ کنسول درViewportControl(همچنین درsizeControlکامپوننتFocusPad) دارایidو نامtextjs-console-sizeاست. عنصر<textarea>صفحهکلید، 1Password، LastPass، Bitwarden و Dashlane را نیز غیرفعال میکند.- textjs.org: سربرگ کنسول در textjs.org/doom بهجای «Text.js / playground / doom»، عبارت «Text.js / doom» را نشان میدهد.
- textjs.org/doom: در پنجرهٔ باریک، دیگر یک «·» اضافی پس از «مشاهدهٔ کد منبع» باقی نمیماند.
- textjs.org: در پنجرهٔ باریک، انتخابگر دموی Playground در لبهای که دموهای بیشتری برای پیمایش دارد محو میشود، بهجای اینکه آخرین دمو را از وسط کلمه قطع کند.
- textjs.org/doom با نرخ 35 تیک در ثانیهٔ Doom اجرا میشود. در یک مرحله، روی نمایشگر 60 Hz با سرعت 3.8 برابر (131 تیک در ثانیه) و روی نمایشگر 120 Hz با سرعت 5.5 برابر (192) اجرا میشد، زیرا صفحه خواندنهای اضافی ساعت را که Doom هنگام ترسیم مرحله انجام میدهد با انتظار فعال اشتباه میگرفت و در هر فریم پویانمایی و فراخوانی بازگشتی زمانسنج، ساعت Doom را یک تیک جلو میبرد.
افزودهها
@textjs/react: کامپوننت<Image renderMode="halfblock">همهجا نیمبلوکهای▀را رسم میکند، همانطور که<Image>در 1.3 انجام میداد.@textjs/core/experimental: تابعdrawPixelsمقدارencoding: "rgba"را برای اسپرایتی بدون اتلاف با آلفای نرم و بیش از 256 رنگ میپذیرد و یک تابعfallbackکه هرجا نمایش اسپرایت ممکن نباشد سلولها را رسم میکند.@textjs/app: ابزارهای curl، Wget، HTTPie و xh درtext dev،text startو آداپتورهایbun،vercelوcloudflare، نخستین فریم صفحه را بهصورت متن ANSI با رنگ واقعی بهجای صفحهٔ HTML دریافت میکنند. دستورtext buildفریمهای صفحههای ایستا را پیشرندر میکند. دستورtext startو آداپتورbunصفحههای پویا و رندرشده در سمت سرور را هنگام درخواست رندر میکنند و به مسیرهای ناشناخته با صفحهٔ پیدا نشد برنامه و کد404پاسخ میدهند. اندازهٔ پیشفرض فریمها 80 × 24 است. باansiدرtext.config.tsیاexport const ansiدر یک صفحه، اندازه را تغییر دهید یا فریمها را غیرفعال کنید. آداپتورstaticصفحهٔ HTML را به curl ارائه میکند. curl و کلاینتهای ترمینال را ببینید.@textjs/app/ansiتابعهایwantsAnsiوansiResponseرا برای سرورهایی که ازtext startیا آداپتور استفاده نمیکنند صادر میکند و@textjs/reactتابعframeToAnsiرا صادر میکند.- textjs.org: نسخهٔ پیشنویس ژاپنی در textjs.org/ja، با شروع از مستندات مقدمه، نصب و مسیریابی و رابط سایت. بندهای ترجمهنشده به انگلیسی نمایش داده میشوند. هنوز نمایهسازی نمیشود و در انتخابگر زبان ارائه نمیشود.
تغییرات
@textjs/react: کامپوننت<Image>اکنون در کنسولهای Chromium و Firefox یک اسپرایت پیکسلی رسم میکند، با حداکثر 8 × 16 پیکسل در هر سلول برای هنر پیکسلی و 4 × 8 برای عکسها. این تغییر عمداً وعدهٔ سیاست پشتیبانی دربارهٔ یکسان ماندن ظاهر فریمها میان نسخههای فرعی را نقض میکند. برای حفظ نیمبلوکهای 1.3، مقدارrenderMode="halfblock"را ارسال کنید. Safari، ترمینالها (از جملهtext run)، خروجی ANSI و متن ساده و صفحههای رندرشده در سمت سرور (runtime = "server") همچنان نیمبلوک رسم میکنند.@textjs/app: اسکریپتها و بررسیهای دسترسپذیری که صفحهها را با curl، Wget، HTTPie یا xh دریافت میکنند اکنون متن ANSI میگیرند. برای ادامهٔ دریافت HTML، هدرAccept: text/htmlرا ارسال کنید یا درtext.config.tsمقدارansi: falseرا تنظیم کنید.@textjs/app: کامپوننتهای ناهمگام سرور دیگر هنگام پیشرندر پوستهٔ صفحه باtext buildاجرا نمیشوند. مانند قبل محتوای جایگزین<Suspense>خود را نشان میدهند، بدون اینکه درخواستهای داده را هنگام ساخت شروع کنند.@textjs/app: پخشکنندهٔ فریم صفحههای رندرشده در سمت سرور 3 KB کوچکتر است؛ برایexamples/dashboardبهجای 25.4 KB، برابر 22.4 KB با gzip است. دیگر متدهای رسمCellBuffer، حاشیههای کادر یا کوتاهسازی متن را همراه خود ندارد.
رفع اشکالها
@textjs/core: نمودارها و نشانگرهای چرخان در Windows 10 شبکهٔ خود را حفظ میکنند. قلم کنسول آن Consolas است که بلوکهای یکهشتمی ▁▂▃▅▆▇، ربعبلوکها، بریل، ▶ یا ✓ را ندارد و گلیفهای جایگزین آنها سطرها را از لبهٔ راست فریم بیرون میبردند. اکنونCssConsoleDriverیک بار اندازه میگیرد که قلم کنسول کدام گلیفها را با اختلاف بیش از یکپنجم سلول رسم میکند و آنها را با نزدیکترین گلیف موجود در Consolas رسم میکند:_▄▌█برای یکهشتمها، نیمبلوک برای ربعبلوکها و بریل و►◄√×برای پیکانها، تیکها و ضربدرها. قلمهایی که این گلیفها در آنها جا میگیرند، مانند Cascadia Mono در Windows 11 و Menlo در macOS، شکلهای اصلی را رسم میکنند. تنظیمmeasureText: falseاین قابلیت را غیرفعال میکند.@textjs/core: دیگر خطهای عمودی باریک 1 پیکسلی میان پسزمینههای مجاور در DevTools مرورگرهای Chrome و Edge وجود ندارند، مانند کنار «حساب» و «تعداد» در textjs.org/coffee. Chromium هر span از نوع%cرا جداگانه با پیکسلهای دستگاه همتراز میکند و ممکن بود پیکسل محل اتصال دو span به هیچکدام تعلق نگیرد. اکنونCssConsoleDriverپسزمینهٔ span را 1 پیکسل زیر همسایهٔ مات سمت راست گسترش میدهد (padding-right:1px;margin-right:-1px). فریمهای Firefox و Safari تغییر نمیکنند.@textjs/core: اسپرایتهای<Image>در Chrome و Edge از همان قاعدهٔ 1 پیکسلی متن پیروی میکنند. متن سمت چپ اسپرایت شفاف دیگر نواری 1 پیکسلی از پسزمینهٔ خود را روی لبهٔ چپ اسپرایت رسم نمیکند و اسپرایت بدون شکاف به متن مات سمت راست، از جمله متن معکوس، میچسبد. اسپرایتی که در سطرهای خود تنهاست اکنون مانند سطرهای متن بالا و پایینش تا لبهٔ راست فریم میرسد.@textjs/react: کامپوننت<ConsoleMirror>عکس کنار متن را مانند کنسول بهصورت نیمبلوک رسم میکند، نه بهصورت تصویر.
افزودهها
@textjs/react/experimentalکامپوننت<Pixels>را برای فریمبافرهای زنده وuseKeyStateرا برای کلیدهای نگهداشتهشده صادر میکند؛@textjs/core/experimentalتابعdrawPixelsرا صادر میکند. این موارد ممکن است در یک نسخهٔ فرعی تغییر کنند.- textjs.org/playground/doom: قسمت اشتراکی Doom را در کنسول DevTools بازی کنید.
@textjs/react،@textjs/app: وقتی صفحه فوکوس ندارد، آخرین سطر فریم کنسول پیام «برای استفاده از صفحهکلید، روی صفحه کلیک کنید» را نشان میدهد تا بازدیدکنندهای که روی برنامه در کنسول کلیک میکند بداند چرا کلیدها دیگر کار نمیکنند. این پیام وقتی برنامه کنترلگرuseInputیاusePasteیا هدف فوکوس داشته باشد، فقط در کنسول مرورگر، از جمله در مسیرهای رندرشده در سمت سرور، نمایش داده میشود. آینههای درونصفحهای و پیشنمایش VS Code آن را نشان نمیدهند. باfocusHint: falseدرtext.config.tsیاcreateConsoleRootآن را غیرفعال کنید.@textjs/react: هوکusePageFocus()برمیگرداند که آیا صفحه فوکوس دارد. برای اینکه خودتان تعیین کنید برنامه چه زمانی صفحهکلید را میخواهد، مقدارfocusHint: falseرا تنظیم کنید و<FocusHint active={…}>را رندر کنید. فراخوانیuseInput(handler, { ambient: true })یک میانبر همیشهفعال را مشخص میکند که بهتنهایی راهنما را نشان نمیدهد.
تغییرات
@textjs/core: هنگام متحرک بودن اسپرایت<Pixels>، شیءConsoleRendererدر Chromium هر 51 ms فریمهای کلیدی را دستهبندی میکند، در Safari فاصلهٔ فریمها را روی 33 ms تنظیم میکند و خروجی افزودهشده به انتها را درCssConsoleDriverدر 4 MB پاک میکند (SPRITE_MAX_BYTES). اسپرایتهای ایستا و برنامههای صرفاً متنی، زمانبندی موجود و حد پاکسازی 300 فریم را حفظ میکنند.
افزودهها
@textjs/core: تابعbindTextSink(element, onText)متن نهاییشده با IME یا کلید مرده را از textarea یا input مخفی میخواند، یک بار در هر نهاییسازی و هرگز در میانهٔ ترکیب. تابعengine.bindTextSink(element)یک textarea را که خودتان رندر میکنید بهInputEngineمتصل میکند. هر دو تابعی برمیگردانند که شنوندهها را حذف میکند.@textjs/app: نقطهٔ پایانیPOST /__textjs/inputبرای متن IME و کلید مرده،{ type: "text", text }را میپذیرد. نوعInputMessageو تابعparseInputMessageدر@textjs/app/frame-protocolآن را شامل میشوند.
تغییرات
@textjs/app: میانافزار و کنترلگرهای مسیر، مسیر معیار را دریافت میکنند. مسیرهای/docs/و/docs//introبهصورت/docsو/docs/introمیرسند، بنابراین میانافزاری که برای افزودن اسلش پایانی تغییرمسیر میدهد، اکنون بیپایان تغییرمسیر میدهد. آن تغییرمسیر را حذف کنید. بخش پویا نمیتواند اسلش کدگذاریشده داشته باشد: مسیر/files/a%2Fbکد400را برمیگرداند.@textjs/app: با میانافزار، گزینهٔ--adapter cloudflareهمهٔ درخواستها، از جمله داراییهای هششده را به worker میفرستد و باbasePathدرخواستهای خارج از مسیر پایه را نیز میفرستد. هر درخواستی که worker را اجرا میکند یک فراخوانی Functions است و از سهمیهٔ درخواست Workers شما کم میکند. در طرح Workers Free، پروژهٔ Pages را روی حالت بسته هنگام خطا تنظیم کنید (تنظیمات ← محیط اجرا ← باز / بسته هنگام خطا)، وگرنه پس از اتمام سهمیهٔ روزانه، Pages فایلهای شما را بدون میانافزار ارائه میکند.
رفع اشکالها
- IMEهای چینی، ژاپنی و کرهای و کلیدهای مرده در کنسولهای درونصفحهای textjs.org کار میکنند. کنسولها textarea را در میانهٔ ترکیب پاک میکردند، بنابراین برنامه حروف خام یا نویسهٔ اشتباه را دریافت میکرد.
- کامپوننت
<FocusPad>پس از کلیک فوکوس صفحهکلید را روی برنامه نگه میدارد. پیشتر فوکوس را بیدرنگ از دست میداد، بنابراین IMEهای چینی، ژاپنی و کرهای نمیتوانستند متن ترکیب کنند. - کلیدهای مردهای که ترکیب نمیشوند (Windows و Linux بدون IME)، با فوکوس بودن textarea مخفی به برنامه میرسند. در US-International، کلید
'و سپسeنویسهٔéو کلید'و سپسtمتن'tرا میدهد. شیءInputEngineرویداد keydown تکمیلکنندهٔ کلید مرده را مسدود میکرد، بنابراین مرورگر چیزی درج نمیکرد. اکنونDeadKeyTrackerدر@textjs/coreاجازهٔ عبور آن keydown را میدهد و پیشنمایش VS Code نیز از آن استفاده میکند. - پیشنمایش VS Code متن IME و کلید مرده را که پیشتر حذف میکرد تحویل میدهد و دیگر کلیدهای مرده یا کلیدهای ترکیب IME را به برنامه نمیفرستد. با سرور
text devاز@textjs/appنسخهٔ 1.1.0 یا قدیمیتر، متن را بهصورت فشردن کلید یا چسباندن ارسال میکند. @textjs/core: متدInputEngine.handleTextInputهنگامی کهshouldCaptureمقدارfalseبرمیگرداند، متن را نادیده میگیرد، همانطور که ورودی کلید و چسباندن از قبل چنین میکردند.- دستور
text devبستههای@textjs/app/live-stubو@textjs/app/live-playerرا پیشبستهبندی میکند. برنامهای با صفحهٔruntime = "server"آنها را فقط پس از نخستین بارگذاری صفحه پیدا میکرد، بنابراین Vite آنها را دوباره در میانهٔ بارگذاری بستهبندی میکرد که باعث خطاهای 404 برای قطعههای قدیمی و پیام «فراخوانی نامعتبر هوک» بهعلت دو نسخه از React میشد. - نمودارها و نشانگرهای چرخان در Windows در فریم جا میگیرند. Consolas بلوکهای ▁▂▃▅▆▇، ربعبلوکها، بریل، ▶ یا ✓ را ندارد، بنابراین Windows آنها را با قلمهای جایگزین تا عرض 1.8 سلول رسم میکرد و سطرهای نمودار از لبهٔ راست فریم بیرون میرفتند. پشتهٔ قلم کنسول اکنون
"SF Mono",Menlo,"Cascadia Mono",Consolas,monospaceاست و Windows 11 کل فریم را با Cascadia Mono رسم میکند. کامپوننت<ConsoleMirror>، پیشنمایش VS Code و نمای فریم افزونهٔ DevTools نیز Cascadia Mono را پیش از Consolas قرار میدهند. @textjs/opencode: در Node روی Windows، پل نسخهٔ OpenCode نصبشده باnpm i -g opencode-aiرا پیدا میکند. Node نمیتواند واسطopencode.cmdمتعلق به npm را با نام اجرا کند، بنابراین پل چنان رفتار میکرد که گویی OpenCode نصب نیست. اکنونPATHرا با هر پسوندPATHEXTجستوجو میکند و واسطهای.cmdرا از طریقcmd.exeاجرا میکند. در Bun (bunx) از قبل کار میکرد.- دستور
text buildدر Windows کار میکند. پیشتر برای همهٔ قالبها با پیامCould not resolve entry module "virtual:textjs/api"یا بدون پیام خطا شکست میخورد. - دستور
text buildهنگام شکست پیشرندر پوستههای کنسول یا ساخت مسیرهای رندرشده در سمت سرور، خطا را چاپ میکند. پیشتر پس از سطر «ساخت ناموفق بود» در Vite، بدون ذکر دلیل با کد 1 خارج میشد. - دستور
text devدر Windows هنگام ویرایش فایل، مسیرهای رندرشده در سمت سرور را دوباره رندر میکند و هنگام تغییر خروجیruntimeصفحه، مرورگر را دوباره بارگذاری میکند. - دستور
text devدر Windows دیگرmiddleware.tsرا برای فایلهای منبعی که Vite بهصورت ماژول ارائه میکند، مانند/app/page.tsx، اجرا نمیکند، بنابراین تغییرمسیر احراز هویت دیگر کلاینت توسعه را خراب نمیکند. - دستورهای
text runوtext mcpوقتی مسیر پروژه نام کوتاه Windows 8.3، مانندC:\Users\RUNNER~1، دارد کار میکنند. پیشتر پیام «خطای برنامه» را نشان میدادند زیرا CLI و برنامه،@textjs/appرا دو بار بارگذاری میکردند. - خروجی
dist/ساختهشده در Windows صفحههای پیشرندرشدهٔ خود را در Linux و macOS ارائه میکند. فهرست مسیرهای زنده، مسیرهای خود را با بکاسلش ذخیره میکرد. - دستور
text buildوقتی گزینهٔviteدرtext.config.tsمقدارbuild.rollupOptions.inputرا تنظیم میکند کار میکند. ورودی، نقطههای ورود بستههای API، مسیر رندرشده در سمت سرور و آداپتور را جایگزین میکرد و ساخت شکست میخورد. - دستور
text devوقتی در ثانیههای نخست پس از بارگذاری صفحه آن را متوقف میکنید خارج میشود وserver.close()تکمیل میشود. بستن Vite هنگام بهینهسازی وابستگیهای تازهکشفشده هرگز تمام نمیشد (vitejs/vite#22934).
امنیت
- بستهٔ
@textjs/appنسخهٔ 1.1.0 و قدیمیتر به درخواست اجازه میداد با نوشتن مسیر محافظتشده بهشکلی دیگر، مانند/ad%6din،/api//adminیا/admin%2Fx، ازmiddleware.tsعبور کند. میانافزار مسیر را همانطور که ارسال شده بود تطبیق میداد، درحالیکه صفحهها، کنترلگرهای مسیر و فایلهای ایستا پس از رمزگشایی آن جستوجو میشدند (برای کنترلگرهای مسیر دو بار). این مشکل برtext dev،text startو ساختهای--adapter bun،vercelوcloudflareاثر داشت. ساختهای ایستا نمیتوانند از میانافزار استفاده کنند و تحت تأثیر نیستند. به 1.2.0 ارتقا دهید، سپس دوباره بسازید و مستقر کنید:.vercel/outputبرای Vercel، دایرکتوریdist/برای Cloudflare Pages و کلdist/برای Bun (سرور را دوباره راهاندازی کنید). استقرارهای قدیمی را که هنوز از نشانیهای خود در دسترساند حذف یا محافظت کنید. - اکنون هر میزبان برای هر درخواست یک نام مسیر معیار تعیین میکند و آن را برای تطبیقدهنده،
request.nextUrlو همهٔ جستوجوها به کار میبرد. دنبالههای درصدی را رمزگشایی و مسیر را بهشکلی کهnew URL()مینویسد دوباره کدگذاری میکند، بخشهای.و..را حل میکند و اسلشهای تکراری و پایانی را حذف میکند. مسیرهای دارای%2F،%5Cیا کدگذاری درصدی نامعتبر کد400میگیرند. دستورهایtext dev،text startو آداپتور Bun فایلهای ایستا را فقط با نام دقیق خود ارائه میکنند، بنابراین در macOS و Windows مسیر/ADMIN/report.txtدیگر فایلpublic/admin/report.txtرا ارائه نمیکند. - تطبیقدهندهها، مبدأهای بازنویسی، بخشهای مسیر و
basePathدر همان شکل کدگذاریشدهٔ مسیرهای درخواست مقایسه میشوند، بنابراینmatcher: "/café/:path*"و"/caf%c3%a9/:path*"از/caf%C3%A9محافظت میکنند و"/ops%40corp/:path*"از/ops@corpمحافظت میکند. میانافزار بدون تطبیقدهنده خارج ازbasePathاجرا نمیشود. تطبیقدهندهٔ دارای اسلش پایانی، مانند/admin/، با/adminتطبیق مییابد و شرطhostنقطهٔ پایانی نام میزبان را نادیده میگیرد. - نشست زندهٔ مسیر
runtime = "server"صفحهای را که میانافزار به مسیر یا پرسوجوی دیگری بازنویسی کرده، مانند بازنویسی از/restrictedبه/login، یا با وضعیت خطا مانندNextResponse.next({ status: 403 })پاسخ داده است، رندر نمیکند. --adapter vercel: تابع کنترلگر مسیر، مسیر خود را در هدر درخواستی دریافت میکند که فقط مسیرهای تولیدشده آن را تنظیم میکنند، بنابراین/api/x/%252e%252e/adminدیگر به/api/adminنمیرسد و هیچ شکل نوشتاری از/_textjs/*تابع را اجرا نمیکند. مسیرهای تولیدشده با حساسیت به بزرگی و کوچکی حروف تطبیق مییابند، بنابراین/LEGACY/xدیگر به بازنویسی/legacy/:path*که میانافزار هرگز بررسی نکرده بود نمیرسد. هر مسیری که ممکن است معیار نباشد، از جمله نویسههای خام مانند{، از edge middleware میگذرد که اکنون همراه هر ساخت Vercel ارائه میشود و درخواست را به مسیر معیار آن بازنویسی میکند.--adapter cloudflare: فایلهای ایستا با مسیر کدگذاریشده جستوجو میشوند، بنابراین/x/%252e%252e/admin/report.txtدیگر/admin/report.txtرا ارائه نمیکند. باbasePath، فایلهای خارج از آن دیگر بدون worker ارائه نمیشوند.- دستور
text devفایلهایpublic/را زیر/public/…یا/@fs/…، منابع مختص سرور مانندmiddleware.tsوtext.config.tsرا با بزرگی و کوچکی حروف متفاوت، زیر مسیر کدگذاریشدهٔ/@fs/، بهصورت درخواست ماژول بدون پسوند (/text.config?import) یا از طریق بازنویسی پیکربندی و کنترلگرهای مسیر را خارج ازbasePathارائه نمیکند.
افزودهها
- Text.js در کنسولهای Firefox و Safari رندر میشود. شیء
CssConsoleDriverمرورگر را با بررسی قابلیتهای CSS تشخیص میدهد. هرجا spanهای%cدرونخطی میمانند، ارتفاع سطر 14 پیکسلی بدون حاشیه مینویسد، شکستن خودکار سطر را غیرفعال میکند و از پردهای باline-height: 100vhاستفاده میکند. - اندازهگذاری واکنشگرا برای ستون پیوند منبع Firefox جا میگذارد. Safari قلم Menlo را در ابتدای پشتهٔ قلم قرار میدهد: صفحههای آن نمیتوانند از SF Mono نصبشده بهدست کاربر استفاده کنند، درحالیکه Web Inspector ممکن است با آن رسم کند.
- برای انتخاب کنسول، مقدار
browser: "chromium" | "firefox" | "safari"را بهcreateConsoleRoot،ConsoleRendererیاCssConsoleDriverبدهید. - پوستههای پیشرندرشده CSS هر دو نوع کنسول را همراه دارند.
- کامپوننت
<FocusPad>میانبر کنسول مرورگر بازدیدکننده را نشان میدهد: ⌘⌥K یا Ctrl+Shift+K در Firefox و ⌘⌥C در Safari همراه با یادداشتی برای فعال کردن «نمایش قابلیتها برای توسعهدهندگان وب». - کامپوننت پیشرندرشدهٔ
<FocusPad>میانبر همهٔ مرورگرها را رندر میکند. پیش از نخستین رسم،data-browser(firefoxیاsafari) وdata-os(mac) را روی<html>تنظیم کنید تا فقط میانبر بازدیدکننده نمایش داده شود؛ بدون آنها تا زمان آبرسانی، میانبر Chrome در Windows و Linux را نشان میدهد.
رفع اشکالها
- میانبرهای ⌘⌥K و Ctrl+Shift+K (میانبر کنسول Firefox) بهجای رسیدن به برنامه، به مرورگر منتقل میشوند.
- اندازهگذاری واکنشگرا هنگام بسته بودن DevTools ارتفاع نوارابزارهای مرورگر کوتاهتر از 60 پیکسل (Safari و Firefox) را یاد میگیرد، بنابراین کنسول متصل به پایین همهٔ سطرهایی را که در آن جا میگیرند دریافت میکند. کامپوننت
<FocusPad>از ارتفاع آموختهشده برای تشخیص متصل بودن DevTools استفاده میکند. - کامپوننت
<FocusPad>میانبرهای Windows و Linux را در حالت کلیک خود بهصورتCtrl+Shift+Jمینویسد.
امنیت
@textjs/opencode: پل هنگام شروع یک کد جفتسازی چاپ میکند و textjs.org/opencode در نخستین اتصال آن را میخواهد. تا زمانی که صفحه کد را ارسال نکند، پل با428پاسخ میدهد و چیزی به OpenCode نمیفرستد، حتی برای مبدأهای مجاز. هر کد برای یک اجرای پل معتبر است، توکن برگشتی فقط از مبدأ جفتشده کار میکند و ده کد اشتباه، جفتسازی را تا راهاندازی دوبارهٔ پل قفل میکند.@textjs/opencode: استقرارهای پیشنمایش Cloudflare Pages از textjs.org دیگر بهطور پیشفرض مجاز نیستند. برای استفاده از یکی، گزینهٔ--allow-originرا بدهید.- textjs.org/opencode پلهای
@textjs/opencodeنسخهٔ 1.0.x را نمیپذیرد. دستورbunx @textjs/opencode@latest proxyرا اجرا کنید. - textjs.org هدرهای Content-Security-Policy،
Strict-Transport-Security،Cross-Origin-Opener-PolicyوCross-Origin-Resource-Policyرا میفرستد. صفحهٔ OpenCode فقط به سرورهای روی127.0.0.1یاlocalhostمتصل میشود.
- Text.js در کنسولهای Firefox و Safari رندر میشود. شیء
افزودهها
- OpenCode Lite: تفاوتهای هر فایل را بازبینی کنید، تاریخچهٔ پرامپت را مرور کنید، میانبرهای پیشوندی را پیکربندی کنید و حسابهای ارائهدهندگان و سرورهای MCP را مدیریت کنید. محیط آزمایشی شامل پنجرهٔ ترمینال اسکریپتشده است.
- OpenCode Lite: برای جستوجوی فرمانها
/یا برای پیوست کردن فایل پروژه@را تایپ کنید. کلید Tab در منوی فایل یک دایرکتوری را باز میکند. نشستهای متصل پروژهٔ سرور را جستوجو میکنند؛ محیط آزمایشی مخزن نمونهٔ خود را جستوجو میکند. - textjs.org/coffee: دموی terminal.shop مانند برنامهٔ SSH از اندازهٔ کنسول پیروی میکند، با چیدمانهای کوچک، متوسط و بزرگ و پیام «ترمینال شما بیش از حد کوچک است» در اندازههای کمتر از 20 × 10. حساب کاربری روشهای پرداخت، نمایهای با نام قابل ویرایش و تغییر برنامهٔ هفتگی اشتراکها را اضافه میکند. در حالت خروج از حساب، سبد خرید و پرسشهای متداول، درباره و اطلاعات اشکالزدایی حساب بدون ورود باز میشوند.
کارایی
@textjs/react: کامپوننتهایBoxوTextبهجای کپی کردن آبجکتهای prop هنگام نصب و بهروزرسانی، propهای صحنه را که از پیش پالایش شدهاند به تطبیقدهنده میدهند.@textjs/core: متدSceneNode.getTextModel()از پیمایشهای درخت درونخطی روی برگهای تکرشتهای<Text>صرفنظر میکند و از بافرهای صفرشده و ذخیرهشدهٔUint16Arrayبا نامrunOfدوباره استفاده میکند.CssConsoleDriverسلولهای متوالی BMP با سبک یکسان را در حلقهای داخلی بررسی میکند وConsoleRendererدر فریمهای بدون تغییر، از اجرایcountYogaNodes()صرفنظر میکند.- textjs.org: مسیرها و زبانههای همراه کنسول به قطعههای JS و CSS جداگانه برای هر مسیر تقسیم میشوند. عکسهای فروشگاه از نسخههای اصلی
photos/finalدوباره کدگذاری میشوند و عکسهای ثانویهٔ محصول هنگام قرار گرفتن نشانگر روی آنها یا تغییر اسلاید بارگذاری میشوند.
رفع اشکالها
- کامپوننت
<ViewportControl>بهجای20chازminWidthپیکسلی استفاده میکند و قلمهای جایگزین با معیارهای همسان را در کنار<FocusPad>فهرست میکند تا انتخابگر اندازه هنگام بارگذاریGeist Monoعرض خود را حفظ کند.
افزودهها
@textjs/opencode: پل textjs.org/opencode بهصورت بستهای مستقل و بدون وابستگی. برای شروع آن بدون نصب Vite، React و SDK مربوط به MCP، دستورbunx @textjs/opencode proxy(یاnpx) را اجرا کنید. دستورtext proxyهمچنان کار میکند و همان پل را اجرا میکند.
تغییرات
- بستهٔ فریمورک و CLI اکنون
@textjs/appاست و از@textjs/nextتغییر نام یافته تا نام آن ادغام رسمی با Next.js را القا نکند. بستهٔ@textjs/nextبه نفع@textjs/appمنسوخ شده و نسخهٔ تازهای دریافت نمیکند. برای جابهجایی، دستورbun remove @textjs/next && bun add @textjs/appرا اجرا کنید و در importها، از جمله زیرمسیرهایی مانند@textjs/app/link، نام@textjs/nextرا با@textjs/appجایگزین کنید. CLI همچنانtextاست و قالبهای create-text-app به@textjs/appوابستهاند. - نشان
[▼]و بازرس داخل کنسول، لایهٔ توسعه نام دارند و عنوان بازرس▼ Dev Overlay · Turbologاست. Text.js DevTools فقط نام افزونهٔ Chrome است. کامپوننت<TextDevOverlay>و propهای آن تغییر نکردهاند. - کنترلگرهای مسیری که
dynamic = "error"را صادر میکنند باTX031شکست میخورند. Text.js آن را مانند"force-static"در نظر میگرفت، بدون بررسی اینکه کنترلگر درخواست را میخواند یا نه، که معنای این مقدار در Next.js است. از"force-static"استفاده کنید.
رفع اشکالها
- دستور
text startمانندtext devبهHostمسدودشده باTX028پاسخ میدهد. هر سرور نام تنظیمی را که میخواند بیان میکند:vite.server.allowedHostsبرایtext devوserver.allowedHostsبرایtext start. - textjs.org: فصل انتشار در آموزش دیگر از شما نمیخواهد بازنویسی
vercel.jsonاضافه کنید. در Vercel و Cloudflare Pages، دستورtext buildخودش جایگزینindex.htmlرا مینویسد. نمونهٔ بازنویسی اکنون از_redirectsدر Netlify استفاده میکند. eslint-plugin-textjs: قانونroute-handler-exportsخروجیهایdynamicوrevalidateرا درroute.tsمجاز میداند وvalid-route-moduleمقدارهایdynamicرا در آنجا بررسی میکند.
افزودهها
- textjs.org: ویدیوی در حال پخشِ فصل آموزش، وقتی با پیمایش از آن عبور میکنید، به پخشکنندهای کوچک در گوشه منتقل میشود. دکمهٔ «زیرنویس» زیر هر ویدیو، زیرنویس را روشن یا خاموش میکند و انتخاب را به خاطر میسپارد.
<TextDevOverlay>ویژگیهایpill،shortcutوshellرا میپذیرد تا برنامههای بدون App Router بتوانند بازرس را با کلیدها و کنترلهای پوستهٔ خود نصب کنند.<FocusPad>یکbannerمیپذیرد که در ردیف اول پیام (برای مثال، نشان نوشتاری برنامه) و در دستگاههای لمسی بالای اعلان نمایش داده میشود.
تغییرات
- textjs.org: انتخابگر Playground داشبورد، پخش جریانی، مار، OpenCode و قهوه (terminal.shop) را فهرست میکند. هر دمو نشانی خودش را دارد: OpenCode در
/opencodeو terminal.shop در/coffeeاست و نشان نوشتاری آنها در ابتدای پیام قرار دارد. شمارنده و فرم از Playground خارج شدند؛ مستندات همچنان هر دو را بهصورت نمونهٔ زنده اجرا میکند. - کامپوننت
<FocusPad>چیدمان تازهای دارد. هر حالت یک نوار پیشرفت سهبخشی، یک عنوان، یک عنصر بزرگ و یک سطر متن نشان میدهد. پیش از باز شدن کنسول، عنصر بزرگ میانبر DevTools است. هنگام انتظار برای کلیک، یک نشانگر است. پس از فعال شدن، مقدارhintsبرنامه بهصورت کلیدهایی است که با دریافت کلید روشن میشوند و کلیدهای بدون راهنما در زیر بازتاب مییابند. برچسبهای مراحل، نشان جداگانهٔ «زنده» و سطر «کنسول را تماشا کنید.» حذف شدهاند. سطرها هنگام تغییر حالت بهتدریج ظاهر میشوند، هرگز در نخستین رسم، و حرکت باprefers-reduced-motionخاموش است. متن ثانویه در هر دو ظاهر تضاد WCAG AA را دارد و انتخابگر اندازهٔ کنسول هنگام رسیدن با صفحهکلید حلقهٔ فوکوس نشان میدهد. - textjs.org: بخش Playground از چیدمان تازهٔ
<FocusPad>استفاده میکند. دموی فعلی انتخابگر سطحی مانند کلیدها دارد، گوشهها و اندازهٔ متن فیلد فرمان OpenCode با فیلد URL هماهنگ است، یادداشت terminal.shop بهجای سه سطر دو سطر میگیرد، «مشاهدهٔ منبع» روی خط پایهٔ کنترل اندازه قرار دارد و متن کمرنگ پد تضاد AA را دارد.
رفع اشکالها
- دستور
text devمسیرهایproxyرا در هر درخواست از طریق پراکسی ارائه میکند. تابعfetch()هدرAccept: */*را میفرستد، بنابراین سرور توسعه ابتدا با HTML برنامه به آنها پاسخ میداد و قالب opencode در نخستین اجرا با پیام «توکن غیرمنتظرهٔ '<'» شکست میخورد. - دستور
text devدیگر هنگام خواندن فایل مختص سرور در اسکن وابستگی Vite، نسخهٔ دوم React را بارگذاری نمیکند. اسکن، بررسی import مختص سرور را فعال میکرد که رد پشته و سپس «فراخوانی نامعتبر هوک» را در کنسول چاپ میکرد و Fast Refresh را خراب میکرد. - دستور
text devنشانی صفحههای دارای رشتهٔ پرسوجو، مانند/?demo، را مدیریت میکند. Vite آنها را پوشهٔ پروژه در نظر میگرفت و کل دیسک را زیر نظر میگرفت، بنابراین در Linux صفحه هرگز بارگذاری نمیشد. - create-text-app: نشان توسعه دیگر نخستین راهنمای کلید را در صفحهٔ نخست هیچ قالبی نمیپوشاند، نام پیشفرض پروژه برای تطبیق با مستندات
my-appاست، قالبها از پیکربندی پیشنهادیeslint-plugin-textjsعبور میکنند و README داشبورد ساخت--adapter staticرا توضیح میدهد. - کامپوننتهای
<FocusPad>و<ViewportControl>حاشیهها را فقط با ویژگیهای تفصیلی تنظیم میکنند. React در محیط توسعه هر بار که راهنمای کلید چشمک میزد هشدار «بهروزرسانی ویژگی سبک هنگام رندر مجدد (border)» را نشان میداد. - متنی که آخرین مورد یک سطر است اکنون هنگام کوتاهتر شدن جای خود را حفظ میکند. پس از
<Spacer>، در جایی میماند که طولانیترین متن آن را قرار داده بود و عناصر همسطحی که برای جا شدن در سطر سرریز کوچک شده بودند، کوچک میماندند. - کامپوننت
<FocusPad>هنگام تغییرactionیاhints، مراحل، زیرعنوان و سطرهای کلید خود را جایگزین میکند تا تعویض دمو در یک پد بهعنوان جابهجایی چیدمان گزارش نشود. - بستهٔ
@textjs/react/testingهنگام import شدن Yoga را بارگذاری میکند تا آزمون بتواند پیش از نخستینrender()، تابعfetchرا با نمونهٔ آزمایشی جایگزین کند.
نخستین نسخهٔ پایدار.
▼ Text.js 1.0.0 (Turbolog).تغییرات
- تغییر ناسازگار: بستهٔ فریمورک و CLI اکنون
@textjs/nextاست (نامtextjsدر npm گرفته شده است). importها را ازtextjsبه@textjs/nextبهروزرسانی کنید. - پل OpenCode دستور
bunx @textjs/app proxyاست و از هر دایرکتوری اجرا میشود. - کنسول بهطور پیشفرض با پنل متصل DevTools هماهنگ میشود (اتصال پایین، چپ یا راست، بزرگنمایی صفحه، چندخطی شدن نوارابزار). DevTools جداشده به
120×36برمیگردد. پدها کنترل اندازه دریافت کردند.
افزودهها
- هوک
useKeymapبا صفحهٔ راهنمای خودکار?، راهنمای کلیدها و پالت فرمانCtrl+K. - کامپوننتهای داده:
List(مجازیشده)،Table،Tree. - نمودارها:
LineChart،BarChart،Sparkline،ProgressBar، بهعلاوهٔGradientوImage. - کنترلها:
Button،Checkbox،Switch،RadioGroup،Slider،Dialog،Confirmو اعلانهای گذرا. - چیدمان:
Center،Stack،Grid،SplitPane،FocusScope. - هوکهایی برای زمانسنج، انیمیشن، اندازهگیری، نقطههای شکست، ذخیرهسازی و کلیپبورد.
- متن راستبهچپ. Text.js الگوریتم دوجهتهٔ Unicode (UAX #9، Unicode 18.0) را پیادهسازی میکند و از همهٔ 770,241 مورد
BidiTest.txtو 91,707 موردBidiCharacterTest.txtعبور میکند. حروف عربی شکلدهی میشوند و<Text dir>یک span را ایزوله میکند. - کدهای خطای پایدار
TX###. خطاهای فریمورک یک کد و پیوندی بهhttps://textjs.org/errors/<code>دارند. - بستهٔ
@textjs/react/testingبرای رندر کامپوننتها به متن در آزمونها. - بستهٔ
@textjs/react/terminalو دستورtext runکه برنامهٔ App Router را در ترمینال واقعی رندر میکند. - دستور
text mcpکه برنامه را از طریق Model Context Protocol ارائه میکند تا عاملهای کدنویسی بتوانند بدون مرورگر در آن جابهجا شوند، کلید فشار دهند و فریمها را بخوانند. - افزونهٔ Text.js DevTools، پنلی کنار کنسول با درخت کامپوننتها، بازرس فریم و خط زمان.
- بستهٔ
eslint-plugin-textjsو افزونهٔ VS Code با پیشنمایشهای زنده. apps/terminal-shop: فروشگاه terminal.shop در کنسول، متصل به API واقعی (بهطور پیشفرض محیط آزمایشی توسعه، محیط عملیاتی با قفل دوگانه).- textjs.org: آموزش، دورهای 10 فصلی که در کنسول اجرا میشود. پیشرندر هنگام ساخت با آبرسانی، قلمهای خودمیزبان با معیارهای همسان، مسیرهای
.htmlبدون اسلش و صفحههای تازهٔ مستندات با پیشنمایش زنده.
کارایی
- قفل فاز محدودسازی DevTools پس از پاکسازی شکسته شد. پس از فریمی که پاکسازی میکند، رندرکننده یک بار 110 ms منتظر میماند تا فریمهای بعدی در مسیر فوری DevTools قرار بگیرند. تأخیر نمایش p50 از 63 ms به 10 ms رسید.
- رسم جزئی نوار آسیب: فقط نوارهای سطری که تغییر به آنها رسیده دوباره رسم میشوند.
- هشهای ذخیرهشدهٔ هر سطر، شناسههای سبک عددصحیح و فریمهای بیکار بدون تخصیص حافظه.
- هیچ زمانسنج بیکاری هنگام مخفی یا بدون فوکوس بودن صفحه.
رفع اشکالها
- دیگر در محل شکست ردیفها spanهای خالی ناخواسته در لایهٔ ترسیم وجود ندارند و پرده نیز دوبرابر نمیشود.
- پرده در خطی جداگانه قرار میگیرد، بنابراین پیوند منبع DevTools یعنی (
VM12:1) هرگز باعث شکستن ردیف 0 نمیشود. - نشانگر چرخان پیشفرض دقیقاً با سلولها منطبق است (Menlo نویسههای بریل ندارد). گونهٔ
brailleاختیاری است. - دستور
text buildروی Node دیگر بیلدهای توسعهٔ React را در بسته نمیگنجاند. - textjs.org: جابهجایی تجمعی چیدمان در هر مسیر 0 است. Playground و OpenCode از چیدمان پد مشترکی استفاده میکنند.
- textjs.org: نوارهای کناری مستندات و آموزش در پایین صفحههای بلند ثابت میمانند.
- textjs.org: زبانههای فایل، بلوکهای کد و جدولهای متن فقط بهصورت افقی پیمایش میشوند، بنابراین Safari در iOS هرگز حرکتهای عمودی انگشت برای پیمایش صفحه را نمیگیرد.
- textjs.org: ویژگی
scrollbar-gutter: stableفقط برای دستگاههای دارای ماوس اعمال میشود. در Safari روی iOS، این ویژگی باعث پرش در اولین پیمایش میشد. - textjs.org: لنگرگذاری پیمایش خاموش است. در Safari روی iOS، بخش اصلی ابتدای صفحه را زیر سربرگ چسبان ثابت میکرد.
- تغییر ناسازگار: بستهٔ فریمورک و CLI اکنون
فریمهای بدون چشمک و رندر سمت سرور.
تغییرات
- فریمها بهجای اجرای
console.clear()+console.log()برای هر فریم، به انتها افزوده میشوند. DevTools پاکسازی را همگام اعمال میکند، اما ترسیم پیامهای جدید را با فاصلهٔ 50 ms محدود میکند؛ بنابراین پاکسازی در 70.6% از ترسیمهای DevTools با نرخ 15 فریمبرثانیه و 81.1% با نرخ 60 فریمبرثانیه، کنسول را خالی میگذاشت. یک span پردهای با عرض صفر در ابتدا، فریمهای قبلی را پنهان میکند. کنسول فقط در اولین فریم، پس ازinvalidate()، هنگام بیکاری پس از انباشته شدن 100 فریم، یا در 300 فریم پاک میشود. - فریمهای خروجی با فاصلهٔ حداقل 66 ms زمانبندی میشوند (حدود 15 فریمبرثانیه). فریمهای سریعتر زمانسنج محدودسازی DevTools را از نو شروع میکنند و حذف میشوند: با نرخ 60 فریمبرثانیه، DevTools از 295 فریم خروجی، 67 فریم را ترسیم کرد.
- Playground و OpenCode پدهای فوکوس تمامصفحه هستند.
کارایی
- CSS مربوط به span فقط از ویژگیهای تفکیکشده استفاده میکند و تعداد ویژگیهایی را که DevTools روی هر خط کپی میکند از حدود 33 به حدود 7 کاهش میدهد. رنگهای هگز و دنبالههای خالی که کلیدشان فقط پسزمینه است.
- تجزیهٔ افزایشی Markdown و ردیفهای حافظهگذاریشدهٔ
Markdown،CodeوDiff. - پردازش تکمرحلهای propهای میزبان، بهروزرسانی پراکندهٔ propها و حذف چیدمان مجدد Yoga وقتی اندازهٔ متن نمیتواند تغییر کند.
- زمان یک فریم جریانی از 0.79 ms به 0.14 ms و یک تیک نشانگر چرخان از 0.90 ms به 0.056 ms رسید. خروجی بیتبهبیت یکسان است.
افزودهها
- رندر سمت سرور. صفحهای که
runtime = "server"را صادر میکند، همراه با کامپوننتهایasync functionروی سرور رندر میشود و تغییرات سلولها را در سطح ردیف، از طریق رویدادهای ارسالی سرور به یک پخشکنندهٔ فریم با حجم حدود 19 kB با فشردهسازی gzip میفرستد. - پیشرندر جزئی. دستور
text buildاولین فریم هر مسیر ایستا را در HTML آن قرار میدهد تا کنسول پیش از بارگیری هر ماژولی ترسیم شود. middleware.ts، پیکربندی بخش مسیر (dynamic،revalidate) وtextjs/cache(unstable_cache،revalidateTag،revalidatePath).text build --adapter static|bun|vercel|cloudflare.bench/devtools: یک ابزار آزمون که فرانتاند واقعی DevTools را هدایت میکند و ترسیمهای خالی، فریمهای حذفشده، تأخیر نمایش و مصرف CPU در DevTools را اندازه میگیرد.
رفع اشکالها
- DevTools دیگر متنهای
path:line،//host:portوdata:را به پیوند تبدیل نمیکند. - پل OpenCode سرویس پسزمینهٔ مدیریتشده را پیدا میکند (درگاه موقت، احراز هویت پایه)، هنگام نوشتن هدر CSRF را میفرستد و خطاها را در یک خط گزارش میکند.
- فریمها بهجای اجرای
تغییرات
- ورودی گسسته (فشردن کلید، چسباندن) بهجای انتظار برای فریم بعدی پویانمایی، بهصورت همگام در همان وظیفه رندر میشود.
- یک رابط متنی سادهشدهٔ OpenCode که با نسخهٔ واقعی مطابقت دارد.
- بازبینی کامل textjs.org برای موبایل و نمایش واکنشگرا.
افزودهها
@textjs/font: تجزیهگر و رندرکنندهٔ فونت FIGlet با 17 فونت همراه، برای<FigletText>و<AsciiFont>. خروجی با 273 مرجع ثبتشده از فایل باینریfigletنسخهٔ 2.2.5 مطابقت دارد.text proxy: یک پل محلی CORS برای ارتباط textjs.org با سرور OpenCode شما.
افزودهها
apps/opencode-console: یک کلاینت متصل OpenCode که درconsole.logرندر میشود و وقتی سروری در حال اجرا نیست، نسخهٔ نمایشی را جایگزین میکند.- یک قالب
opencodeبرایcreate-text-app. - textjs.org: صفحهٔ فرود جدید، همراه زندهٔ کنسول، Playground، صفحهٔ OpenCode و مستندات.
- گردش کار استقرار GitHub Pages با تولید مسیرهای ایستا.
نخستین نقطهٔ عطف.
افزودهها
@textjs/core: ساختارCellBufferروی آرایههای نوعدار تخت، چیدمان Yoga WASM، اندازهگیری متن باIntl.Segmenterو درایور کدگذاری طول دنبالهٔ%c. یک فراخوانیconsole.logبرای هر فریم تغییریافته و بدون فراخوانی هنگام بیکاری.@textjs/react: یک تطبیقدهندهٔ React 19، کامپوننتهای PascalCase (Box،Text،ScrollBox،Input،Textarea،Select،Tabs،Code،Markdown،Diff،Modal،Spinnerو موارد دیگر)، ابزارهایclassNameبه سبک Tailwind در سطح سلول، پوستهها و کامپوننت DOM با نامFocusPad.textjs: قابلیت App Router مبتنی بر سیستم فایل (layout،page،loading،error،not-found، بخشهای پویا، کنترلگرهای مسیر)،text dev،text build،text startو بازرس[▼]درون کنسول.create-text-appبا قالبهایstarterوdashboard.