Framework console

Xây dựng ứng dụng React full-stack render trong console.log.

Bắt đầu

Trang này đang chạy trong console của bạn. Mở bằng ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C (bật tính năng dành cho nhà phát triển trước), nhấp vào bản xem trước bên dưới và nhấn ↑ ↓.

1import { useState } from "react";2import { AsciiFont, Box, Text, useInput } from "@textjs/app";34export default function Page() {5  const [count, setCount] = useState(0);6  useInput((e) => {7    if (e.key === "up") setCount((c) => c + 1);8    if (e.key === "down") setCount((c) => c - 1);9  });1011  return (12    <Box className="flex-col gap-1 p-2">13      <AsciiFont text="▼ TEXT.JS" />14      <Text color="muted">React 19 in console.log</Text>15      <Text bold color="accent">count = {count}</Text>16    </Box>17  );18}
viewport:3

React 19

Text.js hỗ trợ render đồng thời, Suspense và ranh giới lỗi.

App Router

Thư mục trong app/ trở thành route và layout, còn Quay lại, Tiến tới và liên kết sâu đều hoạt động.

Lưới thích ứng

Lưới vừa với bảng DevTools gắn vào cửa sổ ở mọi mức thu phóng trang.

Nhập bằng bàn phím

Phím, thao tác dán và soạn thảo IME đến ứng dụng qua một <textarea> ẩn.

Bảng, biểu đồ, biểu mẫu và phím tắt

Trực tiếp
preview://table:1
↑ ↓ di chuyển · s sắp xếp · Space chọn
Tài liệu
Layout
  • <Box>
  • <Stack>
  • <Grid>
  • <SplitPane>
  • <ScrollBox>
  • <Center>
Dữ liệu
  • <List>
  • <Table>
  • <Tree>
  • <Markdown>
  • <Code>
  • <Diff>
Biểu đồ
  • <LineChart>
  • <BarChart>
  • <Sparkline>
  • <ProgressBar>
  • <Gradient>
  • <Image>
Điều khiển
  • <Input>
  • <Select>
  • <Checkbox>
  • <Switch>
  • <Slider>
  • <Dialog>
Bàn phím
  • useKeymap
  • <KeyHelp>
  • <KeyHints>
  • <CommandPalette>
  • <StatusBar>
  • useFocus

Mỗi frame đã đổi là một lần gọi console.log

Commit không thay đổi ô nào sẽ không bao giờ đến console.

  1. React 19

    01Commit

    React commit qua một reconciler tùy chỉnh.

  2. Yoga

    02Layout

    Yoga sắp xếp các hộp trên ô nguyên.

  3. CellBuffer

    03Vẽ

    Chỉ vẽ lại các dòng bị ảnh hưởng.

  4. Mã băm dòng

    04Cổng kiểm tra thay đổi

    Frame không đổi dừng ở đây.

  5. RLE

    05Mã hóa

    3.200 ô thành 149 span %c.

  6. console.log

    06Xuất

    Các frame nối thêm cách nhau ít nhất 66 ms.

Frame đã đổi Frame không đổi, 0 lần gọi

Frame nối thêm

Xóa console trước mỗi frame khiến console trống cho đến khi DevTools vẽ frame tiếp theo. Thay vào đó, Turbolog nối thêm từng frame.

Đọc bài viết
clear() + log()70.6% trống
log(), appended1.0% trống
0.163msVẽ lại toàn bộ (layout, vẽ, mã hóa)
0.011msSửa một dòng, như khi gõ phím
0 lần gọiFrame nhàn rỗi
149 spanĐối số %c cho 3.200 ô
Bảng tổng quan 100×32, trung bình 1.000 frame · Apple M5 Pro · Bun 1.4.4Tài liệu bộ máy Turbolog

Render route trên máy chủ

Xuất runtime = "server" để render route và các component bất đồng bộ của nó trên máy chủ. Trình duyệt tải trình phát frame 21 kB (gzip) thay cho ứng dụng của bạn.

1import { Suspense } from "react";2import { Box, Text } from "@textjs/app";3import { db } from "@/lib/db";45export const runtime = "server";67async function Deploys() {8  const rows = await db.deploys.latest(5);9  return rows.map((d) => (10    <Text key={d.id}>{`${d.state}  ${d.branch}`}</Text>11  ));12}1314export default function Page() {15  return (16    <Box className="flex-col p-1">17      <Text bold>Deployments</Text>18      <Suspense fallback={<Text color="muted">Loading…</Text>}>19        <Deploys />20      </Suspense>21    </Box>22  );23}

Viết mã với OpenCode trong DevTools

OpenCode Lite là TUI OpenCode được xây dựng lại bằng Text.js để chạy trong console trình duyệt.

Môi trường thử nghiệm

Agent theo kịch bản trả lời mọi prompt, không cần cài đặt gì.

Một lệnh

Chạy bunx @textjs/opencode@latest proxy và nhập mã lệnh in ra. Trang kết nối với OpenCode trên máy bạn.

Mô hình và phiên của bạn

Chọn bất kỳ mô hình nào đã cấu hình trên máy chủ bằng /models. Phiên, agent và mô hình đến từ máy chủ OpenCode của bạn.