التشغيل في الطرفية

شغّل لوحة المعلومات نفسها بملء الشاشة في الطرفية باستخدام ⁦text run⁩.

يعمل تطبيق هذا الفصل في وحدة التحكم. افتحها باستخدام ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (فعّل ميزات المطوّرين أولًا)، ثم جرّبه.
مشاهدة الفصل3:31

في هذا الفصل

  • `text run`
  • الخروج باستخدام `q`
  • واجهة سطر أوامر خاصة بك
  • الاختلافات

يشغّل الأمر text run التطبيق نفسه في الطرفية. يشترك التطبيق في التخطيط والمكوّنات وخرائط المفاتيح ومعالجات المسارات، ويكون الخرج بتنسيق ANSI بالألوان الحقيقية بدلًا من عناصر span بتنسيق CSS مع %c.

text run

أضف برنامجًا نصيًا وشغّله:

package.json+2-1json
  "scripts": {    "dev": "text dev",    "build": "text build",المحذوف:     "start": "text start"المضاف:     "start": "text start",المضاف:     "tui": "text run"  },
bun run tui                        # render ./app at /bun run tui -- --path /deployments # start on another route

يستورد الأمر text run كل ملف في app/، ويركّب ⁦App Router⁩ مع سجلّ في الذاكرة ويعرضه بملء الشاشة. تعمل <Link> و useRouter() و notFound() و redirect() دون تغيير، وتشغّل استدعاءات fetch("/api/…") من المصدر نفسه معالجات المسارات داخل العملية نفسها. ينهي الاختصار Ctrl+C التطبيق ويستعيد سجلّ التمرير. يتطلب ذلك Bun.

الخروج باستخدام q

يتوقع مستخدمو الطرفية استخدام q. يفكّ الاستدعاء useApp().exit() تركيب التطبيق ويستعيد الطرفية؛ وفي المتصفح يفكّ تركيب تطبيق وحدة التحكم.

app/layout.tsx+3tsx
المضاف: import { useApp } from "@textjs/app";export default function RootLayout({ children }: { children?: ReactNode }) {المضاف:   const app = useApp();  useInput((e) => {    if (e.key === "backspace") router.back();المضاف:     if (e.input === "q") app.exit();  });

واجهة سطر أوامر خاصة بك

لعرض مكوّن واحد، استخدم renderToTerminal. يركّب عنصرًا واحدًا دون ⁦App Router⁩، ولا يصل الاستدعاء fetch("/api/…") إلى معالجات المسارات إلا عند التشغيل باستخدام text run، لذا مرّر البيانات إلى المكوّن:

cli.tsxtsx
import { renderToTerminal } from "@textjs/app/terminal";import { Table } from "@textjs/app";import { DEPLOYMENTS } from "./lib/deployments";const columns = [{ key: "commit", header: "Commit" }, { key: "project", header: "Project", width: 10 }];const app = await renderToTerminal(<Table columns={columns} rows={DEPLOYMENTS} autoFocus />);await app.waitUntilExit();

شغّله باستخدام bun cli.tsx. يجلب المكوّن DeploymentsPage صفوفه، لذا يتطلب text run.

الاختلافات

تعيد الطرفيات الرسم بسرعة أكبر (تصل إلى 60 إطارًا في الثانية بدلًا من نحو 15)، وتضبط حجم الشبكة وفقًا للنافذة بدلًا من وحدة التحكم المثبّتة. تتطلب الصور بيانات البكسل بدلًا من عنوان URL. يستخدم كل ما عدا ذلك، بما فيه لوحة المعلومات هذه، الشيفرة نفسها.

جرّبه

هذا تطبيق Acme Deploys في نهاية الفصل، يعمل في DevTools. انقر اللوحة، ثم استخدم المفاتيح أدناه.

▼ 09 · التشغيل في الطرفية

فتح وحدة التحكم

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

يُعرض التطبيق في DevTools.فعّل أولًا «إظهار الميزات لمطوري الويب» في إعدادات Safari → متقدم. ثم انقر هنا واضغط Enter.

الفتح على حاسوب مكتبي

يُعرض هذا التطبيق في وحدة تحكم DevTools، التي تتطلب متصفحًا على حاسوب مكتبي.

اختبار

2 سؤالان

أجب عن كل سؤال لإكمال الفصل.

ما الذي يتغير عند تشغيل التطبيق في الطرفية؟

 

كيف ينهي التطبيق تشغيله بنفسه؟