这个项目能做什么
GoSX 是一个 Go 原生的 Web 平台,将浏览器视为渲染目标而非运行时。它允许开发者使用严格的类型化语法(`component Name(props: Type)`)声明 `.gsx` 组件,该语法通过真实的编译器流水线进行编译。服务器组件默认渲染为 HTML,而交互式孤岛通过共享虚拟机中的 WebAssembly 进行水合。该框架无需应用端 JavaScript 工具链,也无需 CGo,并保持较小的依赖预算。
当前版本为 v0.57.1(1.0 之前),破坏性变更记录在 CHANGELOG.md 中。
## 核心概念
- **服务器组件**:返回 HTML 的 Go 函数,在服务器端渲染,客户端零成本。
- **孤岛**:使用信号和事件委托的交互式 DOM 子树,编译为共享 WASM 虚拟机,程序负载极小。
- **引擎**:通过专用 WASM 或 JS 包处理重型客户端计算(画布、WebGL、WebGPU、后台工作线程)。
- **中心**:WebSocket 存在性、扇出、共享状态和 CRDT 同步。
- **操作**:具有结构化验证的服务器端变更处理程序。
## 关键特性
- **类型化组件**:属性是在同一 `.gsx` 文件中声明的普通 Go 结构体,因此 Go 编译器能捕获未知字段或不兼容值。
- **严格表达式表面**:用于属性字段的小型、渲染器安全的表达式集(字符串、布尔值、整数、浮点数、直接字段引用)。
- **展开值**:严格组件接受一个带有结构类型证明的 `{...source}` 展开。
- **孤岛**:支持信号、计算值、处理程序和纯视图组件的组合(在编译时内联)。
- **旧语法**:较旧的 `func Name(props T) Node` 形式仍可用但已弃用;无类型旧组件将在 v1.0 之前移除。
- **基于文件的路由**:从 `app/` 目录发现路由,支持布局、嵌套路由、动态段、通配符和路由组。
- **服务器模块**:将 Go 逻辑(数据加载、操作、元数据)连接到 `.gsx` 页面,无需接触模板。
- **编译流水线**:由 gotreesitter(纯 Go 的 tree-sitter 重新实现)解析,降级为扁平数组 IR,验证后渲染或编译为孤岛程序。
- **响应式状态**:具有细粒度响应性的信号;`$` 前缀信号在页面上的孤岛间共享。
- **服务器特性**:会话和认证(HMAC-SHA256、AES-GCM、CSRF、魔法链接、OAuth 2.0、WebAuthn)、带字段级验证的操作、缓存(静态、重新验证、数据、ISR)、带软过渡的导航、通过 `ctx.Defer()` 和 `ctx.Suspense()` 的流式传输、图像/字体优化、i18n 路由、内容层(mdpp)、组件注册表、文本布局、托管视频、动效、YouTube 背景音频桥接、运行时表面和 Stripe 集成。
- **引擎**:面向 v1 的程序化 `engine.Config` / `ctx.Engine` 表面;模块是普通的 Go WASM 程序。
## 哲学
- 浏览器是渲染目标;JavaScript 按功能选择加入。
- 一种语言(Go)带有显式浏览器编译器;无需 Node、npm、webpack 或打包器配置。
- 无 CGo;所有包编译为 WASM 并干净地交叉编译。
- 原语而非框架中的框架;强制执行五种不同的执行原语。
- 按使用付费;静态页面是静态的,孤岛仅在需要时提供。
- 热路径中无隐藏魔法;编译器流水线可检查。
- 小依赖预算作为设计约束。
## 快速开始
```bash
gosx init my-app
cd my-app
go run .
```
或搭建文档模板:
```bash
gosx init my-docs --template docs
cd my-docs
go run .
```
无 CLI 的最小服务器:
```go
package main
import (
"m31labs.dev/gosx"
"m31labs.dev/gosx/server"
)
func main() {
app := server.New()
app.Page("/", func(ctx *server.Context) gosx.Node {
return gosx.El("h1", gosx.Text("Hello from GoSX"))
})
app.ListenAndServe(":8080")
}
```
## 示例组件
```gsx
package app
import "m31labs.dev/gosx/signal"
type GreetingProps struct {
Name string
}
component Greeting(props: GreetingProps) {
return <div class="greeting">
<h1>Hello, {props.Name}!</h1>
<p>Welcome to GoSX.</p>
</div>
}
type CounterProps struct {
Initial int
}
//gosx:island
component Counter(props: CounterProps) {
count := signal.New(props.Initial)
increment := func() { count.Set(count.Get() + 1) }
decrement := func() { count.Set(count.Get() - 1) }
return <div class="counter">
<button onClick={decrement}>-</button>
<span>{count.Get()}</span>
<button onClick={increment}>+</button>
</div>
}
```
## 代理技能
对于帮助用户使用 GoSX 的代理,规范技能是 [using-gosx](https://github.com/odvcencio/m31labs-skills/blob/main/skills/using-gosx/SKILL.md)。对于原生移动、编辑器、管理后台和 CMS 外围,请参阅 [using-gosx-ecosystem](https://github.com/odvcencio/m31labs-skills/blob/main/skills/using-gosx-ecosystem/SKILL.md)。
评论
0 人表达喜爱 · 满10人后显示 Deer Point
登录后参与讨论。