文章摘要
Cloudflare推出Cap'n Web,这是一款基于TypeScript的RPC系统,专为浏览器和服务器设计。它继承了Cap'n Proto的对象能力协议特性,但无需模式定义,直接使用JSON序列化,支持HTTP、WebSocket等多种传输方式,兼容主流浏览器和JavaScript运行环境,简化了开发流程。
文章总结
Cap'n Web:面向浏览器与Web服务器的新型RPC系统
Cloudflare近日开源了Cap'n Web,这是一款纯TypeScript实现的RPC协议。作为Cap'n Proto的"精神继承者",它专为现代Web生态设计,具有以下核心特性:
核心优势
- 无模式设计:无需定义接口模板,可直接调用远程方法,类似Cloudflare Workers原生RPC系统
- 双向调用能力:支持客户端与服务器相互调用,可传递函数和对象引用
- 极简实现:基于JSON序列化,压缩后体积小于10KB,无第三方依赖
- 多协议支持:原生兼容HTTP、WebSocket和postMessage(),可扩展其他传输方式
- 类型安全:完美集成TypeScript,提供端到端类型检查
技术亮点
对象能力模型:
- 支持Promise级联调用,链式操作仅需单次网络往返
- 内置安全模式:通过
authenticate()等模式实现天然权限控制 - 示例:服务器可返回包含方法的会话对象,客户端无法伪造
开发体验: ```typescript // 客户端示例 let api = newWebSocketRpcSession("wss://example.com/api"); let result = await api.hello("World");
// 服务端实现(Cloudflare Workers)
class MyApiServer extends RpcTarget {
hello(name) { return Hello, ${name}! }
}
```
- 批处理模式:
typescript let batch = newHttpBatchRpcSession("https://example.com/api"); let [res1, res2] = await Promise.all([ batch.getUser(1), batch.getUser(2) ]);
与GraphQL对比
| 特性 | Cap'n Web | GraphQL | |---------------|-------------------------|-----------------------| | 协议层 | JavaScript原生 | 专用查询语言 | | 组合性 | 支持方法链式调用 | 声明式查询 | | 学习曲线 | 沿用JS开发习惯 | 需要学习新语法 | | 数组处理 | 支持服务端map操作 | 依赖片段(fragments) |
底层实现
- 采用JSON扩展序列化,通过
["type", params]格式处理特殊类型 - 对称协议设计:通过导出表/导入表管理对象引用
- 消息类型:
push:发起RPC调用pull:请求返回结果resolve/reject:返回执行结果
目前该项目已应用于Cloudflare Wrangler的远程绑定功能,开发者可通过MIT许可证自由使用。
提示:该技术特别适合需要实时协作的Web应用,以及需要复杂安全边界建模的场景。由于尚处实验阶段,建议对前沿技术有包容心的团队尝试。
评论总结
以下是评论内容的总结:
1. 对Cap'n Web的积极评价
- 简化与兼容性:认为Cap'n Web作为Cap'n Proto RPC的简化版,希望其特性能够反向兼容到其他语言(如C++)。(评论1)
- "it would be amazing if eventually the simplification traveled back to all the languages"
- 实用性与模式认可:认为该模式实用,类似自己重复构建的解决方案,如浏览器中worker-page通信或Chrome扩展脚本间通信。(评论3)
- "I’ve ended up building similar things over and over again"
2. 与OCapN的比较
- 功能差异:指出Cap'n Web缺少OCapN的第三方交接(third-party handoffs)和离线能力(sturdyrefs),更适合传统客户端-服务器SaaS场景。(评论2)
- "Cap'n web lacks out-of-band capabilities"
- "Cap'n Web is more for traditional client-server SaaS"
3. 技术细节讨论
- 双向通信与回调:支持通过引用传递函数和对象,实现双向调用,比JSON RPC更完善。(评论13, 14)
- "Supports passing functions by reference... This is how bidirectional calling happens"
- "The part that’s most exciting to me is actually the bidirectional calling"
- 性能与RTT疑问:澄清“单次往返”指多个客户端消息对应一个服务器响应,而非单次请求-响应。(评论6)
- "1 server message in response to potentially many client messages"
4. 对无模式(schemaless)的质疑
- 模式必要性:质疑无模式设计的实际意义,认为协议仍需处理类型和演化问题。(评论11, 16)
- "can’t fundamentally eschew schema/types"
- "Having a well defined schema is one of the things I like about tRPC"
5. 安全性与实现疑问
- 安全问题:担心无模式设计结合弱类型语言可能导致安全隐患,如客户端传递恶意回调对象。(评论18)
- "are there security issues with no schemas + callback stubs"
- 状态管理:质疑是否需要有状态服务器维护导入/导出表,或支持多服务器场景。(评论17)
- "require a stateful server to hold on to the import and export tables"
6. 其他语言支持与生态
- 多语言支持:询问是否支持其他语言后端(如Rust),以及实现难度。(评论9)
- "would be neat if Rust could support this on the backend"
- 与Cloudflare Workers的兼容性:关注Cap'n Web与Cloudflare Workers的功能对齐及未来同步计划。(评论10)
- "do you think once the two reach parity, that that parity will remain"