Запуск в терминале

Запустите ту же панель на весь экран в терминале командой text run.

Приложение этой главы работает в вашей консоли. Откройте её сочетанием ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (сначала включите функции разработчика), затем попробуйте приложение.
Смотреть главу3:31

В этой главе

  • `text run`
  • Выход по `q`
  • Собственный CLI
  • Отличия

text run запускает то же приложение в терминале. Макет, компоненты, раскладки клавиш и обработчики маршрутов общие, а для вывода используется truecolor ANSI вместо CSS-span с %c.

text run

Добавьте скрипт и запустите его:

package.json+2-1json
  "scripts": {    "dev": "text dev",    "build": "text build",Удалено:     "start": "text start"Добавлено:     "start": "text start",Добавлено:     "tui": "text run"  },
bun run tui                        # render ./app at /bun run tui -- --path /deployments # start on another route

text run импортирует каждый файл из app/, монтирует App Router с историей в памяти и отрисовывает его на весь экран. <Link>, useRouter(), notFound() и redirect() работают без изменений, а вызовы fetch("/api/…") к тому же источнику выполняют ваши обработчики маршрутов в том же процессе. Ctrl+C завершает работу и восстанавливает историю прокрутки. Для этого нужен Bun.

Выход по q

Пользователи терминала ожидают выхода по q. useApp().exit() размонтирует приложение и восстанавливает терминал; в браузере этот вызов размонтирует консольное приложение.

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

Собственный CLI

Для отдельного компонента используйте renderToTerminal. Он монтирует один элемент без App Router, а fetch("/api/…") обращается к вашим обработчикам маршрутов только при запуске через text run, поэтому передайте компоненту данные:

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

Запустите его командой bun cli.tsx. DeploymentsPage загружает свои строки, поэтому ему нужен text run.

Отличия

Терминалы перерисовываются быстрее (до 60 кадров/с вместо ~15) и подгоняют сетку под размер окна, а не закреплённой консоли. Для изображений нужны пиксельные данные вместо URL. Всё остальное, включая эту панель, использует тот же код.

Попробовать

Это Acme Deploys в конце главы, работающее в DevTools. Нажмите на панель, затем используйте клавиши ниже.

▼ 09 · Запуск в терминале

Открыть консоль

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

Приложение рендерится в DevTools.Сначала включите «Показывать функции для веб-разработчиков» в Safari: «Настройки» → «Дополнения». Затем щёлкните здесь и нажмите Enter.

Открыть на компьютере

Это приложение рендерится в консоли DevTools, для которой нужен браузер на компьютере.

Тест

2 вопроса

Ответьте на все вопросы, чтобы завершить главу.

Что меняется при запуске приложения в терминале?

 

Как приложение завершает свою работу?