// 走遍美国 · 英语精听 PWA —— go-app 装配入口(T-001 最小可运行骨架)。 // // 同一份代码两处运行: // - 编译成 wasm 在浏览器跑(app.RunWhenOnBrowser) // - 编译成普通二进制在服务器跑(http.Server + app.Handler) // // 构建: // // GOOS=js GOARCH=wasm go build -o web/app.wasm # 前端 // go build -o bin/lingo # 后端 package main import ( "log" "net/http" "github.com/maxence-charriere/go-app/v10/pkg/app" ) // home 是根页面组件,目前仅是最小占位骨架。 type home struct { app.Compo } // Render 渲染最小首页,验证 go-app 骨架可运行。 func (h *home) Render() app.UI { return app.Div(). Style("font-family", "system-ui, -apple-system, sans-serif"). Style("max-width", "440px"). Style("margin", "0 auto"). Style("padding", "3rem 1.5rem"). Body( app.H1().Text("走遍美国 · 精听"), app.P(). Style("color", "#6b6b6b"). Text("Family Album, U.S.A. — go-app 骨架已就绪(T-001)。"), ) } // init 注册前端路由。放在 init 而非 main,确保服务器(渲染 app shell)、 // 浏览器 wasm 入口、以及测试三处都能看到路由——go-app 的 Handler 只为 // 已注册的路由返回 app shell,未注册的路径会 404。 func init() { app.Route("/", func() app.Composer { return &home{} }) } // newHandler 构造服务器端的 go-app Handler,提供 app shell、wasm 与静态资源 // (默认从 web/ 目录读取 app.wasm)。抽出为函数以便测试。 func newHandler() *app.Handler { return &app.Handler{ Name: "走遍美国精听", ShortName: "精听", Description: "基于「走遍美国」的英语精听 PWA", Lang: "zh", } } func main() { // 浏览器侧:启动 go-app(此调用在 wasm 之外无副作用)。 app.RunWhenOnBrowser() // 服务器侧。 http.Handle("/", newHandler()) const addr = ":8000" log.Printf("serving on http://localhost%s", addr) if err := http.ListenAndServe(addr, nil); err != nil { log.Fatal(err) } }