文章摘要
作者在使用Linear项目管理工具时,对其即时响应和无网络延迟的特性感到惊讶,进而深入研究了其技术实现。通过逆向工程和同步协议的解析,作者发现Linear采用了本地优先(local-first)的设计理念,这种设计使得应用在离线状态下仍能高效运行,彻底改变了作者对传统网页应用的认知。
文章总结
标题:Linear 让我深入探索了“本地优先”技术 | Bytemash
几个月前,我开始使用 Linear,这款项目管理工具的速度之快让我感到不可思议。点击一个问题,它瞬间打开;更新状态并在另一个浏览器中查看,几乎与源浏览器同步更新。没有加载状态,没有页面刷新,一切都是即时的交互。这种体验让我对传统的 Web 应用开发方式产生了疑问:网络延迟去哪了?他们如何处理冲突?离线时会发生什么?
带着这些问题,我决定深入研究 Linear 的技术实现。通过一系列的技术文档和逆向工程,我发现 Linear 构建了自己的同步引擎,将浏览器的 IndexedDB 视为一个真正的数据库。所有的更改首先在本地进行,然后通过 GraphQL 进行数据变更,并通过 WebSocket 进行同步。
这种“本地优先”的理念,简单来说,就是应用程序拥有自己的本地数据库,而不是仅仅作为一个向服务器发送数据的表单。在某些情况下,服务器只是另一个需要同步的客户端。这种方式颠覆了传统的 Web 应用架构,消除了用户交互路径中的网络延迟,使得更新能够即时完成。
然而,实现这种技术并不简单。处理离线/在线切换、解决分布式客户端之间的冲突、部分同步、跨缓存数据的模式迁移以及分布式系统中的安全性和访问控制,都是复杂的挑战。
幸运的是,2025 年的“本地优先”生态系统已经提供了一些解决方案,如 Electric SQL、PowerSync、Jazz、Replicache、Zero、Triplit、Instant 和 LiveStore 等。其中,Jazz 尤其引人注目,它通过“协作值”(CoValues)这一数据结构,简化了分布式实时协作应用的开发。Jazz 的架构虽然高效,但也带来了一些限制,如服务器无法读取用户数据、存储需求不断增长等。
尽管存在这些挑战,“本地优先”技术在某些场景下仍然具有显著优势,如创意工具、协作应用、需要离线支持的移动应用、开发者工具和个人生产力应用等。然而,对于需要复杂服务器端业务逻辑、严格审计要求或大规模数据分析的系统,这种架构可能并不适合。
总的来说,“本地优先”技术代表了应用开发方式的一次根本性转变。虽然生态系统仍处于早期阶段,但其核心洞察——通过保持数据本地化来构建更好的用户体验——无疑具有长远的潜力。如果你正在构建新应用,并且能够适应其约束条件,不妨尝试“本地优先”技术,你可能会为用户带来前所未有的快速体验。
评论总结
评论内容总结如下:
广告质疑
- 有评论认为文章是广告。
- 引用:"This is an ad." (ivape)
技术问题
- 有用户反映网站存在连接问题,可能是流量过大导致的。
- 引用:"Some problem on the site. Too much traffic?" (Gravityloss)
技术对比
- 有评论质疑该技术是否优于现有的解决方案,如react-query。
- 引用:"How is this approach better than using react-query to persist storage which periodically sync the local storage and the server storage?" (mbaranturkmen)
本地优先的适用性
- 有评论认为本地优先技术更适合移动端,而非网页端,因为网页端通常有网络连接。
- 引用:"I wonder why they focus so much on local first for the web over other platforms, as in, I see mobile being the primary local first use case since you may not always have internet." (petralithic)
对网页性能的批评
- 有评论对网页的低延迟操作被描述为“极快”表示不满,认为这是网页性能下降的表现。
- 引用:"How garbage the web has become for a low-latency click action being qualified as 'impossibly fast'." (incorrecthorse)
技术相似性
- 有评论指出Meteor技术与该技术非常相似,并分享了使用Meteor的经验。
- 引用:"Meteor was/is a very similar technology. And I did some fairly major projects with it." (mkarliner)
本地优先开发的挑战
- 有开发者分享了在本地优先编辑器开发中遇到的挑战,如存储大小问题。
- 引用:"There are enormous challenges to make it work. For example the storage size issue mentioned in the blog." (terencege)
本地优先技术的未来
- 有评论认为本地优先和同步引擎是未来趋势,并推荐了一些相关技术和资源。
- 引用:"Local-First & Sync-Engines are the future." (mentalgear)
开源项目的经验分享
- 有开发者分享了基于CRDT的本地优先任务管理软件的经验,详细介绍了其技术架构和优缺点。
- 引用:"I developed an open-source task management software based on CRDT with a local-first approach." (Cassandra99)
技术推荐
- 有评论推荐Automerge和Keyhive作为未来的技术方向。
- 引用:"Automerge + Keyhive is the future." (preaching5271)
对同步问题的质疑
- 有评论质疑本地优先技术是否真的解决了网络延迟问题。
- 引用:"You still have to sync the state one way or another, network latency is still there." (yanis_t)
对Jazz技术的评价
- 有评论对Jazz技术表示赞赏,但也指出了其在数据增长和公共索引方面的不足。
- 引用:"I've been very impressed by Jazz -- it enables great DX and great UX." (blixt)
本地优先应用的经验分享
- 有开发者分享了使用PouchDB和SQLite开发本地优先应用的经验。
- 引用:"I have been building a local first application for Invoicing since 2020 called Upcount." (madisvain)
对本地优先技术的兴趣
- 有评论认为本地优先技术非常有趣且必要,尤其是在解决同步问题时。
- 引用:"Local first is super interesting and absolutely needed." (bento_n)
数据冲突处理的疑问
- 有评论提出如何处理数据冲突的问题。
- 引用:"But how is conflicting data handled?" (croes)