3 分•作者: derstruct•4 个月前
Doors:基于服务器驱动的 UI 框架 + 运行时,用于使用 Go 构建有状态的、响应式 Web 应用程序。
一些亮点:
* 在服务器端 Go 中实现前端框架功能。响应式状态原语、动态路由、可组合组件。
* 没有公共 API 层。无需设计端点,私有临时传输在后台处理。
* 统一的控制流程。无需在后端/前端之间切换上下文。
* 集成 Web 堆栈。捆绑资产、构建脚本、提供私有文件、自动化 CSP,并打包成一个二进制文件。
工作原理:
Go 服务器是 UI 运行时:Web 应用程序在有状态的服务器上运行,而浏览器充当远程渲染器和输入层。
安全模型:
每个用户只能与其呈现给他们的内容交互。这意味着您在渲染按钮时检查权限,这足以确保相关操作不会被其他人触发。
思维模型:
将 DOM 链接到它所依赖的数据。
局限性:
* 对于静态的非交互式网站、具有简单路由的客户端优先应用程序没有意义,也不适用于离线 PWA。
* 负载均衡和无用户中断的发布需要使用有状态服务器的不同策略(已包含简化机制)。
最适合的应用场景:
具有繁重用户流程和复杂业务逻辑的应用程序。单个执行上下文和没有 API/端点权限管理负担使其更容易。
特点:
* 专门构建了 [Go 语言扩展](<https://github.com/doors-dev/gox>),具有自己的 LSP、解析器和编辑器插件。将 HTML 添加为 Go 表达式和 `elem` 原语。
* 自定义并发引擎,支持非阻塞事件处理、并行渲染和树感知状态传播。
* 支持 HTTP/3 的同步协议(滚动请求 + 流式传输,通过常规发布事件,无 WebSockets/SSE)。
来自作者(我):
我花了 1 年零 9 个月的时间才达到这个阶段。我重写了该框架 6 或 7 次,直到每个部分都一致,每个决定都感觉正确或是一个合理的妥协。我对自己的工作非常挑剔,我看到了缺陷,但总的来说它很扎实,我喜欢作为用户的开发者体验。思维模型需要一些预先的思考,但通过显式代码和可预测的结果得到了回报。
代码示例:
```go
type Search struct {
input doors.Source[string] // 响应式状态
}
elem (s Search) Main() {
<input
(doors.AInput{
On: func(ctx context.Context, r doors.RequestInput) bool {
s.input.Update(ctx, r.Event().Value) // 响应式状态
return false
},
})
type="text"
placeholder="search">
// 订阅结果到状态变化
~(doors.Sub(s.input, s.results))
}
elem (s Search) results(input string) {
~(for _, user := range Users.Search(input) {
<card>
~(user.Name)
</card>
})
}
```