Об этом проекте

GoSX — это веб-платформа на Go, которая рассматривает браузер как цель рендеринга, а не как среду выполнения. Она позволяет разработчикам объявлять компоненты `.gsx` с помощью строгого типизированного синтаксиса (`component Name(props: Type)`), который компилируется через настоящий конвейер компилятора. Серверные компоненты по умолчанию рендерятся в HTML, а интерактивные островки гидратируются через WebAssembly в общей виртуальной машине. Фреймворк не требует инструментария JavaScript на стороне приложения и не использует CGo, а также поддерживает небольшой бюджет зависимостей. Текущая версия — v0.57.1 (до 1.0), с критическими изменениями, описанными в CHANGELOG.md. ## Основные концепции - **Серверные компоненты**: функции Go, возвращающие HTML, рендерятся на сервере с нулевой стоимостью для клиента. - **Островки**: интерактивные поддеревья DOM с использованием сигналов и делегирования событий, компилируются в общую WASM-виртуальную машину с крошечными программами. - **Движки**: тяжелые клиентские вычисления (canvas, WebGL, WebGPU, фоновые воркеры) через выделенные WASM- или JS-бандлы. - **Хабы**: присутствие WebSocket, фан-аут, общее состояние и синхронизация CRDT. - **Действия**: серверные обработчики мутаций со структурированной валидацией. ## Ключевые особенности - **Типизированные компоненты**: пропсы — обычные структуры Go, объявленные в том же файле `.gsx`, поэтому компилятор Go ловит неизвестные поля или несовместимые значения. - **Строгая поверхность выражений**: небольшой, безопасный для рендерера набор выражений для полей пропсов (строки, булевы значения, целые числа, числа с плавающей точкой, прямые ссылки на поля). - **Распространение значений**: строгие компоненты принимают один `{...source}` спред с доказательством структурного типа. - **Островки**: поддержка сигналов, вычисляемых значений, обработчиков и композиции чистых view-компонентов (встраиваются во время компиляции). - **Устаревший синтаксис**: старая форма `func Name(props T) Node` всё ещё работает, но устарела; нетипизированные устаревшие компоненты будут удалены до v1.0. - **Маршрутизация на основе файлов**: маршруты обнаруживаются из каталога `app/` с макетами, вложенными маршрутами, динамическими сегментами, catch-all и группами маршрутов. - **Серверные модули**: подключение логики Go (загрузка данных, действия, метаданные) к страницам `.gsx` без работы с шаблонами. - **Конвейер компиляции**: парсится gotreesitter (чистая Go-реализация tree-sitter), понижается до IR с плоскими массивами, валидируется, затем рендерится или компилируется в программы островков. - **Реактивное состояние**: сигналы с мелкозернистой реактивностью; сигналы с префиксом `$` разделяются между островками на странице. - **Серверные функции**: сессии и аутентификация (HMAC-SHA256, AES-GCM, CSRF, magic-ссылки, OAuth 2.0, WebAuthn), действия с валидацией на уровне полей, кэширование (статическое, ревалидация, данные, ISR), навигация с мягкими переходами, стриминг через `ctx.Defer()` и `ctx.Suspense()`, оптимизация изображений/шрифтов, i18n-маршрутизация, слой контента (mdpp), реестр компонентов, макет текста, управляемое видео, motion, фоновый аудиомост YouTube, поверхности выполнения и интеграция Stripe. - **Движки**: программный интерфейс `engine.Config` / `ctx.Engine` для v1; модули — обычные 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).