2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家
我想要一个能够从终端直接扁平化 JSON、过滤数据、为输出着色以及从 URL 获取数据的工具——所有功能集于一身。它应该介于 jq 和 gron 之间,但拥有更简洁、更直观的应用程序接口(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.ts—Bun.fetch的轻量封装,处理请求、检查内容类型,并将响应流入扁平化管道。 -
cli.ts— 参数解析和连接。根据你传递的标志,从标准输入、文件路径或 URL 读取数据。
整个项目编译为单个二进制文件:
bun build ./src/cli.ts --compile --outfile jray
此后不再依赖 Bun 运行时。你分发该二进制文件,它即可工作。
实际遇到的问题
npm 名称冲突
在写出初始可用版本后,我做的第一件事就是尝试以 jray 的名称发布。但该名称已被占用——并非恶意抢注。这是一个已发布的、拥有真实用户的包。所以我不得不切换到作用域包:@siyadkc/jray。
这听起来像是一个小改动,但它引发了连锁反应。README 文档,
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。