Rust in Everything
基于 topcoat-runtime 0.10.0

浏览器运行时

这是 topcoat 和其他 Rust Web 框架最不一样的地方:不发 wasm,交互由一小段宏生成的 JavaScript 完成,需要服务端时再发一个请求、把返回的 HTML morph 进页面。上游把它标成「highly experimental」。topcoat-runtime 4.2k 行 Rust、grammar 3.0k 行,浏览器端 TypeScript 4.3k 行(不含测试),另有一个不发布的 coherence 测试 crate。两章,都是交互主线:

  1. $(...) 表达式:一份 Rust,两种执行:expr! 展开后的两个半边,捕获怎么统一转成 Expr、为什么表达式里的 signal 读取不触发服务端重跑;支持的语法和类型子集;surrogate 两份替身;HTML 里留下的属性和注释;浏览器用 new Function 编译(CSP 需要 'unsafe-eval');coherence 用 V8 对拍,6 条已知不一致,if 里的 return 在无头 Chrome 里实测得到 2 而不是 1。
  2. signal、shard 与 procedure:配置四件套;signal 的 id、恢复与 dep 标记;无头 Chrome 里一整套交互对应的服务端请求序列;页面重跑是被 RuntimeLayer 改写成 GET 的 POST;shard 和 procedure 各有端点、不经过页面守卫(curl 直接拿到「需要登录」的 shard 内容);WebSocket 协议、可改的三个头、Origin 检查和并发上限。
flowchart TB
  expr["$(...):Rust 半边 + JS 半边"] --> html["HTML:data-topcoat-on、data-topcoat-bind、expr 注释"]
  html --> browser["浏览器:new Function、surrogate 类、响应式"]
  browser -->|"只读表达式里的 signal"| local["本地重算"]
  browser -->|"tracked signal、shard 参数"| server["POST 页面或 shard 端点、WebSocket run"]
  browser -->|"await procedure"| proc["POST procedure 端点"]
  server --> morph["NDJSON 帧,morph 进 DOM"]

💬 关联讨论

发起讨论
加载中...