Ejecutar en una terminal

Ejecuta el mismo panel a pantalla completa en una terminal con text run.

La app de este capítulo se está ejecutando en tu consola. Ábrela con ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (primero activa las funciones para desarrolladores) y luego pruébala.
Ver el capítulo3:31

En este capítulo

  • `text run`
  • Salir con `q`
  • Tu propia CLI
  • Diferencias

text run ejecuta la misma app en una terminal. El layout, los componentes, los mapas de teclas y los manejadores de ruta se comparten, y la salida es ANSI de color verdadero en lugar de spans CSS %c.

text run

Añade un script y ejecútalo:

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

text run importa todos los archivos de app/, monta el App Router con un historial en memoria y lo dibuja a pantalla completa. <Link>, useRouter(), notFound() y redirect() funcionan sin cambios, y las llamadas a fetch("/api/…") del mismo origen ejecutan tus manejadores de ruta en el mismo proceso. Ctrl+C cierra la app y restaura tu historial de desplazamiento. Requiere Bun.

Salir con q

Quienes usan la terminal esperan poder salir con q. useApp().exit() desmonta la app y restaura la terminal; en el navegador desmonta la app de consola.

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

Tu propia CLI

Para un solo componente, usa renderToTerminal. Monta un elemento sin el App Router, y fetch("/api/…") solo llega a tus manejadores de ruta bajo text run, así que pasa los datos al componente:

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

Ejecútalo con bun cli.tsx. DeploymentsPage obtiene sus filas, por lo que necesita text run.

Diferencias

Las terminales repintan más rápido (hasta 60 fps en lugar de ~15) y ajustan la cuadrícula a la ventana en lugar de a la consola acoplada. Las imágenes necesitan datos de píxeles en lugar de una URL. Todo lo demás, incluido este panel, usa el mismo código.

Probar

Esta es Acme Deploys al final del capítulo, ejecutándose en DevTools. Haz clic en el panel y usa las teclas de abajo.

▼ 09 · Ejecutar en una terminal

Abrir la consola

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

La app se renderiza en DevTools.Primero activa «Mostrar funciones para desarrolladores web» en Configuración de Safari → Avanzado. Luego haz clic aquí y pulsa Enter.

Abrir en un equipo de escritorio

Esta app se renderiza en la consola de DevTools, que requiere un navegador de escritorio.

Cuestionario

2 preguntas

Responde todas las preguntas para completar el capítulo.

¿Qué cambia cuando la app se ejecuta en una terminal?

 

¿Cómo se cierra una app a sí misma?