用途
backend-realtime 是一个用于在应用中实现实时功能的技能,覆盖 WebSocket、Supabase Realtime 与 Server-Sent Events(SSE)三种传输方式。资料说明其适用于实时、实时更新、WebSocket、通知等场景。
自由度
该技能标记为 MIXED:选择哪种传输方式与事件设计属于高自由度;既有订阅探测与卸载清理属于低自由度,须严格照做。
推理方式
资料给出的推理流程为:观察现有频道、socket、hook 与清理逻辑;判断是新建订阅、复用还是传输不匹配;分类为 postgres-changes、presence、broadcast、SSE 或乐观更新;严重程度方面,泄漏或重复订阅优先于缺少打字指示器。
主要能力
Supabase Realtime:可订阅数据库变更,使用 postgres_changes 监听 INSERT 等事件并按 filter 过滤;Presence 用于在线用户,每个房间一个频道,在状态为 SUBSCRIBED 后 track 当前用户,通过 presenceState() 读取名单,清理时先 untrack 再 removeChannel;Broadcast 用于自定义事件(如光标、打字),频道存于 useRef,广播是瞬时的,不作为事实来源,需要持久化的内容应使用 postgres_changes。
TanStack Query + 实时:保留 useQuery 作为数据源,实时频道只调用 queryClient.invalidateQueries({ queryKey }),可对表以 event: '*' 订阅,统一封装为一个 hook。
乐观更新:使用 useOptimistic 与 useTransition,以 pending: true 和 crypto.randomUUID() 的 id 添加乐观行,等待 Server Action;待处理行降低透明度渲染,提交按钮在 isPending 期间禁用。
Server-Sent Events(SSE):路由处理器返回 ReadableStream,用 TextEncoder 写出 data: 帧,设置 text/event-stream、Cache-Control: no-cache、Connection: keep-alive 头,每 30 秒心跳;在 request.signal abort 时清理。客户端用 EventSource,在清理和 onerror 时关闭并以退避重连。若数据已在 Postgres 中则选择 Realtime,否则单向推送可选 SSE。
打字指示器:按键时广播 typing 事件,收到时忽略自身 id,3 秒无输入后移除,发送用 timeoutRef 去抖。
使用方式
资料强调在实现任何实时功能前先检查已有实时设置,包括在 package.json 中查找 socket、realtime、pusher、ably,检索源码中的 channel、subscribe、WebSocket,检查 Supabase 配置与 .env 变量名(只列名称,不打印值)。原因是实时连接是有状态的,不应创建重复订阅。
验证
实现后需按低自由度清单验证:断连重连与状态显示、实时不可用时的优雅降级、卸载时清理全部订阅、同一事件无多个监听器、乐观更新的瞬时体验与冲突处理、移动端弱网与省电。
限制
资料中的代码示例假定 Next.js App Router + Supabase 技术栈,需按实际检测到的栈调整导入路径与行类型。资料未提供收费、价格、平台或效果方面的信息。