![]()
一个查询"二甲双胍+圣约翰草"的人,同时暴露了两个诊断:糖尿病,以及正在考虑的抑郁症治疗。传统架构里,这条查询会经过服务器、落进日志、写入数据库——每一步都是监管雷区。
开发者Kyle Foster干了件反直觉的事:把592条草药-药物相互作用数据,整个塞进前端。零API调用。零后端。零隐私泄露风险。
当健康数据成为烫手山芋
健康类App的默认架构像一条传送带:用户输入→发往服务器→查询数据库→返回结果。这套模式用了二十年,直到隐私法规变成紧箍咒。
HIPAA(美国健康保险流通与责任法案)要求健康数据泄露必须通知用户。GDPR(欧盟通用数据保护条例)把健康数据列为"特殊类别",处理需要明确授权。服务器日志里的一条查询记录,可能触发整套合规流程。
Foster的解法是干脆砍掉服务器。查询在浏览器本地完成,数据从未离开用户设备。没有传输,就没有拦截。没有存储,就没有泄露。没有后端,就没有HIPAA审计,没有GDPR数据处理登记,没有凌晨三点的安全事件响应。
整个数据库是一个JavaScript常量:
const INTERACTIONS = [ { id: "int-001", substance_a: { id: "warfarin", name: "Warfarin", type: "drug" }, substance_b: { id: "ginkgo", name: "Ginkgo biloba", type: "herb" }, severity: "high", effect: "Increased bleeding risk", mechanism: "Ginkgo inhibits platelet-activating factor (PAF)", evidence: "clinical", sources: ["Bent et al. 2005", "WHO Monographs"] }, // ... 591 more ];
![]()
592条记录,每条包含药物/草药名称、相互作用严重程度、作用机制、证据等级、文献来源。完整、结构化、可搜索。
模糊搜索的魔鬼细节
把数据塞进前端是第一步。让用户快速找到目标,才是体验分水岭。
Foster写了一个模糊匹配器,处理三种场景:精确前缀匹配(输入"war"匹配"Warfarin")、包含匹配(输入"farin"同样命中)、词首匹配(输入"john"匹配"St. John's Wort")。每种场景赋分排序,返回前8个结果。
一个容易被忽略的细节是重音符号处理。西班牙语用户可能输入"maca"或"máca",两者必须视为等价。代码里用normalize("NFD")把字符拆解为基字符+组合标记,再过滤掉重音范围,实现跨变体匹配。
性能焦虑者会质疑:每次按键搜索592条记录,不会卡吗?Foster的测试数据是200毫秒内完成——JavaScript引擎遍历小型数组的速度,远超人类感知阈值。作为参照,人类对界面延迟的容忍底线大约是100毫秒。
什么该留本地,什么必须上云
这个架构不是银弹。Foster自己划了边界:静态参考数据走本地,动态内容仍需服务器。药物相互作用数据库更新频率低,592条记录可以季度打包发布。但用户用药记录、个性化提醒、多设备同步——这些需要持久化存储的场景,后端不可替代。
![]()
关键洞察是数据敏感度与架构复杂度的权衡。健康查询的敏感程度,远高于查询结果本身。"用户搜了什么"是隐私金矿,"圣约翰草与华法林有出血风险"是公开医学知识。把后者静态化、本地化,既保功能又卸包袱。
这种思路有先例。MDN文档的离线搜索、React DevTools的组件树分析,都是把可静态化的数据塞进前端。但健康领域的监管压力,让"零后端"从性能优化变成了合规策略。
浏览器即操作系统的余波
Foster的项目用了零依赖——没有React,没有Lodash,没有构建工具。原生JavaScript + 一个HTML文件 + 592行JSON。这个选择在技术社区引发两极反应。
支持者认为,健康工具的生命周期以十年计,依赖越少,维护负担越轻。反对者质疑,现代前端工程化已经解决 tree-shaking 和代码分割,刻意追求"零依赖"是表演性极简。
双方忽略的一点是:健康数据的特殊性改变了技术选型的权重。一个糖尿病管理App可能服务用户二十年,期间经历三次框架换代、五次公司并购、无数次安全审计。零依赖架构的隐性价值,在于可审计性——审查者打开一个文件就能看到全部逻辑,没有隐藏的transitive dependency(传递依赖)风险。
欧盟MDR(医疗器械法规)对软件医疗器械的分类指南里,"数据存储位置"和"网络连接需求"是风险评级要素。Foster的架构选择,可能直接影响产品是否需要走Notified Body认证流程。
这个592条记录的实验,最终指向一个开放问题:当浏览器能承载越来越重的计算,"云端优先"的默认假设还剩多少有效期?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.