Visitar URL original
GitHub - maxence-charriere/go-app: A package to build progressive web apps with Go programming language and WebAssembly. · GitHub
Skip to content
maxence-charrierePublic

About

A package to build progressive web apps with Go programming language and WebAssembly.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

9.0k stars

Watchers

139 watching

Forks

Repository files navigation

GitHub actions GitHub release pkg.go.dev docs Twitter URL

Go-app is a package for building progressive web apps (PWAs) with Go and WebAssembly (Wasm).

Write your UI in Go using reusable components and a declarative syntax. Handle user interactions in Go and serve your app with the standard net/http package.

Apps built with go-app are SEO-friendly and support offline use. On supported browsers and devices, users can install your app and run it in its own window.

Documentation (built with go-app)

go-app documentation

Install

Requires Go 1.26 or newer.

From your project directory, initialize a Go module if you do not already have one. Replace example.com/myapp with your module path:

go mod init example.com/myapp

Add go-app to your project:

go get github.com/maxence-charriere/go-app/v11/pkg/app

Components

Describe your UI with Go functions using go-app's declarative syntax. Each component embeds app.Compo and defines a Render method that returns its UI.

Create a main.go file with the following component, then add the main function from the next section. The component displays a greeting that updates as you type your name:

package main

import (
	"log"
	"net/http"

	"github.com/maxence-charriere/go-app/v11/pkg/app"
)

type hello struct {
	app.Compo

	name string
}

func (h *hello) Render() app.UI {
	return app.Div().Body(
		app.H1().Body(
			app.Text("Hello, "),
			app.If(h.name != "", func() app.UI {
				return app.Text(h.name)
			}).Else(func() app.UI {
				return app.Text("World!")
			}),
		),
		app.Input().
			Type("text").
			Value(h.name).
			Placeholder("What is your name?").
			AutoFocus(true).
			OnInput(h.ValueTo(&h.name)),
	)
}

Serving the app

Serve your app with Go's standard net/http package. The app.Handler type implements http.Handler and can be used with an existing Go server.

Add this function to main.go to register the component at / and serve the app on port 8000:

func main() {
	// Register the component.
	app.Route("/", func() app.Composer { return &hello{} })

	// Start the app in the browser; on the server, continue below.
	app.RunWhenOnBrowser()

	// Serve the app over HTTP.
	http.Handle("/", &app.Handler{
		Name:        "Hello",
		Description: "A Hello World example",
	})

	if err := http.ListenAndServe(":8000", nil); err != nil {
		log.Fatal(err)
	}
}

Build and run

From your project directory, build the WebAssembly app and the server, then run the server:

mkdir -p web
GOOS=js GOARCH=wasm go build -o web/app.wasm
go build -o server
./server

Open localhost:8000 in your browser. After changing the code, rebuild both binaries and restart the server.

Getting started

Follow the Getting Started guide to build and run your first app.

Built with go-app

  • Murlok: World of Warcraft character builds and guides.
  • GoApp Docs: The documentation website, built with go-app.
  • liwasc: Network discovery, port scanning, and Wake-on-LAN.

Support the project

If go-app is useful to you, consider sponsoring its development.

About

A package to build progressive web apps with Go programming language and WebAssembly.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

9.0k stars

Watchers

139 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages