Node 内置模块
HTTP 转发、gzip/br 解压、TLS 信息、SSE 推流全部手写,不引框架。换来的代价是细节都得自己处理(比如重定向链、分段耗时)。
日常调接口是这样的:一个工具发请求,另一个工具压测,最后还得分头维护一份接口文档—— 而这三件事用的其实是同一份东西:请求定义。
另一个现实问题是环境。这类工具通常自带一堆依赖,换台机器就得先配环境。 所以这个项目给自己定了一条硬规矩:运行时只用 Node 内置模块, 再加上原生前端,不引入任何第三方包,也没有构建步骤。
结论就是现在这样:一个目录,node server.js 就能跑;打包出来是一个文件,双击就能用。
HTTP 转发、gzip/br 解压、TLS 信息、SSE 推流全部手写,不引框架。换来的代价是细节都得自己处理(比如重定向链、分段耗时)。
没有 React / Vue,没有打包器。一个 public/ 目录直接丢给浏览器。换来的代价是复杂交互要自己管状态。
写入用「临时文件 + 改名」避免留下半截文件。代价是没有并发写保护,适合单人本地用,不适合多人同时改。
用 @yao-pkg/pkg 把 Node 运行时和资源一起塞进 exe,再把 PE 头改成窗口程序。代价是体积 55 MB。
这个项目踩过的坑有个共同点:界面看着一切正常,其实判据是假的。 所以关键承诺都写成了能跑、也能被反向验证的断言,而不是靠肉眼看一遍。
| 关卡 | 跑什么 | 断言 |
|---|---|---|
| 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}} 写法,不会把真实凭据写进文件。
没有遥测、没有云端同步、没有账号。程序不会主动联网,只有你点"发送"时才去连目标服务。
有问题可以发邮件:—