Esecuzione in un terminale

Esegui la stessa dashboard a schermo intero in un terminale con text run.

L’app di questo capitolo è in esecuzione nella tua console. Aprila con ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (prima attiva le funzionalità per sviluppatori), poi provala.
Guarda il capitolo3:31

In questo capitolo

  • `text run`
  • Uscire con `q`
  • La tua CLI
  • Le differenze

text run esegue la stessa app in un terminale. Layout, componenti, mappe dei tasti e route handler sono condivisi, e l’output è ANSI truecolor anziché span CSS %c.

text run

Aggiungi uno script ed eseguilo:

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

text run importa ogni file in app/, monta l’App Router con una cronologia in memoria e lo disegna a schermo intero. <Link>, useRouter(), notFound() e redirect() funzionano senza modifiche, e le chiamate fetch("/api/…") alla stessa origine eseguono i tuoi route handler nello stesso processo. Ctrl+C chiude l’app e ripristina la cronologia del terminale. Richiede Bun.

Uscire con q

Chi usa il terminale si aspetta q. useApp().exit() smonta l’app e ripristina il terminale; nel browser smonta l’app della console.

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

La tua CLI

Per un singolo componente, usa renderToTerminal. Monta un elemento senza l’App Router, e fetch("/api/…") raggiunge i tuoi route handler solo con text run, quindi passa al componente i suoi dati:

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

Eseguilo con bun cli.tsx. DeploymentsPage recupera le proprie righe, quindi richiede text run.

Le differenze

I terminali ridisegnano più velocemente (fino a 60 fps anziché ~15) e adattano la griglia alla finestra anziché alla console ancorata. Le immagini richiedono dati dei pixel anziché un URL. Tutto il resto, inclusa questa dashboard, usa lo stesso codice.

Provala

Questa è Acme Deploys alla fine del capitolo, in esecuzione in DevTools. Fai clic sul pannello del focus, poi usa i tasti qui sotto.

▼ 09 · Esecuzione in un terminale

Apri la console

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

L’app viene renderizzata in DevTools.Prima attiva «Mostra funzionalità per sviluppatori web» in Safari Impostazioni → Avanzate. Poi fai clic qui e premi Enter.

Aprire su desktop

Questa app viene renderizzata nella console DevTools, che richiede un browser desktop.

Quiz

2 domande

Rispondi a tutte le domande per completare il capitolo.

Cosa cambia quando l’app gira in un terminale?

 

Come fa un’app a chiudersi da sola?