1. 从收藏夹到自建站:为什么我决定不再依赖在线工具
1.1 在线工具的三宗罪:广告、隐私、不确定性
作为一个整天跟 JSON、接口返回值、时间戳打交道的人,我的浏览器收藏夹里一度躺着十几个在线工具站。日期转时间戳用一个站,JSON 格式化用一个站,URL 编解码又换一个站,正则调试还得再开一个。表面上看,这些站点随用随走,确实方便。但用久了,问题就一个个冒出来了。
第一是广告。很多在线工具站的商业模式就是流量换广告费,工具页面被各种横幅、弹窗、浮标挤得只剩中间一小块输入区。我试过好几次,在格式化 JSON 的时候误点弹窗跳转到莫名其妙的页面,白白浪费好几分钟。更离谱的是,部分站点把「复制结果」按钮做成了会员专享,免费用户只能手动全选复制,遇到超大文本就特别难受。
第二是隐私,这个是最让我不安的。绝大多数在线工具都是「提交到服务器 → 服务器算完 → 返回结果」的模式,你贴进去的接口返回体、Token、密钥片段,根本不知道会被服务端怎么处理。我见过有同行因为图省事,把内网接口的数据直接贴到在线工具里格式化,后来才意识到这属于很严重的违规操作。哪怕不是敏感数据,「自己的代码经过别人的服务器」这件事本身就让人心里硌得慌。
第三是不确定性。收藏夹里的工具站可能毫无征兆地改版、关停、换域名,一旦没了,你之前养成的肌肉记忆和操作习惯全得推翻重来。而且在线工具的功能是别人定义的,你没法按自己的习惯改交互、加功能。遇到一个冷门格式转换需求,经常要在好几个站之间来回试。
1.2 自建工具箱的边界:哪些工具值得搬、哪些不值得
决定自己建站之后,我先给自己定了一条边界:凡是纯客户端就能完成、且我每周至少用三次的工具,值得搬;凡是依赖服务端能力、需要账号体系、或者一个月都用不到一次的工具,不值得搬。这个边界非常重要,否则很容易陷入「什么都想自己搞」的陷阱,最后维护成本压死人。
按这个标准筛下来,值得搬的其实是一大类:纯粹的文本数据变换工具。时间戳与日期互转、JSON 格式化与压缩、URL 编解码、Base64 编解码、正则表达式调试、UUID 生成,这些都是输入经过确定性的算法处理就得到输出的操作,完全可以在浏览器本地完成,不需要任何后端服务。而 OCR 识别、文件格式转换这类计算密集型的活儿,纯前端虽然也能做,但性能和效果跟专业服务差距明显,我就没搬。
成本账也要算清楚。自建站不是零成本的,域名和托管是支出,更重要的是维护时间。但换个角度看,把常用工具变成自己的资产,一次投入长期复用,省下的是未来无数次打开广告站、担心隐私、重新适应交互的时间。这一年多做下来,我的体会是这笔账非常划算。
2. 技术选型复盘:纯静态方案如何撑起一个工具箱站点
2.1 为什么选这个组合,而不是更「轻」的方案
技术选型是我花时间最多的一环。最初摆在我面前的有三个选项:纯 HTML 单文件、引入 CDN 框架、完整的打包工具链。纯单文件方案确实最轻,每个工具一个 HTML 文件,双击就能用。但工具一多,公共逻辑完全没法复用,写一个「复制按钮」就得复制粘贴十几次,后面想统一改样式要遍历所有文件,光想想就头大。CDN 引框架的方案省去了本地构建,但也失去了工程化管理的能力,代码分割、按需加载、静态资源指纹这些优化全都做不了。
最后我选了打包工具链这条完整路线,用某款主流的构建工具配合渐进式框架。选择它的核心原因有两个:开发体验和构建产物。冷启动速度是我非常看重的,改一行代码刷新就能看到效果,这种即时反馈对迭代工具类小页面特别重要。生产构建又能做代码分割,每个工具单独打包成独立的异步块,首屏只加载框架壳子和当前工具,体积可以压到很小。
框架方面,我用了组合式 API 的风格来组织代码。这种「一个页面一个工具」的形态,非常适合把每个工具的逻辑封装成一个独立的组合函数,页面里只需要调用对应的 Hook 就行。工具之间零耦合,新增工具不影响已有功能,这对一个会长久维护的工具站来说太关键了。
2.2 PWA 离线能力:让工具在断网时依然可用
既然目标就是纯前端,那就干脆把离线能力做满。渐进式 Web 应用(PWA)是这里的关键。我用构建工具配套的插件生成 Service Worker,把站点的静态资源全部做预缓存。这样一来,只要用户访问过一次,之后就算在飞机上、地铁里没有信号,所有工具照样能跑。这个体验是任何在线工具都给不了的——在线工具断网即废,自建站断网却依然是好帮手。
Service Worker 的缓存策略我用了简单的 Cache First,针对不变的静态资源这是最合适的。但这里有个必须注意的细节:版本更新。每次发布新版本后,缓存名要跟着变,否则用户拿到的永远是旧版。我在构建脚本里用时间戳作为缓存版本标识,每次发布自动更新,彻底解决了「工具改了用户却看不到新版」的问题。
2.3 组件划分与工具注册机制
工具多了之后,导航就成了新的难点。我把每个工具抽象成一个独立的路由页面,同时维护一份统一的工具清单配置,里面包含工具名称、路由路径、搜索关键词、所属分类这几个字段。侧边栏菜单、全局搜索、命令面板都读取这份配置来渲染,新增工具时只需要添加一个页面文件、在配置里加一行记录,导航相关代码一行都不用改。
这个注册机制越到后面越受益。现在站点里已经有二十多个工具,菜单依然清爽不混乱。如果当初把导航写死,每加一个工具都要改菜单组件、改搜索组件、改快捷键组件,三方不同步很容易出问题。配置驱动的思路让整个站点保持了一种「加工具零成本」的状态,这大概就是所谓架构的红利。
3. 第一批工具的实现细节与交互设计
3.1 第一批上线了哪些工具
第一批我挑了使用频率最高的几个,做一个上线一个,不求一次做全。清单如下:时间戳与日期互转、JSON 格式化与压缩、URL 编解码、Base64 文本编解码、正则表达式测试、UUID 生成器。这些工具表面上看都简单得不行,但真正动手实现时,几乎每一个都有值得说道的细节,下面挑几个重点展开。
3.2 时间戳转换器的坑:秒毫秒与时区
时间戳工具是最容易做错的,因为没有统一标准,后端世界的习惯和前端世界不一样。JavaScript 的 Date 对象以毫秒为单位,而不少接口返回的是秒级时间戳。如果工具不做区分,转换结果就会差 1000 倍,轻则数据显示错误,重则让排查问题的人怀疑人生。我的处理方式是做一个「秒 / 毫秒自动探测」:根据数值量级判断,超过某个阈值就按毫秒处理,同时界面上明确标注当前单位,让用户随时可以手动切换。
时区问题也绕不开。我默认展示本地时区的时间,同时提供一个 UTC 对照显示。为什么要这么设计?因为很多线上问题的排查需要对比服务器日志时间和本地时间,日志通常记录的是 UTC,你本地看的是东八区时间,不对照清楚就会算错。
3.3 JSON 格式化的大数据量处理:别在主线程里硬扛
JSON 格式化看似简单,parse 一下再 stringify 就行,但遇到超大 JSON 文件就完全不是这么回事了。有一次我尝试格式化一个 20MB 的导出文件,页面直接卡了几分钟,这时候才意识到问题严重性。JSON.stringify 一把梭在处理几百 KB 数据时没问题,但数据量上来了,主线程被同步操作阻塞,浏览器连滚动都动不了。
我的解决方案是分片处理加 Web Worker:把解析和格式化放到 Worker 线程里执行,主线程只负责接收处理结果并渲染。这样即使处理大文件,页面也能保持响应。此外,我在格式化工具里加了错误定位能力,解析失败时直接指出第几行出错,而不是只弹一个冷冰冰的「Invalid JSON」。对于经常面对后端返回异常数据的开发者来说,这个错误定位功能能省下不少排查时间。
3.4 正则测试器的实时反馈设计
正则工具我参考了专业工具的思路,做成「输入即测」的实时反馈模式:左边输入正则表达式和测试文本,右侧立刻高亮匹配到的内容。实现上最需要注意的坑是转义问题——用户从输入框里拿到的字符串,最终要交给 new RegExp() 构造,这里必须原样处理,不能多转义也不能少转义。同时要提供「忽略大小写」「全局匹配」「多行模式」几个 flag 选项,否则很多实际场景的正则根本没法测。
我还加了一个调试功能:把命名捕获组的匹配结果单独列出来,方便检查复杂的捕获逻辑。正则这东西,写的时候一时爽,调试的时候火葬场。有了分组匹配的可视化输出,至少能对照着看每个分组到底抓到了什么,这个功能在排查线上日志解析时帮了我大忙。
4. 键盘优先的交互设计:开发者工具该有的样子
4.1 全局命令面板:一个输入框打天下
开发者习惯键盘操作,鼠标点来点去总觉得不够利落。我给站点加了一个全局命令面板,在任何页面按快捷键就能呼出,输入关键词模糊搜索工具名称并立刻跳转。这个功能让整个工具站的使用效率提升了一个档次。实现思路不算复杂:一个全局搜索框监听键盘事件,命中工具清单配置后触发路由跳转。
关键细节是模糊匹配的策略。我简单实现了「子串匹配 + 拼音首字母匹配」两层:先按工具名称和关键词做子串匹配,匹配不到再尝试拼音首字母。比如用户输入「sjc」,就能匹配到「时间戳转换」。这个体验对习惯快节奏的开发者很友好,也是我在这类自建里最满意的交互之一。
4.2 工具间切换的状态保持
工具站有个很常见的痛点:在 JSON 格式化工具里贴了一大段数据,切到时间戳工具查个时间,再切回来发现刚才贴的内容全没了。瞬间心态就崩了。我通过缓存机制保住了每个工具页面的状态,切走再切回来时,输入内容和结果原封不动。
这个细节虽然不起眼,但用过就回不去。它让多个工具之间的配合变得顺畅,比如在 JSON 工具里格式化完一段数据,切到正则工具里调试匹配规则,再切回来对照修改,整个流程一气呵成,不用反复粘贴复制,数据也一直待在它该在的地方。
4.3 复制粘贴的兼容处理
工具站最重要的动作之一就是「复制结果」,这个环节的兼容性必须处理好。我统一封装了一个复制函数:优先使用现代浏览器的剪贴板接口,失败则回退到传统方案。后者虽然已经标记为废弃,但在旧浏览器和某些特殊环境下依然是坚实的兜底。
这里有两个值得一提的坑。一是剪贴板接口必须在用户手势的同步调用栈里执行,否则浏览器会拒绝操作。我一开始在异步回调里调用复制,结果时灵时不灵,改成在点击事件里同步调用后才稳定。二是非安全上下文(非 HTTPS 或非 localhost)下剪贴板接口基本不可用,本地调试必须注意这个问题。复制成功时我会给一个轻量提示,让用户清楚知道结果已经进剪贴板了,而不是自己怀疑半天。
5. 部署上线与持续迭代的完整链路
5.1 静态托管与成本控制
整个站是纯静态的,部署非常省事。我把构建产物直接托管在使用的主机上,配上自己的域名,全站启用 HTTPS。成本方面,域名续费一年几十块,托管在免费额度内,基本等于零成本运营。对于个人项目来说,这个成本结构近乎理想——没有服务器要维护,没有后端进程要监控,唯一的运维工作就是更新静态文件。
纯静态方案还有一个好处:天然抗压。不用担心并发、不用担心数据库连接数,就算突然来一大波访问,撑不住也就是加载慢一点,不会崩。当然我这个工具站也不会有那么大流量,但「不需要操心服务器」本身就是巨大的精力节省。
5.2 自动构建与发布:推到仓库就上线
我配置了持续集成流程,实现「推送到代码仓库就自动构建发布」。每次新增工具或修改功能,只需要提交代码,构建流程会自动完成打包、部署,全程不需要人工介入。这个自动化让我可以在碎片时间里维护项目,甚至在外面用手机改完文档提交,回来发现站点已经自动更新了。
构建脚本里我还加了几道检查关卡:每个工具必须注册到清单配置中,否则构建报错;路由文件不允许重复定义;打包产物单文件体积超过设定阈值会报警提醒。这些检查在项目初期看起来有点「过度设计」,但二十多个工具之后,它们帮我挡住了不少低级错误,特别是配置漏注册这种事,有一道自动检查比人工审查靠谱得多。
5.3 数据埋点与迭代优先级
自建工具站当然也可以有数据统计。我没有上复杂的分析平台,而是自己在页面里埋了一个轻量事件统计,记录每个工具的使用次数和入口来源。数据攒了几个月之后,结论让我有些意外:某些当初「顺手加的」小工具使用频率远超预期,而另一些精心设计的工具却几乎没人用。
根据这份数据,我把高频工具做了好几轮体验优化,低频工具直接下架。这个「让数据说话」的迭代方式,让站点始终保持着精简和实用,也避免了「我用自己的直觉替用户做决定」的常见毛病。毕竟自己建的站,也要想想来用的同路人真正需要什么。
6. 踩坑记录:那些文档里不会写的细节
6.1 剪贴板接口的权限陷阱
前面提过剪贴板接口必须在用户手势的同步调用栈里执行,这个坑我实际踩得很深。最初我把复制逻辑封装在 Promise 的回调里,测试时在 Chrome 上偶尔能成功、偶尔被拒绝,排查了很久才意识到是浏览器权限策略的问题。这个接口的设计逻辑是:浏览器只信任「用户明确点击或按键触发的同步链路」里的剪贴板写入,异步回调里的写入请求会被当作可疑行为拒绝。
同样让我记忆深刻的还有「权限状态」问题。第一次调用时如果用户拒绝授权,浏览器有时会把该域名记入黑名单,后续调用直接失败且不再弹授权框。处理办法是在界面文案里引导用户了解授权原因,而不是让用户莫名其妙地被拒绝。
6.2 大文件处理导致的页面卡死
这就是我在 JSON 工具部分提到的那个 20MB 文件的教训。当时页面卡了好几分钟,我一度以为是浏览器坏了,后来打开任务管理器才发现是标签页占用了极高的 CPU。原因是 JSON.parse 是同步操作,在主线程上执行时整个页面渲染都被阻塞。这个教训推动我把「大数据量处理」作为所有工具设计时的默认考量项,而不只是 JSON 工具。
现在我的处理原则是:凡是可能接收大输入的工具,处理逻辑都优先考虑丢进 Web Worker。Worker 里跑完再通过消息传递把结果送回主线程,页面始终保持流畅。虽然多写了一些通信代码,但换来的是「不管贴多大的数据都不会卡死」的安心感。
6.3 移动端使用场景的适配教训
以为工具站只有桌面端会用的想法是错误的。不少开发者会临时用手机查个时间戳、解码个 Base64,我一开始完全没考虑移动端布局,输入框和按钮在手机上小得几乎没法点。后来专门做了一轮移动端适配:加大常用操作按钮的触控区域,输入框禁用页面缩放,并且把结果区域的字体调成适合手机阅读的大小。
适配完再测试才发现,原来觉得「凑合能用」的移动端体验,和真正适配过的相比差了还是不少。这也让我养成一个习惯:每次上线新工具,先在桌面浏览器测功能,再用手机浏览器过一遍基本流程,两个端都通了才算完成。做工具站这事,细节决定口碑,自己用着顺手还不够,别人用着顺手才是真正的标准。
最后再分享一点个人体会:做这个工具箱网站的过程,其实也是我整理自己开发习惯的过程。每加一个工具我都会问自己,这个功能我真的常用吗?每次改交互,我也会用一段时间再决定去留,留下来的每个工具都经过了真实使用的检验。如果你也受够了在线工具的广告和隐私问题,不妨从一两个最常用的工具开始,慢慢把它们搬进自己的网站。工具这东西,自己说了算的感觉,真的不一样。