关于

一个自用的工具,顺手公开

目标很朴素:调试、压测、出文档这三件事不用开三个工具,而且不要为了这点事装一堆依赖。 下面写清楚它建立在什么之上、质量是怎么保证的,以及哪些事它做不到。

起因

三个工具 + 一份手抄的文档

日常调接口是这样的:一个工具发请求,另一个工具压测,最后还得分头维护一份接口文档—— 而这三件事用的其实是同一份东西:请求定义。

另一个现实问题是环境。这类工具通常自带一堆依赖,换台机器就得先配环境。 所以这个项目给自己定了一条硬规矩:运行时只用 Node 内置模块, 再加上原生前端,不引入任何第三方包,也没有构建步骤。

结论就是现在这样:一个目录,node server.js 就能跑;打包出来是一个文件,双击就能用。

3,266后端行数(server + lib)
4,232前端行数(原生 ESM)
2,077关卡与构建工具行数
合计约 9,600 行 JavaScript,运行时零第三方依赖
技术取舍

选了什么,放弃了什么

Node 内置模块

HTTP 转发、gzip/br 解压、TLS 信息、SSE 推流全部手写,不引框架。换来的代价是细节都得自己处理(比如重定向链、分段耗时)。

原生前端

没有 React / Vue,没有打包器。一个 public/ 目录直接丢给浏览器。换来的代价是复杂交互要自己管状态。

JSON 文件当数据库

写入用「临时文件 + 改名」避免留下半截文件。代价是没有并发写保护,适合单人本地用,不适合多人同时改。

打包成单文件

用 @yao-pkg/pkg 把 Node 运行时和资源一起塞进 exe,再把 PE 头改成窗口程序。代价是体积 55 MB。

质量

176 条断言,四道关卡

这个项目踩过的坑有个共同点:界面看着一切正常,其实判据是假的。 所以关键承诺都写成了能跑、也能被反向验证的断言,而不是靠肉眼看一遍。

关卡跑什么断言
tools/static-check.js 语法、模块导入导出、DOM id、前后端路由对账、跨模块函数是否漏 import、窗口模式与产物 PE 头、构建脚本编码 55
tools/selfcheck.js --logic-only 断言求值、JSON 路径、延迟统计、分段耗时诊断、关窗看门狗——不起服务、不发网络请求 89
tools/dialog-check.js 用最小 DOM 桩驱动真实 ui.js,验弹窗返回值:点确认拿到输入值、点取消拿到 null、空名不关窗 22
tools/gui-exe.js --selfcheck 用假 PE 验 Subsystem 改在正确的 2 个字节上,且"改坏了必须能被抓到" 10

关卡本身也要被验证

每加一条判据,都会做一次变异反验:故意把它对应的代码改坏,确认这条断言真的会变红、 而且报出的原因就是那条。累计 21 处变异,全部被抓到——期间还因此发现关卡自己有 3 个缺陷。

"关掉窗口就退出"是怎么钉住的

这条承诺只能在运行期体现,所以它落在静态判据上:浏览器 profile 不许放进 data/、 心跳路由必须真的喂给看门狗、前端必须真的定时发心跳、退出路径必须收掉浏览器、 "窗口从没起来"的兜底必须在。

被命令行悄悄改反的判据

把"文件是否被占用"的判断塞进批处理的 node -e "..." 里时,代码中的取反运算符被 cmd 当成变量展开吞掉了,判据静默反转——检测从此永远回答"没占用",而关卡还是绿的。

两个词都出现过 ≠ 它们有关系

一条判据原本只查"文件里同时出现心跳路径和定时器",可文件里恰好还有个无关的定时器——把心跳定时器注释掉照样全绿。判据要看调用关系,不能看关键词同框。

"没报到失败"可能是崩了

变异脚本一度把代码改成了语法错误,被测程序直接崩溃、一条失败都没印出来,差点读成"关卡没抓到"。判据改成了退出码非 0 也算抓到。

已知边界

做不到的事情,也写在这里

下面是当前版本真实存在的限制。提前说清楚,比用起来才发现要好。

项目边界
安装位置exe 别放进 C:\Program Files 这类需要管理员权限的目录——数据要建在它旁边。放普通文件夹即可
代码签名没有签名,Windows 首次运行可能弹 SmartScreen「未知发布者」,选「仍要运行」即可
应用窗口需要本机有 Edge 或 Chrome。两个都没有时会退回系统默认浏览器,那种情况下关掉标签页不会退出进程
退出时机关窗后最多约 7 秒退出。偶尔任务管理器里还能看到一个浏览器进程多活一会儿,它只占着系统临时目录里的窗口 profile,碰不到 data/
日志exe 是窗口程序、没有控制台,双击运行的日志在 data/app.log;想在命令行看输出请用重定向或源码版
请求头不支持同名请求头重复发送(HTTP 语义上等价于逗号合并,工具会合并并提示)
大小上限单个响应体最大 20 MB,超出截断;请求体(含上传文件)上限 64 MB
压测精度并发上限 2000;样本超过 20 万时分位由对数直方图插值(误差约 2%,界面会标注)
压测真实性不模拟真实浏览器的连接行为:没有 HTTP/2,也没有 TLS 会话复用
前端缓存静态文件一律 no-store:改了前端代码请硬刷新一次,否则页面可能还在跑旧副本
平台预编译的 exe 目前只有 Windows x64;源码版在 macOS / Linux 上同样能跑
数据与隐私

东西都在你本机

存在哪

集合、环境、历史都在 data/*.json,就在程序旁边。界面只跟本机 127.0.0.1 通信,转发目标是你在请求里自己填的。

注意什么

数据是明文的——环境变量里的 token 也是明文。所以别把 data/ 提交到公开仓库;生成文档时认证信息会保留 {{token}} 写法,不会把真实凭据写进文件。

有没有外发

没有遥测、没有云端同步、没有账号。程序不会主动联网,只有你点"发送"时才去连目标服务。

联系方式

有问题可以发邮件:—

看完了,试一下

不需要配环境、不需要注册账号。下载下来双击,内置回声接口就能把整套流程跑一遍。