Об этом проекте
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).
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.