控制台框架
构建在 console.log 中渲染的全栈 React 应用。
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}React 19
Text.js 支持并发渲染、Suspense 和错误边界。
App Router
app/ 中的文件夹成为路由和布局,支持后退、前进和深层链接。
响应式网格
网格在任意页面缩放比例下都能适应停靠的 DevTools 面板。
键盘输入
按键、粘贴和输入法组合输入通过一个隐藏的 <textarea> 传入应用。
表格、图表、表单和快捷键
每个有变化的帧对应一次 console.log 调用
未改变任何单元格的提交不会到达控制台。
- React 19
01提交
React 通过自定义协调器提交更新。
- Yoga
02布局
Yoga 按完整单元格布局盒子。
- CellBuffer
03绘制
仅重绘受损行。
- 行哈希
04脏帧检查
未变化的帧到此为止。
- RLE
05编码
3,200 个单元格转为 149 个
%cspan。 - console.log
06输出
追加帧的间隔至少为 66 ms。
有变化的帧 未变化的帧,0 次调用
clear() + log()70.6% 空白log(), appended1.0% 空白0.163ms全量重绘(布局、绘制、编码)
0.011ms单行编辑,如按键输入
0 次调用空闲帧
149 个 span3200 个单元格所需的
%c 参数100×32 仪表盘,1000 帧均值 · Apple M5 Pro · Bun 1.4.4Turbolog 引擎文档
在服务器上渲染路由
导出 runtime = "server",在服务器上渲染路由及其异步组件。浏览器加载 21 kB(gzip)的帧播放器,而非你的应用。
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}也可在终端和智能体中运行
VM12:1
▼ Acme Deploys main
● Ready web iad1 2m
● Ready api sfo1 4m
◌ Build docs fra1 42%
DevToolstext dev
Turbolog 通过一次 console.log 将每帧写为 %c span。
$ text run
▼ Acme Deploys main
● Ready web iad1 2m
● Ready api sfo1 4m
◌ Build docs fra1 42%
终端text run
text run 以真彩色 ANSI 渲染同一个 App Router 应用,并在进程内运行路由处理程序。
→ read_frame { "path": "/" }
▼ Acme Deploys main
● Ready web iad1 2m
● Ready api sfo1 4m
◌ Build docs fra1 42%
编程智能体text mcp
智能体通过 MCP 切换路由、按键,并以纯文本读取每一帧。
编辑器、代码检查和测试工具
DevTools 扩展
添加包含组件树、帧检查器和逐帧时间线的面板。
Text.js 面板VS Code
在代码旁预览帧,并生成 App Router 文件骨架。
⌘K VESLint
检测控制台组件中的 DOM 标签、文本中的盒子及 Menlo 缺少的字形。
eslint-plugin-textjs测试
在任意测试运行器中离屏渲染、模拟按键,并对 lastFrame() 进行断言。
错误代码
带 TX 代码的错误和警告链接到说明修复方法的页面。
控制台 REPL
通过控制台提示符暂停运行中的应用、调整大小、查看线框及复制应用。
window.text从右到左
实现 Unicode 双向算法,通过全部 770,241 个 BidiTest.txt 测试用例。
FIGlet 字体
解析 .flf 文件,输出与从 figlet 二进制文件记录的 273 个输出一致。