使用Golang作为前端框架的实践与探讨
使用Golang作为前端框架的实践与探讨 你好,
我想学习Go语言,但我发现它无法像JavaScript那样作为全栈语言使用。我可以构建后端,但之后又不得不转向React、Vue等框架来构建前端。
或者,
是否存在一个实际的工具,可以让人用Go语言来构建全栈(前端+后端)的Web应用?有没有一个完全使用Go语言构建的优秀Web应用示例?
谢谢。
Go 在后端开发方面表现出色,但并非专为前端工作而设计。
更多关于使用Golang作为前端框架的实践与探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可用的框架列表很长,根据你的经验,有没有一个特定的工具可以推荐,哪个更好,谢谢
嗨 @Sibert
在你的Go应用之上构建了漂亮的用户界面/用户体验。我想知道是否可以用它来创建一个带有博客和评论功能的网站,让用户可以登录、评论并管理评论。例如,使用Facebook、Google或自定义注册等方式进行评论等。对于一个初学者,你有什么推荐吗?
谢谢
johnk: 是否有一个实际可用的工具,可以用来构建全栈(前端+后端)的Go语言Web应用?有没有一个完全使用Go构建的优秀Web应用示例?
我尝试过用Go进行前端和后端开发。虽然还是个新手,但你可以在这里查看我最近的尝试。没有使用额外的框架,只用了标准的Go。
在我看来,你已经下定决心了 :-)。Node(或 Nextjs)/ React 是一个非常流行的组合。Go 的 Web 部分没有那么成熟,但尽管如此,我认为 Go 将是我的选择。在这两种环境中都创建一个小型测试站点(Hello World +),这将帮助你做出选择。没有其他人能给你一个正确的答案。这是一个个人偏好问题。
我选择 Go 的原因是它超越了 Web 前端的能力。
漂亮的用户界面/用户体验构建在你的Go应用之上。
谢谢!使用纯HTML、CSS和Javascript。Go代码只有大约10 MB。没有框架。没有依赖。我以前用过PHP、Drupal和WordPress。但我确实喜欢Go的模板和子模板。其速度和简洁性是我迄今为止体验到的最好的。
我在想我是否可以创建一个带有博客和评论功能的网站,让用户可以登录、评论和管理评论。
当然这是可能的,但使用Go可能需要一些时间。使用现成的WordPress解决方案,你可以在几天内就搭建并运行起来。
一个用于使用 Go 和 WebAssembly 构建渐进式 Web 应用的包 | GitHub
这真是一个非常详细的回复,我发现了一些以前不知道存在的新工具。我对 Go 语言产生兴趣,是因为听说它既能覆盖前端也能覆盖后端。
我应该使用像这样的工具吗?
GitHub - gin-gonic/gin: Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架…
Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。它具有类似 Martini 的 API,但性能更好——高达 40 倍。如果你需要惊人的性能,那就来点 Gin 吧。- …
我的论点是:如果我需要用 React/Next.js 构建前端,为什么不直接用 Node 构建后端,而非要用 Go 呢?这样只需要管理一种资源类型(JS),管理和学习起来不是容易得多吗?
Go 语言会在不久的将来成为一种全栈语言吗?还是说,如果我想要一种统一的前端/后端语言,就应该放弃 Go 呢?
谢谢
GitHub - maxence-charriere/go-app: 一个使用Go编程语言和WebAssembly构建渐进式Web应用的包…
一个使用Go编程语言和WebAssembly构建渐进式Web应用的包。- GitHub - maxence-charriere/go-app: 一个使用Go编程语言和WebAssembly构建渐进式Web应用的包…
GitHub - avelino/awesome-go: 一个精心策划的Go框架、库和软件列表,…
一个精心策划的Go框架、库和软件列表 - GitHub - avelino/awesome-go: 一个精心策划的Go框架、库和软件列表
Gin 框架
Gin 是一个优秀的 Web 框架,但它不处理前端 (据我所知,至少目前如此),所以这部分需要你自己处理。这意味着你仍然需要用 JavaScript 来处理前端。
顺便提一下,如果你在寻找能处理更多前端工作的 Web 框架,可以看看 Buffalo。但即便如此,你可能还是需要编写 JavaScript。
Go 会成为“全栈”语言吗?
我无法代表 Go 团队发言。
不过,我可以做一些推测。根据过去十多年的观察,我估计 Go 团队有计划优化 Go 用于前端开发的可能性不到 1%,除非是为了支持 WebAssembly。
当然,我也可能是错的!
为什么使用 Go 而不是 Node?
为什么要用不同的语言构建后端和前端?因为这让你能为每项工作选择最合适的工具。
使用 Go,你可以获得编译后的单一可执行文件,便于部署,并且在大多数情况下执行速度更快。你还能获得类型安全,这是 JavaScript 所不具备的 (尽管你可以通过 TypeScript 获得)。
避免依赖地狱
此外,在 GoLang 中,你完全不会遇到像在 Node 中那样严重的依赖地狱问题;没有包含无数文件和目录的 node_modules 目录 (我有点夸张了。嗯,只夸张了一点点):

Go 团队一位成员的这篇博客文章详细解释了为什么 Node 的依赖管理如此成问题,以及为什么 GoLang 在这方面要好得多 (注意:请阅读整篇文章,而不仅仅是标题,因为只看标题可能会让你对问题的本质产生误解。)。
萝卜青菜,各有所爱
但就像 Sibert 说的,听起来你已经知道自己想要什么了,那就是选择某种形式的 JavaScript。如果使用同一种语言对你来说最重要,那就去做吧。归根结底,两种方法都能让你创建网站;最适合你的方法就是最好的方法。
但我可以说——在从事了 20 多年的 Web 开发之后——我真的很享受用 Go 编码,而处理 JavaScript,尤其是 Node,对我来说一直很痛苦。以至于在过去的一年里,我决定专注于后端开发 (以及 DevOps),所以我基本上不再做前端开发了。
对我来说,现在的生活美好多了!而且薪水也高了很多。 🙂
所以,选择权在你手中。Sibert 和我一起回答了你的问题,并为你提供了足够的信息;现在该你做决定了。
附言:第三个选择
但在你决定之前,你或许可以考虑第三个选项。在我看来,它不如 Go 在后端那么出色,但比处理 JavaScript 和 Node 要好:
#仅供参考
再次希望这对你有所帮助。
在Go语言中构建全栈Web应用是可行的,主要通过两种方式实现:服务端渲染(SSR)和WebAssembly(WASM)。以下是具体实践和示例:
1. 服务端渲染(SSR)方案
使用标准库html/template或第三方框架如templ进行服务端渲染:
// 使用标准库示例
package main
import (
"html/template"
"net/http"
)
func main() {
tmpl := template.Must(template.ParseFiles("layout.html"))
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
data := struct {
Title string
Message string
}{
Title: "Go全栈应用",
Message: "这是Go渲染的页面",
}
tmpl.Execute(w, data)
})
http.ListenAndServe(":8080", nil)
}
2. WebAssembly方案
将Go编译为WASM在前端运行:
// main_wasm.go
package main
import (
"syscall/js"
)
func main() {
document := js.Global().Get("document")
h1 := document.Call("createElement", "h1")
h1.Set("innerHTML", "Go WASM前端")
document.Get("body").Call("appendChild", h1)
// 保持Go程序运行
select {}
}
编译命令:
GOOS=js GOARCH=wasm go build -o main.wasm main_wasm.go
3. 完整全栈框架示例
使用go-app框架构建同构应用:
package main
import (
"net/http"
"github.com/maxence-charriere/go-app/v9/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 != "",
app.Text(h.name),
).Else(
app.Text("World"),
),
),
app.Input().
Value(h.name).
Placeholder("输入姓名").
AutoFocus(true).
OnChange(h.OnInputChange),
)
}
func (h *hello) OnInputChange(ctx app.Context, e app.Event) {
h.name = ctx.JSSrc().Get("value").String()
h.Update()
}
func main() {
app.Route("/", &hello{})
app.RunWhenOnBrowser()
http.Handle("/", &app.Handler{
Name: "Go全栈应用",
Description: "Go构建的前后端应用",
})
http.ListenAndServe(":8080", nil)
}
4. 实际项目示例
- Hugo:静态网站生成器,使用Go模板引擎
- Grafana:监控平台,后端使用Go,部分前端逻辑通过WASM实现
- Dgraph:图数据库,管理界面使用Go+WASM构建
5. 工具链
- Vecty:React-like的Go前端框架
- GopherJS:将Go编译为JavaScript
- tinygo:针对WASM优化的Go编译器
这些方案证明Go可以用于全栈开发,虽然生态不如JavaScript丰富,但在特定场景下具有性能优势和类型安全特性。
“我想学习Go语言,但没看到它能像JavaScript那样作为全栈语言使用。我可以构建后端,但前端又得去用React、Vue等。”
总的来说,你没看到如何将Go用作全栈语言,通常是因为Go本身就不是一门全栈语言。它是一门后端和CLI语言,并且在这些领域表现出色。在我看来,它比Node和JavaScript要好得多。
正如人们常说的,“用对工具,事半功倍”。如果你想构建一个API,甚至是用React或Vue.js等前端技术来构建单页面应用的后端服务,Go是非常棒的选择。
这并不是说你不能只用Go来创建一个网站,正如Sibert所展示的那样。但如果你真的想做出点东西,这就像逆流而上,阻力重重。当然,如果你只是为了学习和探索,那祝你成功!
即便如此,说Silbert的网站是100%用Go构建的也不准确,因为他仍然需要使用CSS和JavaScript(https://task.go4webdev.org/js/nav.js),因为浏览器不运行Go代码。
有很多与Go配合使用的Web框架,但*(几乎)所有(?)* 框架都要求你用前端技术来处理前端:
现在,你可以生成WebAssembly,并完全用Go来实现一个网站,但你必须重新发明轮子,而React和Vue.js可能已经为此投入了数万个人时。
这就像试图从头开始制造一辆新车,不使用任何现成的零件。当然,除非你想成为那个构建那个Go开发者Web工具包的人,它能做Vue.js和React所做的一切,但完全使用Go生成的WebAssembly。如果是这样,祝你好运,这些链接可能会有所帮助:
- 使用Go(Golang)的WebAssembly | 在浏览器中运行Go程序
- 使用WebAssembly和Go编写前端Web框架 | TutorialEdge.net
- 使用Go、Vecty和WebAssembly构建全栈Web应用 - LogRocket博客
- 从零开始使用Golang的WebAssembly | ITNEXT
- 一个用Go和WebAssembly构建渐进式Web应用的包 | GitHub
“有没有一个实际可用的工具,可以用Golang制作全栈(前端+后端)Web应用?有没有一个完全使用Golang构建的优秀Web应用示例?”
所以,正如Silbert所说,一个简单的方法是直接使用WordPress。
或者,如果你想坚持使用Go编写的东西,你应该看看用Go编写的网站生成器Hugo。这里有一篇文章解释了如何使用它创建博客:
如果你想实际用Go编码*(也许是为了获取经验?)*,那么你可以fork Hugo并对其进行自己的修改,我猜。
但归根结底,除非你选择一切通过WebAssembly的路线,否则要构建一个现代网站,你最终都必须在Go之外再使用前端技术。
希望这能帮到你。

