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 页里。