A WebAssembly framework to build GUI with Go, HTML and CSS.
It features:
- PWA support
- Build tool that removes the hassle of packaging wasm apps
- React flavored API
Requires Go 1.13
# Package sources + goapp CLI:
go get -u -v github.com/maxence-charriere/app/cmd/goapp
# Package sources only:
go get -u -v github.com/maxence-charriere/app/pkg/app
cd $GOPATH/src # go to your gopath sources (optional)
mkdir demo && cd demo # create and go to your go package
goapp init -v # init project layout
goapp run -v -b chrome # run the app and launch the main page on chromedemo
└── cmd
├── demo-server
│ ├── main.go
│ └── web
│ ├── style sheets...
│ ├── images...
│ └── etc...
└── demo-wasm
└── main.go- The
cmddirectory contains the project main applications. - The
demo-wasmdirectory contains the app that is compiled in wasm and that will run in the browser. - The
demo-serverdirectory contains the server that serves the wasm app and its resources. - The
webdirectory contrains the app resources like style sheets (css), images and other static resources.
Project layout can be initialized by running this command in the repository root.
goapp init -vThe app is the Go code compiled in web assembly and executed in the browser.
// cmd/demo-wasm/main.go
package main
import (
"log"
"github.com/maxence-charriere/app/pkg/app"
"github.com/maxence-charriere/app/pkg/log"
)
type Hello struct {
Name string
}
func (h *Hello) Render() string {
return `
<div class="Hello">
<h1>
Hello
{{if .Name}}
{{.Name}}
{{else}}
world
{{end}}!
</h1>
<input value="{{.Name}}" placeholder="What is your name?" onchange="Name" autofocus>
</div>
`
}
func main() {
app.Import(&Hello{})
app.DefaultPath = "/hello"
app.Run()
}The server serves the web assembly Go program and the other resources.
// cmd/demo-server/main.go
package main
import (
"log"
"net/http"
"github.com/maxence-charriere/app"
)
func main() {
http.Handle("/", &app.Handler{})
if err := http.ListenAndServe(":3000", nil); err != nil {
log.Fatal(err)
}
}The whole project can be built with the goapp CLI tool. goapp builds the server, the wasm app, imports the required javascript support file and puts the pieces together to provide a ready to use project.
# Get the goapp CLI tool:
go get -u github.com/maxence-charriere/app/cmd/goapp
# Builds a server ready to serve the wasm app and its resources:
goapp build -v
# Launches the server and app in the default browser:
goapp run -v -b defaultOnce built, the directory tree should look like:
demo
└── cmd
├── demo-server
│ ├── demo-server (server)
│ ├── main.go
│ └── web
│ ├── goapp.wasm (app)
│ ├── wasm_exec.js
│ ├── images...
│ └── etc...
└── demo-wasm
└── main.goSee a full example.
| Platform | Chrome | Edge | Firefox | Safari |
|---|---|---|---|---|
| Desktop | ✔ | ✔* | ✔ | ✔ |
| Mobile | ✔ | ✔ | ✔ | ✔ |
Issues:
- Non Chromiun based Edge does not support
TextEncoderwhich is used by the javascript support file provided by Go.
