Im Terminal ausführen

Führe dasselbe Dashboard mit text run im Vollbild im Terminal aus.

Die App dieses Kapitels läuft in deiner Konsole. Öffne sie mit ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (zuerst Entwicklerfunktionen aktivieren), dann probiere sie aus.
Kapitel ansehen3:31

In diesem Kapitel

  • `text run`
  • Mit `q` beenden
  • Deine eigene CLI
  • Die Unterschiede

text run führt dieselbe App in einem Terminal aus. Layout, Komponenten, Keymaps und Route-Handler werden gemeinsam genutzt, und die Ausgabe erfolgt als Truecolor-ANSI statt als %c-CSS-Spans.

text run

Füge ein Skript hinzu und führe es aus:

package.json+2-1json
  "scripts": {    "dev": "text dev",    "build": "text build",Entfernt:     "start": "text start"Hinzugefügt:     "start": "text start",Hinzugefügt:     "tui": "text run"  },
bun run tui                        # render ./app at /bun run tui -- --path /deployments # start on another route

text run importiert jede Datei in app/, mountet den App Router mit einer History im Arbeitsspeicher und zeichnet ihn im Vollbild. <Link>, useRouter(), notFound() und redirect() funktionieren unverändert, und fetch("/api/…")-Aufrufe mit derselben Origin führen deine Route-Handler im selben Prozess aus. Ctrl+C beendet die App und stellt deinen Scrollback wieder her. Dafür ist Bun erforderlich.

Mit q beenden

Terminal-Nutzer erwarten q. useApp().exit() unmountet die App und stellt das Terminal wieder her; im Browser unmountet es die Konsolen-App.

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

Deine eigene CLI

Verwende für eine einzelne Komponente renderToTerminal. Es mountet ein Element ohne den App Router, und fetch("/api/…") erreicht deine Route-Handler nur unter text run, also übergib der Komponente ihre Daten:

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();

Führe es mit bun cli.tsx aus. DeploymentsPage ruft seine Zeilen ab und benötigt deshalb text run.

Die Unterschiede

Terminals zeichnen schneller neu (bis zu 60 fps statt ~15) und passen das Raster an das Fenster statt an die angedockte Konsole an. Bilder benötigen Pixeldaten statt einer URL. Alles andere, einschließlich dieses Dashboards, verwendet denselben Code.

Ausprobieren

Das ist Acme Deploys am Ende des Kapitels, ausgeführt in DevTools. Klicke auf das Pad und nutze dann die Tasten unten.

▼ 09 · Im Terminal ausführen

Die Konsole öffnen

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

Die App rendert in DevTools.Aktiviere zuerst „Funktionen für Webentwickler anzeigen“ unter Safari Einstellungen → Erweitert. Klicke dann hier und drücke Enter.

Auf einem Desktop öffnen

Diese App rendert in der DevTools-Konsole, die einen Desktop-Browser benötigt.

Quiz

2 Fragen

Beantworte jede Frage, um das Kapitel abzuschließen.

Was ändert sich, wenn die App im Terminal läuft?

 

Wie beendet sich eine App selbst?