PrivacyArchitectureLocal-FirstUXCloudflare

求你了,我只是想格式化一段 JSON:为什么开发者越来越讨厌「请先登录」

2026-04-2710 分钟阅读

凌晨两点,我只想格式化一段 JSON,结果被要求登录、注册、升级 Pro。这篇文章复盘 daima.life 为何坚持零登录架构,以及纯前端工具如何用 localStorage、Canvas API 和 Cloudflare Pages 实现完全无后端的开发体验。

1. 糟糕的开头

上周四凌晨两点,我盯着屏幕上一个巨大的 401 Unauthorized,差点把键盘摔了。

我在调一个第三方支付回调接口,抓到一坨 3KB 的 minified JSON,需要格式化看一下结构。随手打开 Google 排名第一的某 JSON 工具网站,粘贴,点格式化,啪——弹出一个全屏 Modal:

"Free trial expired. Sign up to continue."

我只是想看看这段 JSON 长什么样,你要我的邮箱干嘛?

更离谱的是,我上个月明明注册过这个网站。翻了一下收件箱,果然找到了确认邮件。登录之后告诉我"免费额度已用完,升级 Pro 只需 $9.99/月"。我就格式化了三次 JSON,你跟我说额度用完了?

这件事直接触发了我搓 daima.life 的决心——做一个永远不需要登录的工具站。

2. 我的思考:登录墙的本质

为什么这些工具非要你登录?答案很简单:你的操作数据比订阅费值钱得多。

你在某工具网站格式化的每一段 JSON、解码的每一个 JWT、转换的每一份 YAML——这些数据的结构特征会被收集、聚合、脱敏之后卖给大数据分析公司。去翻翻那些网站的隐私政策,里面写得明明白白:

"We may share anonymized usage data with third-party analytics partners."

"匿名化"这三个字在 2026 年已经是个笑话了。MIT 在 2024 年发了论文,证明只需要 4 个时间戳特征就能以 95% 的概率对"匿名"数据进行重标识。你的 API Key 在 payload 里躺着呢。

所以 daima.life 的核心原则只有一条:浏览器就是服务器。

用户浏览器
  ├── Cloudflare Pages (静态 HTML/JS/CSS)
  ├── Next.js SSG (构建时渲染,运行时零后端)
  ├── Web Worker (重计算任务异步处理)
  └── localStorage (用户偏好,非数据存储)

服务器端
  └── 无。字面意义上的无。

没有数据库,没有用户表,没有 Session,没有 Cookie 追踪。用户打开页面的那一刻,所有计算能力都在他自己的设备上。断了 Wi-Fi,已经加载的工具照样能用。

3. 技术硬核区:无登录架构的三个挑战

挑战 1:没有后端怎么处理文件转换?

以图片压缩为例。传统方案是上传到服务器走 ImageMagick,我的方案是纯 Canvas API:

async function compressImage(file, quality) {
  const bitmap = await createImageBitmap(file);
  const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);
  const ctx = canvas.getContext('2d');
  ctx.drawImage(bitmap, 0, 0);
  
  // PNG 的 Double-Encoding 策略:Canvas toBlob 对 PNG 不支持 quality
  if (file.type === 'image/png') {
    const jpegBlob = await canvas.convertToBlob({ 
      type: 'image/jpeg', quality: quality / 100 
    });
    const jpegBitmap = await createImageBitmap(jpegBlob);
    ctx.drawImage(jpegBitmap, 0, 0);
    return canvas.convertToBlob({ type: 'image/png' });
  }
  
  return canvas.convertToBlob({ type: file.type, quality: quality / 100 });
}

挑战 2:用户设置怎么持久化?

没有账号体系,用户偏好(深色模式、缩进空格数)存在 localStorage 里,配上版本时间戳做迁移管理:

const PREF_KEY = 'daima_prefs_v2';
function savePreference(key, value) {
  const prefs = JSON.parse(localStorage.getItem(PREF_KEY) || '{}');
  prefs[key] = value;
  prefs._ts = Date.now();
  localStorage.setItem(PREF_KEY, JSON.stringify(prefs));
}

有人说 localStorage 不安全。没错,它可以被同源 JS 访问。但我存的是"用户喜欢 4 空格缩进",不是信用卡号。工具站的数据敏感度,和社交平台完全不在一个维度上。

挑战 3:SEO 怎么做?

纯静态站的 SEO 靠构建时生成。generateStaticParams() 为 213 个工具 × 3 种语言生成 639 个静态页面,每个页面在 build 时就带好 <title><meta>、JSON-LD。Google 爬虫看到的是完整 HTML,不需要执行任何 JS。

4. FAQ 模块

Q1: 纯前端工具会不会被 CSP (Content-Security-Policy) 搞死?

会。尤其是需要 eval() 的场景(比如 JS 在线运行器)。解决方案是用 <iframe sandbox="allow-scripts"> 隔离执行环境,父页面 CSP 设成 script-src 'self',子 iframe 通过 srcdoc 注入用户代码。postMessage 做通信桥。即使用户写了 document.cookie,拿到的也是空的沙盒 cookie。

Q2: Cloudflare Pages 的冷启动延迟怎么优化?

Pages 本身几乎没有冷启动问题——静态文件从 CDN 边缘直推。但如果用了 Workers 做 API 路由,会有约 50ms 冷启动。我的策略是能不用 Workers 就不用。200+ 个工具里,只有 TTS 用到了 Edge Function 做中转,其余全部纯静态。

Q3: 用户清了 localStorage 偏好就全丢了怎么办?

这是无登录架构的固有代价。我提供了"导出/导入设置"功能——把 localStorage 序列化成 JSON 文件下载到本地,想恢复时导入就行。这比让用户注册账号、担心密码泄露,要优雅得多。

5. 结尾

有人问我:"不要登录,靠什么赚钱?" 说实话现在确实不赚什么钱。daima.life 跑在 Cloudflare 的免费额度里,域名一年几十块,成本约等于零。

但我押注的是一个趋势——随着 WebAssembly 和 WebGPU 的成熟,越来越多原本需要服务器算力的任务会被推到浏览器端。需要登录、需要上传数据的工具会像功能机一样被淘汰。

下一篇我想聊聊怎么用 WASM 在浏览器里跑一个完整的 SQLite——不需要后端,不需要登录,你的数据库就活在你的 Tab 页里。