这个项目能做什么

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)。