Executar em um terminal

Execute o mesmo painel em tela cheia em um terminal com text run.

O app deste capítulo está rodando no seu console. Abra o console com ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (ative os recursos de desenvolvedor primeiro), depois experimente.
Assistir ao capítulo3:31

Neste capítulo

  • `text run`
  • Sair com `q`
  • Sua própria CLI
  • O que muda

text run executa o mesmo app em um terminal. Layout, componentes, mapas de teclas e manipuladores de rota são compartilhados, e a saída usa ANSI truecolor em vez de spans CSS com %c.

text run

Adicione um script e execute-o:

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

text run importa todos os arquivos de app/, monta o App Router com um histórico em memória e o desenha em tela cheia. <Link>, useRouter(), notFound() e redirect() funcionam sem alterações, e chamadas fetch("/api/…") de mesma origem executam seus manipuladores de rota no mesmo processo. Ctrl+C encerra o app e restaura seu histórico de rolagem. Requer Bun.

Sair com q

Quem usa terminal espera q. useApp().exit() desmonta o app e restaura o terminal; no navegador, desmonta o app do console.

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

Sua própria CLI

Para um único componente, use renderToTerminal. Ele monta um elemento sem o App Router, e fetch("/api/…") só acessa seus manipuladores de rota com text run, então passe os dados ao 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();

Execute com bun cli.tsx. DeploymentsPage busca suas linhas, por isso precisa de text run.

O que muda

Terminais repintam mais rápido (até 60 fps em vez de ~15) e dimensionam a grade pela janela em vez do console acoplado. Imagens precisam de dados de pixels em vez de uma URL. Todo o resto, incluindo este painel, usa o mesmo código.

Experimentar

Este é Acme Deploys ao final do capítulo, rodando no DevTools. Clique na área de entrada e use as teclas abaixo.

▼ 09 · Executar em um terminal

Abrir o console

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

O app renderiza no DevTools.Primeiro ative “Mostrar recursos para desenvolvedores web” em Ajustes do Safari → Avançado. Depois clique aqui e pressione Enter.

Abrir em um computador

Este app renderiza no console do DevTools, que precisa de um navegador de computador.

Questionário

2 perguntas

Responda a todas as perguntas para concluir o capítulo.

O que muda quando o app roda em um terminal?

 

Como um app encerra a si mesmo?