使用Golang作为前端框架的实践与探讨

使用Golang作为前端框架的实践与探讨 你好,

我想学习Go语言,但我发现它无法像JavaScript那样作为全栈语言使用。我可以构建后端,但之后又不得不转向React、Vue等框架来构建前端。

或者,

是否存在一个实际的工具,可以让人用Go语言来构建全栈(前端+后端)的Web应用?有没有一个完全使用Go语言构建的优秀Web应用示例?

谢谢。

11 回复

Go 在后端开发方面表现出色,但并非专为前端工作而设计。

更多关于使用Golang作为前端框架的实践与探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @Dean_Davidson

可用的框架列表很长,根据你的经验,有没有一个特定的工具可以推荐,哪个更好,谢谢

@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

谢谢 @mikeschinkel

这真是一个非常详细的回复,我发现了一些以前不知道存在的新工具。我对 Go 语言产生兴趣,是因为听说它既能覆盖前端也能覆盖后端。

我应该使用像这样的工具吗?

GitHub 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

GitHub - maxence-charriere/go-app: 一个使用Go编程语言和WebAssembly构建渐进式Web应用的包…

图片

一个使用Go编程语言和WebAssembly构建渐进式Web应用的包。- GitHub - maxence-charriere/go-app: 一个使用Go编程语言和WebAssembly构建渐进式Web应用的包…

GitHub

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 目录 (我有点夸张了。嗯,只夸张了一点点)

node_modules suck!

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。如果是这样,祝你好运,这些链接可能会有所帮助:

“有没有一个实际可用的工具,可以用Golang制作全栈(前端+后端)Web应用?有没有一个完全使用Golang构建的优秀Web应用示例?”

所以,正如Silbert所说,一个简单的方法是直接使用WordPress

或者,如果你想坚持使用Go编写的东西,你应该看看用Go编写的网站生成器Hugo。这里有一篇文章解释了如何使用它创建博客:

如果你想实际用Go编码*(也许是为了获取经验?)*,那么你可以fork Hugo并对其进行自己的修改,我猜。

但归根结底,除非你选择一切通过WebAssembly的路线,否则要构建一个现代网站,你最终都必须在Go之外再使用前端技术。

希望这能帮到你。

回到顶部