Uruchamianie w terminalu

Uruchom ten sam panel na pełnym ekranie w terminalu poleceniem text run.

Aplikacja z tego rozdziału działa w twojej konsoli. Otwórz ją skrótem ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (najpierw włącz funkcje programistyczne), a potem wypróbuj ją.
Obejrzyj rozdział3:31

W tym rozdziale

  • `text run`
  • Kończenie działania klawiszem `q`
  • Własne CLI
  • Różnice

text run uruchamia tę samą aplikację w terminalu. Layout, komponenty, mapy klawiszy i handlery tras są wspólne, a wynik to ANSI z pełną paletą kolorów zamiast spanów CSS %c.

text run

Dodaj skrypt i uruchom go:

package.json+2-1json
  "scripts": {    "dev": "text dev",    "build": "text build",Usunięto:     "start": "text start"Dodano:     "start": "text start",Dodano:     "tui": "text run"  },
bun run tui                        # render ./app at /bun run tui -- --path /deployments # start on another route

text run importuje każdy plik z app/, montuje App Router z historią w pamięci i rysuje go na pełnym ekranie. <Link>, useRouter(), notFound() i redirect() działają bez zmian, a wywołania fetch("/api/…") do tego samego źródła uruchamiają twoje handlery tras w tym samym procesie. Ctrl+C kończy działanie i przywraca historię przewijania. Wymaga środowiska Bun.

Kończenie działania klawiszem q

Użytkownicy terminala oczekują klawisza q. useApp().exit() odmontowuje aplikację i przywraca terminal; w przeglądarce odmontowuje aplikację konsolową.

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

Własne CLI

Dla pojedynczego komponentu użyj renderToTerminal. Montuje jeden element bez App Router, a fetch("/api/…") dociera do twoich handlerów tras tylko przy uruchomieniu przez text run, więc przekaż komponentowi jego dane:

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

Uruchom go poleceniem bun cli.tsx. DeploymentsPage pobiera swoje wiersze, więc wymaga text run.

Różnice

Terminale odmalowują ekran szybciej (do 60 klatek/s zamiast ~15) i dopasowują siatkę do okna zamiast do zadokowanej konsoli. Obrazy wymagają danych pikseli zamiast adresu URL. Cała reszta, w tym ten panel, korzysta z tego samego kodu.

Wypróbuj

To Acme Deploys na końcu rozdziału, uruchomiona w DevTools. Kliknij panel, a potem użyj poniższych klawiszy.

▼ 09 · Uruchamianie w terminalu

Otwórz konsolę

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

Aplikacja renderuje się w DevTools.Najpierw włącz „Pokazuj funkcje dla deweloperów witryn” w Safari: Ustawienia → Zaawansowane. Potem kliknij tutaj i naciśnij Enter.

Otwórz na komputerze

Ta aplikacja renderuje się w konsoli DevTools, która wymaga przeglądarki na komputerze.

Quiz

2 pytania

Odpowiedz na wszystkie pytania, aby ukończyć rozdział.

Co się zmienia, gdy aplikacja działa w terminalu?

 

Jak aplikacja kończy swoje działanie?