ArchitecturePrivacyLocal-FirstWeb Workers

为什么我坚持不写后端,把所有数据留在用户本地,这不仅是安全更是架构美学

2026-03-299 分钟阅读

没有数据库,没有 API 节点,甚至没有用户账号。本文深度拆解 daima.life 的‘Local-First’架构,分享如何利用浏览器现代 API 搓出一套极速且永不宕机的无后端工具箱。

经常有同行问我:“你的 daima.life 每天跑几百万次转换,后端的压力得有多大?服务器费用得不少吧?”通常这时候,我只会给他们回一个高深莫测的微笑:我压根没写后端,一行代码都没有。在这个动不动就“云计算、微服务”的燥热年代,我选择了一种极其冷静甚至有些偏执的架构方案:把所有的计算和数据全部关在用户的浏览器里。这不仅是为了那点可怜的云成本,更是因为,在我眼里,这是一种极致的架构美学。

我的思考

为什么现在的网页工具越来越迷信后端解析?因为开发者们习惯了逃避——遇到重活就扔给服务器,遇到数据就存进数据库。但这带来的代价是高昂的:为了那点隐私数据,你得写复杂的权限逻辑;为了全球加速,你得在各个节点堆机器。在 daima.life,我反其道而行之。我希望这个工具箱像一把物理世界的“瑞士军刀”,你打开它就能用,它的锋利程度取决于你的手感,而不是远在天边的工厂有没有停电。Privacy-First 不是口号,它是通过物理距离(0像素)实现的绝对隔离。

技术硬核区

实现这种“局部闭环”的底气来源于浏览器技术的长足进步。在 daima.life,我几乎榨干了这几样东西的性能:Web Workers 处理高强度解析(比如 50MB 的 JSON 转换),IndexedDB 存储用户的个性化配置,以及 OPFS(Origin Private File System)处理那些超大附件的暂存。这套组合拳让应用呈现出一种“永不宕机”的状态——只要你的浏览器还能打开,daima.life 就在那里,不管 Cloudflare 的节点是不是被雷劈了。

// 核心架构逻辑:Local-First 数据处理流
async function processDataLocally(input) {
  // 1. 唤醒后台 Worker,绝不阻塞主线程
  const worker = spawnWorker('heavy-parser');
  
  // 2. 利用 SharedArrayBuffer 实现零拷贝通信(针对巨量数据)
  const result = await worker.execute(input);
  
  // 3. 将结果快照进 IndexedDB,实现毫秒级回显
  await db.save('history', result);
  return result;
}

最让我着迷的是这种“无感同步”。当你切换不同设备时,你可以通过一条简单的加密链路(比如 WebRTC 或者纯扫码)直接对拷数据,而不必经过任何中心化的服务器。没有中间商赚差价,没有中间商偷看你的秘密。这种架构上的清爽感,是任何分布式微服务都无法比拟的。

FAQ 模块

Q1: 没有后端,用户的配置怎么跨设备同步?

A: 这是一个典型的思维定式。为什么同步一定要经过服务器?在 daima.life,我们支持基于 P2P 流的加密传输。如果你觉得这太麻烦,我们还提供了一种“冷同步”:把数据压碎成一个不到 1KB 的加密字符串,你自己存进笔记软件里,或者扫码带走。去中心化,才是真正的自由。

Q2: 浏览器内存有限,处理大文件不会崩吗?

A: 崩不崩取决于你对内存的精细化程度。我采用了流式读取(ReadableStream)和 WebAssembly 优化过的解析策略。只要你不是在几十年前的老爷机上跑,现代浏览器的内存管理远比你想象的要强。daima.life 已经成功挑战过在浏览器内直接解析 500MB 的日志文件,那一刻的丝滑,就是架构美学的最高奖章。

结尾

放弃后端,意味着你必须正面硬刚浏览器那点可怜的配额限制和异步噩梦。但这过程中的每一行代码,都是在为用户的隐私站岗,都是在向性能的极限冲锋。当我看到 daima.life 在断网的情况下依然能够瞬间响应,那种掌控感真的会让人上瘾。你还在为服务器的并发压力焦虑吗?也许,是时候亲手拆掉那个沉重的后端,来感受一下什么叫真正的“轻盈”了。...