我用 Bun 和 TypeScript 构建了一个 JSON 命令行工具——以下是实际发生的情况

发布日期:2026-05-11 10:35:27   浏览量 :5
发布日期:2026-05-11 10:35:27  
5

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

我想要一个能够从终端直接扁平化 JSON、过滤数据、为输出着色以及从 URL 获取数据的工具——所有功能集于一身。它应该介于 jqgron 之间,但拥有更简洁、更直观的应用程序接口(API)。于是我构建了 jray。这是关于其开发过程的真实复盘。

GitHub:github.com/siyadhkc/jray
网站:siyadhkc.github.io/Jray

构建初衷

每次我调试应用程序接口(API)响应或查看某些嵌套配置文件时,我都会使用 jq
而每次,我都要花前五分钟重新搜索语法。jq 确实功能强大——真的——但它是一门独立的语言,除非你每天都在编写复杂的转换逻辑,否则这种学习成本会不断累积。

gron 是我经常使用的另一个工具。它将 JSON 扁平化为可grep的点号表示法,这正是你在查找深层嵌套键的位置时所需要的。但是 gron 是只读的。你无法过滤并返回结构化输出。你无法从 URL 获取数据。它也没有着色功能。

因此,我明确了我的实际需求:

  • 将 JSON 扁平化为点号路径(a.b.c = value),以便一目了然地查看结构
  • 通过键模式进行过滤,而无需学习查询语言
  • 直接从 URL 获取数据,这样我就不必每次都使用 curl | jray
  • 在终端(TTY)中默认启用彩色输出
  • 速度足够快,在我处理任务时不会感到有额外的负担

Bun 是显而易见的运行时选择。启动速度快,原生支持 TypeScript,内置测试运行器,以及 bun build --compile 命令,可以将所有内容打包成一个独立的二进制文件。没有 Node.js 版本兼容性的头疼问题,也不需要单独安装运行时环境。

架构设计

我有意保持了架构的扁平化。没有框架,依赖极少。核心逻辑被划分为专注的模块:

  • flatten.ts — 递归扁平化和反扁平化。接收嵌套对象并生成从点号路径到原始值的映射。反扁平化则执行相反的操作。
  • filter.ts — 对扁平化后的键进行通配符风格模式匹配。user.* 提供 user 下的所有内容,**.id 匹配任何深度的任何 id
  • color.ts — ANSI 彩色输出。键使用一种颜色,值根据类型感知着色(字符串、数字、布尔值各有自己的颜色)。
  • fetch.tsBun.fetch 的轻量封装,处理请求、检查内容类型,并将响应流入扁平化管道。
  • cli.ts — 参数解析和连接。根据你传递的标志,从标准输入、文件路径或 URL 读取数据。

整个项目编译为单个二进制文件:

bun build ./src/cli.ts --compile --outfile jray

此后不再依赖 Bun 运行时。你分发该二进制文件,它即可工作。

实际遇到的问题

npm 名称冲突

在写出初始可用版本后,我做的第一件事就是尝试以 jray 的名称发布。但该名称已被占用——并非恶意抢注。这是一个已发布的、拥有真实用户的包。所以我不得不切换到作用域包:@siyadkc/jray

这听起来像是一个小改动,但它引发了连锁反应。README 文档,

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部