Put State in the Right Place

Lobsters Hottest 工具

摘要

介绍Data Star——一个仅4KB的声明式JavaScript库,通过将状态管理放在正确位置来解决Web开发中的常见问题,使Web UI变得诚实。

<p><a href="https://lobste.rs/s/rptxsy/put_state_right_place">Comments</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/30 17:54

TL;DR: 状态放错地方是大多数现实世界问题的根源,尤其在Web开发中,解决方案是使用专用引擎加声明式数据——浏览器本身就是超媒体客户端,HTML/CSS已是声明式,只需给JavaScript部分添加声明式属性即可,Data Star 以4KB做到了这一点,让Web UI变得诚实。 ## 核心公理:状态放错地方 每场好演讲都有个公理——一个基础性陈述,普遍认为真实无需证明。我的公理很简单:**状态放错地方是大多数现实世界问题的原因**,而且完全可避免。这适用于各种场景,但在网络领域一直是巨大问题。 我是Delaney,职业生涯很奇怪:从做电子游戏开始,做过老虎机(既干美术又写内部网络消息传递),参与过实时军事系统(对的时间给对的人,精确到帧),在Cenadia接触过大型分布式问题。网络本质是分布式问题,但很多人没意识到,以为客户端和服务端各有一条快乐小路。事实并非如此。 ## 浏览器强大但网络沉重 现代浏览器从未如此强大高效——能为你做很多非常好的事情。但网络从未感觉如此沉重:庞大、臃肿、难以使用。主要原因是大多数项目现在全是全栈JavaScript。我测试过:一个Next.js的“Hello World”(只把文字显示在屏幕上),做什么之前就是500兆字节——就一个Hello World页面。 我们还活在后leftpad的世界:因为一个ESX中没有的功能,网站挂了。更奇怪的是,在这种庞大的依赖下,开发者成了Next.js或SvelteKit开发者,不再是JavaScript开发者。各生态之间不怎么沟通。最终结果是大量CVE,而这些问题跟网络无关,跟这个慢慢积累起来的生态系统有关。 ## 为何走到这一步 当初单页应用流行时,服务器总是每个请求一个线程(Apache、Glassfish等),根本无法异步扩展。而地图、电子表格等有趣内容只能在客户端浏览器里实现。服务器当时不支持这些,客户端开始做重型工作,路就这么走偏了。一旦取得进展,每个人都说“你为什么不这么做?大家都在做了”。 我不把自己看作JavaScript开发者,但喜欢网络的沙盒部署。在军事领域让一个可执行文件通过审批极难,而浏览器可以立即发送内容并沙盒化。但现在的框架变成了“每周的JavaScript框架”,所有合成基准测试都没测试从服务器到客户端的完整流程,都在比谁更擅长成为最差选项。 ## 三种失败方式及其修复 我们今天就可以尝试修复三种失败方式,这不是空谈,而是可以解决: 1. **乐观更新是个谎言** —— 用户的意图并不是“我在买这个东西”,而是“我想试着买这个东西”。不要对用户撒谎。 2. **自定义代码通常是命令式的** —— 应该转向声明式风格。 3. **轮询导致状态过时** —— 数据需要实时同步。 ## 核心哲学:专用引擎 + 声明式数据 我从游戏开发和各种有趣经历中学到的核心哲学:**专用引擎加声明式数据才是你应该追求的方向**。比如SQLite:你说“创建唯一索引”,并没有告诉它如何让缓存失效、如何平衡B树。用户表达高层次意图,底层灵活性留给引擎。 浏览器已经是一个把超媒体发送到客户端的专用引擎——超媒体客户端。HTML和CSS已经是声明式的:你不需要告诉它哪个像素上屏幕,不需要告诉它如何处理flexbox。你说“这是我的意图,请渲染出来”。 问题在于JavaScript部分依然是命令式的。Carson Gross说过:JavaScript有一个难以置信的特性,它在浏览器里,但我们似乎只能跟它打交道。我们没法扔掉这只鸭子,所以需要让JavaScript部分更声明式。 ## Data Star:让JavaScript声明式 我做了Data Star(原名data-star),核心只有两件事: - **轻松解析属性**:使用浏览器原生支持的`data-*`自定义数据属性。 - **添加反应式表达式**:修复JavaScript缺少的声明式反应性。 仅此而已。现在它大概4KB(不是500MB),因为这事不应该那么难。TC39正在努力把信号(signals)带入浏览器,届时体积还会再减半。 我按照构建ECS游戏引擎系统的方式构建它,从此以后的一切都是插件。一旦声明式部分到位,你可以随意选择如何构建系统。 ## 数据引擎与诚实原则 我正在做一个“数据引擎”,把事件总线、数据集和开放本体论整合到一起。目标是让Web UI变得诚实——去掉框架的繁文缛节,不再成为Next.js或Data Star开发者,而只是使用网络作为目标,就像使用WebGL一样。 我处理数据引擎中的流式传输、压缩等许多问题,与网络上的问题是一样的。如果我为Data Star解决并帮到其他人,我也同时解决了自己的问题。 **三个关键原则**: - **事实靠近权威**:系统中每一条数据都有一个真相来源,知道它在哪里。 - **渲染靠近感知**:等到最后一刻才创建像素或数据,交给引擎去做。 - **意图靠近用户**:不要撒谎,也不要对别人说谎。用户点击按钮是说“我想试着买”,不是“我买了”。 ## 现状与未来 从第一次提交Data Star到现在大约3年。v1已经完成并发布,正常工作。除非浏览器停止向后兼容,否则不需要改变。我们已经成立了501(c)(3)组织,所有代码都放在组织下,我们是项目的管理者但不拥有任何代码,所以不会消失,没人能拿走它。 对我来说,这已经是一个解决了的问题。我可以回去处理那些真正有趣的问题了。针对网络做开发对我们和用户来说不再是问题。 --- Source: [YouTube视频](https://www.youtube.com/watch?v=W7Ki3aXgmZU) (Lobste.rs 讨论链接)

相似文章

Datastar 之道

Lobsters Hottest

一本指南,解释使用 Datastar 库构建 Web 应用程序的推荐实践('Datastar 方式'),强调后端驱动状态、SSE 流和 DOM 变形。

Datastar – 相当不错

Lobsters Hottest

ClojureScript 首席开发者 David Nolen 在使用 Datastar 重建 Instabooks 的一个生产应用后,称赞它是他12年来添加的最佳网页工具。

@vintcessun: 1个让无数团队头疼的问题终于有了解法。写JavaScript最怕代码一天后自己都看不懂,变量命名随性、函数又长又杂。这个项目把《Clean Code》的工程原则适配到JS,每个原则都配bad/good对比,告诉你为什么那样改。说白了,它解…

X AI KOLs Timeline

该项目将《Clean Code》的工程原则适配到JavaScript,提供每个原则的bad/good对比,帮助开发者写出可读、可复用、可重构的代码,解决团队协作中代码腐烂的问题。

@VincentLogic: 发现个前端圈公认的动画神器,68K stars 真的不是吹的! anime.js —— 一个轻量级但功能极其强大的 JavaScript 动画引擎。 前端兄弟们又来享福了,这玩意儿简直是“动画师的瑞士军刀”: 全能型选手 不管是 CSS …

X AI KOLs Timeline

Anime.js 是一个轻量级但功能强大的 JavaScript 动画引擎,支持 CSS、SVG、DOM 属性及 JavaScript 对象动画,具有直观的 API、时间线系统、滚动观察器、拖拽和响应式动画等特性,在 GitHub 上拥有 68K stars,是前端开发者和交互设计师的常用工具。

@LinxFocus: 前端的工作真的保不住了,这个项目已经冲到 9.6 万个 Star,它把 Apple、Figma、Linear、Stripe 等全球知名公司的设计系统都整理成了 DESIGH.md 文件,让 AI 学会顶级品牌的 UI 风格,不需要任何解析…

X AI KOLs Timeline

一个收集了Apple、Figma、Linear、Stripe等知名公司设计系统并整理成DESIGH.md文件的开源项目,目前已获得9.6万Star,能让AI学会顶级品牌的UI风格并直接生成符合规则的界面。