背景:一个被 Excel 撑了三年的内部工具
背景:一个被 Excel 撑了三年的内部工具
我们团队有个「投放配置校对」的内部工具,需求很朴素:运营把渠道给的 CSV 拖进来,前端做字段映射和格式校验,展示差异,导出修正后的 JSON 给投放系统。最早是后端同学用 Django 模板写的,后来大家嫌每次改规则都要发版、要过 CI、要等发布窗口,运营自己用 Excel 宏拼了一个版本,散落在共享盘里,谁改了什么没人知道。
去年我把它重写成了纯静态页:一个 index.html、几个 .js 模块、一个 styles.css,没有构建工具,没有 npm 依赖,没有服务端。部署就是把这几个文件丢进公司内网的静态文件服务器目录tag下,跟放一张图片没区别。下面是我们在这类内部工具上反复验证过的几个理由,都是踩过坑之后的经验。
一、发布链路短到可以忽略,改需求当天就能上线
内部工具最大的成本从来不是开发,而是「改一版要多久」。走后端服务的项目,改一个校验规则要经历:改代码、跑单测、构建镜像、提 PR、等 review、合并、触发流水线、灰度、观察。一套下来半天到一天,遇到发布窗口冻结就更久。而静态页的发布链路是:编辑文件、本地用 python3 -m http.server 起个服务自测、把文件拷到共享目录、刷新浏览器。
实操上有两个细节值得说:
- 把静态目录挂在内网文件服务器(我们用的是 Samba 共享 + Nginx 只读映射),运营自己就有写权限,改一个文案不需要找开发。权限收窄到只有
dist/目录可写,源码仍在 Git 里。 - 用文件名的内容哈希做缓存失效,比如
app.7f3c2a.js,避免用户浏览器缓存旧版本导致的「我这儿明明是好的」扯皮。没有构建工具就手写一个sed替换脚本,十行搞定。
结果是需求响应周期从「按天」变成「按小时」,这对一个只有内部十几个人用、但规则天天变的小工具来说,价值远大于工程规范性。
二、数据不出浏览器,天然绕开权限与合规审批
这类工具处理的往往是渠道名单、结算明细、用户 ID 映射表。一旦上传到服务端,就要考虑:谁能访问这台机器、日志里会不会落盘敏感字段、数据库要不要脱敏、要不要走数据安全审批。我们曾经为了一个「对比两个 Excel 差异」的小功能,被要求补一份数据流转说明,评审排了两周。
纯静态页把数据处理完全放在浏览器里:FileReader 读本地文件、URL.createObjectURL 生成下载、所有计算在内存中完成,页面关闭即销毁 phenol。没有网络请求,没有服务端存储,评审时的结论就是「不涉及数据传输与留存」。这不是钻空子,而是架构上真的没有这个面。
需要注意的边界:
- 静态页本身仍然是内网可访问的资源,别把它放到公网 CDN 上,否则等于把工具逻辑和内置的映射规则表暴露了。
- 如果引入了第三方 CDN 的库(比如某些图表库),浏览器的请求会带 Referer 出去,要么自托管,要么加
referrerpolicy="no-referrer"。我们后来把所有依赖都本地化了。
三、没有运行时依赖,就不会有「服务挂了」的工单
内部工具最尴尬的状态是:用的人不多,但一旦不可用,正好卡在别人的业务节点上。后端服务要考虑进程、端口、依赖的数据库、部署机器磁盘满了、证书过期。我们那个 Django 版本一年里因为各种原因不可用大概四五次,每次都要人去重启。
静态页的可用性等于「文件服务器可用性」,而那个东西本来就是全公司的文件基础设施,有专人维护,SLA 比我们自己的小服务高得多。它没有进程可挂,没有连接池可耗尽,没有定时任务会失败。浏览器兼容性反而是更现实的风险点:我们明确只支持 Chrome 100+ 和 Edge,页面加载时用特性检测给一个提示条,不支持就直接告诉用户换浏览器,而不是让他点了半小时才发现导出是坏的。
四、成本低到可以「用完即弃」,反而更敢做小工具
这是最容易被低估的一点。走正规服务化流程做一个内部工具,隐性成本包括:仓库、CI 配置、部署环境、监控告警、值班归属、后续的依赖升级。一个只服务五个人的工具,摊上这些成本,ROI 往往算不过来,于是大家继续用 Excel 和手工操作。
静态页把这些成本压到接近于零:不需要监控(挂了就是文件没了,用户会立刻说)、不需要值班(没有服务端)、不需要依赖升级(package.json 里可以一个依赖都没有)。我们用原生 <input type="file"> + FileReader + Blob 下载,连框架都没引入,整个目录 40KB。
代价也要说清楚:
- 状态管理全靠手写,页面一复杂就容易出现「改了这个忘了刷那个」,我们的做法是单一
state对象 + 一个render(),全量重绘,不搞增量更新。 - 没有后端就没法做真正的权限控制,只能靠「内网可达 + 不告诉他地址」这种弱隔离,所以别把敏感数据本身放进去,只放处理逻辑。
- 大文件(几百 MB 的 CSV)在浏览器里解析会卡,我们加了行数上限提示,超过阈值建议走服务端方案,别硬扛。
结论很朴素:内部工具的评判标准是「解决问题要多久、维护它要多久」,而不是「架构先不先进」。纯静态页在这两个维度上,对相当一部分场景是压倒性的优势。先用它把需求跑通,等用户量和数据敏感性真的涨上来了,再谈服务化也不迟。
- 点赞
- 收藏
- 关注作者
评论(0)