浏览器运行时
这是 topcoat 和其他 Rust Web 框架最不一样的地方:不发 wasm,交互由一小段宏生成的 JavaScript 完成,需要服务端时再发一个请求、把返回的 HTML morph 进页面。上游把它标成「highly experimental」。topcoat-runtime 4.2k 行 Rust、grammar 3.0k 行,浏览器端 TypeScript 4.3k 行(不含测试),另有一个不发布的 coherence 测试 crate。两章,都是交互主线:
- $(...) 表达式:一份 Rust,两种执行:
expr!展开后的两个半边,捕获怎么统一转成Expr、为什么表达式里的 signal 读取不触发服务端重跑;支持的语法和类型子集;surrogate 两份替身;HTML 里留下的属性和注释;浏览器用new Function编译(CSP 需要'unsafe-eval');coherence 用 V8 对拍,6 条已知不一致,if里的return在无头 Chrome 里实测得到 2 而不是 1。 - 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"]
💬 关联讨论
发起讨论加载中...