@bomb.sh/tty

中文文档
0.10.0发布于 2026/10/22MITES Module零依赖构建来源已验证近 30 天下载 3.6万

用于 Clay 的终端渲染后端, 编译为 Web Assembly

中文使用文档
文档目录10 节
  1. 特征
  2. 实例
  3. 建筑
  4. 产出
  5. 投入
  6. 使用量
  7. 渲染
  8. 指针检测
  9. 输入解析
  10. 发展

@bomb.sh/tty (英语)

一个低等、平台独立的终端渲染器和事件解析器 Java脚本. 你用得着 @bomb.sh/tty 直接,或作为您的基础 拥有的框架.

特征

宣告终端 UI ——以你构建的方式构建终端接口 a 网页. @bomb.sh/tty 用途 克莱 下级 引擎盖, 给你类似弹性盒的布局, 指针检测和滚动 集装箱——全部作为箱面绘图字符和ANSI 提供给终端 逃脱序列.

无 I/ 欧 —— 说 @bomb.sh/tty 从不读 Stdin 或写 stdout 。 你喂饱它 字节并获得字节回. 这使得它微不足道地嵌入任何框架, 任何运行时间,任何事件循环。 你如何做 I/O没有意见,只是 纯计算.

到处跑 整个引擎被编译到WebAssembly,所以 @bomb.sh/tty 将运行在 JavaScript 运行的任何地方, 没有本地依赖, 也不给消费者任何建设步骤.

实例

参见此键盘示例和更多 示例文件夹。 。 。 . 此演示使用 @bomb.sh/tty 用于所有布局和输入解析.

键盘事件

输入解码器将原始终端字节解码为结构化事件. 给你 将每个关键事件作为字符串“你好世界”键入.

Keyboard events demo

指针事件

在这里,我们看到针对指针的UI元素应用的悬浮样式 状态。 Clay驱动命中测试;不需要手动坐标数学.

Pointer events demo

建筑

@bomb.sh/tty 没有做任何I/O本身。 在自动侧面,它转换UI 元素进入字节和指针事件的生序,在输入边, 它将一串生字节的流转换成结构化的事件.

产出

每个框,整个UI树被打包成平整字节数组并发送 给WASM的电话。 C方面,克莱运行布局,渲染命令是 走入了细胞缓冲器,缓冲器被分解出与上个帧相对. 只有实际改变的单元格产生输出. 结果是一个ANSI 可以直接写入 stdout 的逃生序列 。 每趟去WASM的旅行 帧, 双缓冲, 只有需要更改的字节键击中输出 流线.

因为WASM模块是纯粹的计算,没有I/O,它运行在任何地方 WebAssembly does: Deno, Node, Bun,浏览器,或任何其他运行时间.

 TypeScript                        WASM (C)
+---------------+                +---------------------------+
|               |  Uint32Array   |                           |
| UI ops...     | =============> | Clay layout               |
|               |                |   -> render commands      |
+---------------+                |   -> cell buffer (back)   |
                                 |   -> diff against (front) |
                                 |   -> escape bytes         |
+---------------+                |                           |
|               | ANSI byte array|                           |
| stdout.write  | <============= |                           |
|               |                |                           |
+---------------+                +---------------------------+

投入

来自 stdin 的 Raw 字节输入到基于 WASM 的解析器中,该解析器会识别 VT/ ANSI 逃脱序列,UTF-8代码点,以及鼠标协议(VT200,SGR,urxvt). 这个 parser 维护自己的内部缓冲, 这样部分序列会到达 读取边界自动重新组合。 一个单独的ESC字节为 释放前可配置的耐用窗口(默认为 25ms) 多字节序列时间即将到来.

 TypeScript                        WASM (C)
+---------------+                +---------------------------+
|               |  raw byte array|                           |
| stdin.read    | =============> | trie match (keys/seqs)    |
|               |                |   -> mouse protocol       |
|               |                |   -> UTF-8 decode         |
+---------------+                |   -> ESC codes            |
                                 |                           |
+---------------+                |                           |
|               |  events[]      |                           |
| KeyEvent      | <============= |                           |
| MouseDownEvent|                |                           |
| MouseUpEvent  |                +---------------------------+
| MouseMoveEvent|
| WheelEvent    |
| ResizeEvent   |
+---------------+

使用量

渲染

为此:

╭───────────────╮
│ Hello, World! │
╰───────────────╯
import { close, createTerm, open, rgba, text } from "@bomb.sh/tty";

let term = await createTerm({ width: 80, height: 24 });

let { output } = term.render([
  open("greeting", {
    layout: { padding: { left: 1, right: 1, top: 1, bottom: 1 } },
    border: {
      color: rgba(0, 255, 0),
      left: 1,
      right: 1,
      top: 1,
      bottom: 1,
    },
    cornerRadius: { tl: 1, tr: 1, bl: 1, br: 1 },
  }),
  text("Hello, World!"),
  close(),
]);

process.stdout.write(output);

指针检测

通过指针状态 render() 拥有 @bomb.sh/tty 进行命中检测 除字节序列外的返回指针事件.

import { close, createTerm, fixed, grow, open, rgba, text } from "@bomb.sh/tty";

let term = await createTerm({ width: 80, height: 24 });

let { output, events } = term.render(
  [
    open("root", {
      layout: { width: grow(), height: grow(), direction: "ltr" },
    }),
    open("sidebar", {
      layout: { width: fixed(20), height: grow() },
      bg: rgba(30, 30, 40),
    }),
    text("Sidebar"),
    close(),
    open("main", {
      layout: { width: grow(), height: grow() },
    }),
    text("Main content"),
    close(),
    close(),
  ],
  {
    pointer: { x: mouseX, y: mouseY, down: mouseDown },
  },
);

for (let event of events) {
  // { type: "pointerenter", id: "sidebar" }
  // { type: "pointerleave", id: "sidebar" }
  // { type: "pointerclick", id: "main" }
  console.log(event);
}

process.stdout.write(output);

输入解析

import { createInput } from "@bomb.sh/tty";

let input = await createInput({ escLatency: 25 });

process.stdin.setRawMode(true);
let timer: ReturnType<typeof setTimeout> | undefined;

process.stdin.on("data", (buf) => {
  clearTimeout(timer);

  let { events, pending } = input.scan(new Uint8Array(buf));

  for (let event of events) {
    dispatch(event);
  }

  // if a lone ESC is pending, wait and re-scan to flush it
  if (pending) {
    timer = setTimeout(() => {
      let flush = input.scan();
      for (let event of flush.events) {
        dispatch(event);
      }
    }, pending.delay);
  }
});

发展

用于本地源构建、工具链设置和 clay 子模块指令,参见 贝鲁特,md。 。 。 .

快速本地验证 :

make
deno task test

版本与发布记录

@bomb.sh/tty 共发布 5 个版本,首次发布于 2026/06/19;过去 12 个月发布了 5 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.10.0latest2026/10/2217 天前
0.9.02026/09/052 个月前
0.8.02026/06/264 个月前
0.7.02026/06/194 个月前
0.0.0-register.02026/06/194 个月前

关于 @bomb.sh/tty 的常见问题

@bomb.sh/tty 是什么?

用于 Clay 的终端渲染后端, 编译为 Web Assembly

如何安装 @bomb.sh/tty?

在项目目录运行 npm install @bomb.sh/tty,或使用 pnpm add / yarn add / bun add。

@bomb.sh/tty 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/bomb.sh__tty 是否存在。

@bomb.sh/tty 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@bomb.sh/tty 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@bomb.sh/tty 可以商用吗?

@bomb.sh/tty 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bomb.sh/tty 的下载量有多少?

根据 npm 官方下载统计,@bomb.sh/tty 在 2026/10/09 – 2026/11/07 这 30 天内被下载 36,264 次,日均约 1,209 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bomb.sh/tty 还在维护吗?

最新版本 0.10.0 发布于 2026/10/22(17 天前);至今共发布 5 个版本,其中过去 12 个月发布了 5 个;首次发布于 2026/06/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。