尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Topcoat 集成 Datastar 完整指南:SSE 推送元素与信号补丁,3 步搞定实时页面更新

Topcoat 集成 Datastar 完整指南:SSE 推送元素与信号补丁,3 步搞定实时页面更新 Topcoat 集成 Datastar 完整指南SSE 推送元素与信号补丁3 步搞定实时页面更新【免费下载链接】topcoatA batteries-included framework for building web apps项目地址: https://gitcode.com/GitHub_Trending/top/topcoatTopcoat 是一款面向 Rust 的全栈 Web 框架内置 Datastar 集成能力通过服务器发送事件SSE向浏览器推送 HTML 元素补丁与信号signals更新无需手动搭建 API 层即可实现服务端驱动的实时交互。为什么选择 Topcoat Datastar传统方案里页面交互要么写大量 JavaScript要么每次操作都整页刷新。Topcoat 的 Datastar 集成走了一条中间路线前端极轻页面上只写data-*属性get/post等动作会自动把页面信号发送到服务器后端全权所有逻辑用 Rust 编写服务器返回补丁事件浏览器只负责把补丁应用到页面天然适配 SSE基于 Topcoat 路由器的Sse响应支持长连接实时推送、断线重连续传Last-Event-ID与心跳保活核心实现在 crates/topcoat-datastar/src/lib.rs整体文档见 crates/topcoat/docs/datastar.md。三步完成 Datastar 集成第一步启用 datastar 功能特性在Cargo.toml中打开datastar特性即可它会同时启用路由器的 SSE 能力[dependencies] topcoat { version 0.6.2, features [datastar] }第二步在页面加载 Datastar 客户端脚本Datastar 本身是一个小型浏览器端脚本页面必须加载它之后data-*属性才会生效。可以直接引用 CDN也可以把它当作 Topcoat 资源自托管script typemodule src(asset!(https://cdn.jsdelivr.net/gh/starfederation/datastar1.0.2/bundles/datastar.js)) /script第三步用 Signals 提取器读取页面信号Datastar 的每个动作请求都会自动携带页面当前信号GET 请求放在datastar查询参数里其他请求作为 JSON 请求体发送。SignalsT提取器从两处都能读取并直接反序列化进你的 Rust 类型代码见 crates/topcoat-datastar/src/signals.rs#[route(POST /increment)] async fn increment(Signals(counter): SignalsCounter) - ResultPatchSignals { PatchSignals::json(Counter { count: counter.count 1 }) } 小技巧把提取器包进Option即OptionSignalsT同一个端点就能同时兼容来自 Datastar和普通请求两种情况——datastar_request辅助函数可以直接从请求头判断来源实现位于 crates/topcoat-datastar/src/request.rs。四种推送方式把更新打补丁到页面1️⃣ PatchElements补丁 HTML 元素PatchElements把一段 HTML 补丁进页面 DOM。默认按元素的id属性匹配并做 morph 合并也可以用selector指定 CSS 选择器用mode控制应用方式实现见 crates/topcoat-datastar/src/patch_elements.rs#[route(POST /entries)] async fn create(cx: Cx) - ResultPatchElements { let entry view! { liA new entry/li }?; Ok(PatchElements::new(entry.render(cx)) .selector(#feed) .mode(ElementPatchMode::Prepend)) }补丁模式共 8 种完整定义在 crates/topcoat-datastar/src/patch_mode.rs模式效果Outer合并整个元素默认Inner合并元素内部 HTMLReplace整体替换旧元素Prepend/Append插入为首个子元素 / 末个子元素Before/After插入到元素之前 / 之后Remove从页面删除匹配元素还支持use_view_transition(true)让补丁过程带过渡动画以及id/retry支撑 SSE 断线重连。2️⃣ PatchSignals补丁浏览器信号PatchSignals更新的是浏览器里的信号存储而非 DOM。载荷是一个 JSON 对象会与现有信号合并把某个信号设为null即删除它实现见 crates/topcoat-datastar/src/patch_signals.rslet patch PatchSignals::json(Progress { percent: 80 })?;加上only_if_missing(true)后补丁就只填充尚不存在的信号不会覆盖页面已有值——非常适合做主题色这类初始默认值。3️⃣ ExecuteScript让浏览器执行一段 JSExecuteScript本质上是一个往body追加script的PatchElements默认执行完自动从页面移除自身实现见 crates/topcoat-datastar/src/execute_script.rslet script ExecuteScript::new(console.log(saved));4️⃣ 响应头 Responders普通响应也能打补丁简单的请求-响应场景根本不需要事件流Datastar 同样会把普通的text/html响应补丁进 DOM、把application/json响应合并进信号。只需在返回元组里放一个 responder 设置对应响应头实现见 crates/topcoat-datastar/src/response.rsResponder作用DatastarSelector指定 HTML 响应匹配哪个 CSS 选择器DatastarMode指定补丁模式如InnerDatastarUseViewTransitionHTML 响应使用视图过渡动画DatastarOnlyIfMissingJSON 响应只补丁缺失的信号DatastarScriptAttributes为 JS 响应设置 script 标签属性#[route(POST /save)] async fn save() - Result(DatastarSelector, DatastarMode, View) { let status view! { pSaved!/p }?; Ok((DatastarSelector::from(#status), DatastarMode(ElementPatchMode::Inner), status)) }SSE 流式推送实现进度条等实时更新对于进度条、实时消息流这类持续更新场景返回Sse流即可每个补丁通过Into转换成 SSEEvent#[route(GET /progress)] async fn progress() - ResultSseimpl StreamItem ResultEvent use { let events stream::iter((0..100u8).step_by(20).map(|percent| { PatchSignals::json(Progress { percent }).map(Into::into) })); Ok(Sse::new(events).keep_alive(KeepAlive::new())) }页面上只需一行属性即可订阅div>资料路径集成总览文档crates/topcoat/docs/datastar.md功能入口与特性开关crates/topcoat-datastar/src/lib.rs信号提取器crates/topcoat-datastar/src/signals.rs元素补丁crates/topcoat-datastar/src/patch_elements.rs信号补丁crates/topcoat-datastar/src/patch_signals.rs脚本执行事件crates/topcoat-datastar/src/execute_script.rs响应头常量crates/topcoat-datastar/src/header.rs写在最后Topcoat 的 Datastar 集成把服务器驱动页面更新这件事做到了开箱即用Signals负责读、PatchElements/PatchSignals/ExecuteScript负责写、SSE 负责持续推送普通响应还能靠 responder 头零成本接入。想要本地跑起来看看效果可以克隆仓库git clone https://gitcode.com/GitHub_Trending/top/topcoat对新手来说这是一条从写 HTML平滑过渡到全栈 Rust 实时应用的低门槛路径 【免费下载链接】topcoatA batteries-included framework for building web apps项目地址: https://gitcode.com/GitHub_Trending/top/topcoat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表