Datastar 是一个约 11KB 的超媒体框架:浏览器只需一个 script 标签,服务端发送 HTML,没有客户端视图层、构建步骤,也没有供 UI 消费的 JSON API。它靠两点工作:HTML 上的 data-* 属性赋予元素响应式并向后端发请求;SSE 事件让一次后端响应在连接保持期间多次补丁 DOM 和信号。
适用场景:实时更新界面(仪表盘、信息流、进度、聊天、协作编辑)、多浏览器共享同一状态、替代仅为喂 UI 而存在的 SPA+JSON API,以及已有 data-on:、data-signals:、datastar-patch-elements 的代码库。不适用:离线优先或重客户端计算、供非浏览器客户端消费的 JSON API、无交互的静态内容。
核心模式是 CQRS:一条长连接读流接收更新,多个短请求发送命令。读流永不返回,渲染后阻塞再渲染;写处理器不渲染,只改状态并返回 204,结果经流到达屏幕。协议只有两种事件:datastar-patch-elements 和 datastar-patch-signals,默认 outer 模式做 morph,可配 selector、mode(inner/replace/prepend/append/before/after/remove)、namespace、useViewTransition 等。
常用属性约 15 个,包括 data-init、data-on:click、data-bind、data-signals、data-text、data-show、data-class、data-attr、data-computed、data-effect、data-indicator、data-ref、data-ignore、data-ignore-morph、data-preserve-attr、data-json-signals。表达式是带 $name 信号插值的 JavaScript,动作以 @ 前缀(@get/@post/@put/@patch/@delete),请求携带 Datastar-Request: true 头及除 _ 前缀外的全部信号。长连接读流建议传 {openWhenHidden: true}。
后端支持 Python(datastar-py,uv add datastar-py,含 starlette、fastapi、django 等)和 Go(go get github.com/starfederation/datastar-go),也可手写协议。限制:服务端不可达时无内容可推;无障碍需自行负责;乐观更新不推荐。