使用 Golang 和模板引擎创建网站

news/2024/12/17 20:20:29/文章来源:https://www.cnblogs.com/cheyunhua/p/18613357

使用 Golang 和模板引擎创建网站

图片

在过去,人们通常使用 HTML、CSS 和 JavaScript 来构建网站,同时在后端使用 PHP。如今,已经有许多 JavaScript 框架可供选择,比如 React.js、Next.js、Vue.js、Nuxt、Svelte、SvelteKit、Astro 等等。

在本文中,我将尝试使用 Golang、HTML、CSS 和一些 JavaScript 来创建我的网站。前端 HTML 模板部分将使用Templ。如果你熟悉 Ruby on Rails 或 Laravel,那么你可能已经了解 HTML 模板的概念。Rails 提供 ERB,Laravel 提供 Blade,它们的目的都是将后端代码与 HTML 直接集成,同时创建模块化的 HTML 模块以便在项目中复用。


安装 Templ

首先,我们需要安装 Templ 的最新版本(本文撰写时的版本为 v0.2.778,尚未达到 v1 版本)。

go install github.com/a-h/templ/cmd/templ@latest

安装完成后,我们可以开始创建一个空的 Golang 项目。假设项目名称为personal

mkdir personal && cd personal  
touch main.go  
go mod init personal

现在,项目已经初始化完成。接下来,我们将在main.go 文件中创建一个简单的 HTTP 服务器。在本文中,我将使用Echo 框架。


创建 HTTP 服务器

以下是main.go 文件的代码:

package main

import (
    "context"
    "fmt"
    "log"
    "net/http"
    "os"
    "os/signal"
    "personal/internal/config"
    "syscall"

    "github.com/caarlos0/env/v11"
    "github.com/labstack/echo/v4"
    "golang.org/x/net/http2"
    "golang.org/x/net/http2/h2c"
)

func main() {
    cfg, err := env.ParseAs[config.Config]()
    if err != nil {
        log.Println("error loading config")
    }

    e := echo.New()

    h2s := &http2.Server{
        MaxConcurrentStreams: 250,
        MaxReadFrameSize:     1048576,
        IdleTimeout:          cfg.GracefulTimeout,
    }

    s := http.Server{
        Addr:    fmt.Sprintf(":%s", cfg.Port),
        Handler: h2c.NewHandler(e, h2s),
    }

    log.Printf("server running on port: %s", cfg.Port)

    gofunc() {
        if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed {
            log.Println("shutting down the server")
        }
    }()

    quit := make(chan os.Signal, 1)
    signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
    <-quit

    log.Println("shutting down server...")

    ctx, cancel := context.WithTimeout(context.Background(), cfg.GracefulTimeout)
    defer cancel()

    if err := s.Shutdown(ctx); err != nil {
        log.Println("server forced to shutdown")
    }

    log.Println("server exiting")
}

运行以下命令以安装所有依赖项:

go mod tidy

接下来,创建一个名为config.go 的文件,用于存储服务器的配置信息:

package config

import "time"

type Config struct {
    Port            string        `env:"PORT" envDefault:"8080"`
    Env             string        `env:"ENV" envDefault:"dev"`
    GracefulTimeout time.Duration `env:"GRACEFUL_TIMEOUT" envDefault:"10s"`
}

为了确保服务器正常运行,可以在终端中运行以下命令:

go run main.go

如果一切正常,终端会显示类似以下的输出:

图片运行结果

集成 Templ

在服务器可以正常运行后,我们开始将 Templ 集成到项目中。首先,在internal 目录下创建一个名为views 的文件夹,路径为/personal/internal/views。然后创建一个名为layout.templ 的文件,用于定义项目的基础布局。

以下是layout.templ 的代码:

package views

templ head(title string, description string) {
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <title>{title}</title>
        <meta name="description" content={description} />
        <style>
            html {
                --font-sans: 'Manrope', sans-serif;
                --font-mono: 'JetBrains Mono', monospace;
                scroll-behavior: smooth;
            }

            .app {
                display: flex;
                flex-direction: column;
                min-height: 100vh;
            }

            main {
                flex: 1;
                display: flex;
                flex-direction: column;
                padding: 1rem;
                width: 100%;
                max-width: 64rem;
                margin: 0 auto;
                box-sizing: border-box;
            }
        </style>
    </head>
}

templ Layout(title string, description string, content templ.Component) {
    <!DOCTYPE html>
    <html>
        @head(title, description)
        <body>
            <div class="app">
                <main>
                    @content
                </main>
            </div>
        </body>
    </html>
}

上述代码中,我们定义了一个名为Layout 的 HTML 布局函数,它包含三个参数:titledescription 和content。同时,我们还定义了一个head 函数,用于存储网站的元信息。

注意:可以使用 VSCode 的 Templ 插件 来更方便地导航和编辑 Templ 函数。

接下来,运行以下命令生成 Golang 文件,以便在代码中调用 Templ 函数:

templ generate

如果终端提示templ version check: templ not found in go.mod file,不要担心。运行以下命令将 Templ 添加到go.mod 文件中:

go get github.com/a-h/templ

再次运行templ generate,你会在/personal/internal/views 目录下看到一个名为layout_templ.go 的文件,这是 Templ 自动生成的代码文件。


创建主页

接下来,我们为项目创建一个简单的主页。在/personal/internal/views 目录下创建一个名为home.templ 的文件,内容如下:

package views

templ Home() {
    <section>
        <p>Hello World.</p>
    </section>
}

然后运行以下命令生成对应的 Golang 文件:

templ generate

渲染模板

为了在 Echo 的路由中渲染模板,我们需要创建一个渲染函数。在personal/pkg/renderer 目录下创建一个文件,并添加以下代码:

package renderer

import (
    "github.com/a-h/templ"
    "github.com/labstack/echo/v4"
)

func Render(c echo.Context, statusCode int, t templ.Component) error {
    buf := templ.GetBuffer()
    defer templ.ReleaseBuffer(buf)

    if err := t.Render(c.Request().Context(), buf); err != nil {
        return err
    }

    return c.HTML(statusCode, buf.String())
}

这个函数会将模板渲染为字节缓冲区,然后通过c.HTML 方法将其转换为 HTML 响应。


修改主程序

最后,修改main.go 文件,添加路由并渲染模板:

package main

import (
    ...
    "personal/pkg/renderer"
)

func main() {
    ...
    e.GET("/"func(c echo.Context) error {
        return renderer.Render(c, http.StatusOK,
            views.Layout("Home",
                "Zainokta's home page, feels like home",
                views.Home()))
    })
    ...
}

运行以下命令启动服务器:

go run main.go

访问http://localhost:8080/,你将看到以下页面内容:

图片Hello World 页面

总结

通过本文的步骤,我们成功使用 Golang 和 Templ 创建了一个简单的网站。Templ 提供了强大的 HTML 模板功能,使得前后端的集成更加便捷。你可以基于本文的示例代码进一步扩展和自定义你的项目。

点击关注并扫码添加进交流群
免费领取「Go 语言」学习资料
图片
Go · 目录
上一篇Go 语言中尝试延迟执行一个函数
 
 
 
 

微信扫一扫
关注该公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/854482.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UML上机实验 1

安装了Visio并进行了简单的操作,通过这次实验学会了用Visio进行简单的制表,Visio界面直观,操作简单,比较容易上手。我尝试了绘制一个简单的流程图。整个过程非常顺畅,选择模板后,我只需要拖放不同的形状到画布上,然后通过连接线(使用自动连接功能)把这些形状串联起来,…

DL00336-基于多种机器学习模型的新能源电池寿命预测完整代码含数据集

随着新能源技术的迅速发展,电池作为核心组件在电动汽车、储能系统等领域的应用日益广泛,电池寿命预测成为关键技术之一。传统的电池寿命预测方法依赖于物理模型和经验公式,但这些方法无法有效应对电池老化过程中的复杂性与非线性特征。机器学习,尤其是基于多种模型的集成方…

OOP实验六

实验任务一:#pragma once#include <iostream> #include <stdexcept>// 声明 //////////////////////////////////////////////////// // 复数模板类声明 template<typename T> class Complex { public:Complex(T r = 0, T i = 0);Complex(const Complex<…

MeteoInfo-Java解析与绘图教程(十)_JAVA绘制雷达PPI图

天气雷达的基本要素有很多,特别是双偏振雷达更多,但业务场景经常使用的一般为基本反射率,基本速度这两种要素 接下来我们以基本反射率为例,其他的要素也是一样的,一通百通 首先我们做基本反射率的图需要确定做哪一个仰角层,因为雷达体扫模式的扫描是不同仰角进行扫描的,常规的雷…

友情链接

风筝上的猫IT分享--肯定放我自己了访问博客风筝上的猫IT分享--肯定放我自己了访问博客

画8.0

因为期末周忙着做汇报和复习 (其实是因为自己比较懒) ,所以这幅画完成的相当迟了。 头发画起来真实相当费劲啊。

都在使用的《模版模式》

模版符合开闭原则,到处用于钩子方法。有的钩子方法不会改变行为,有的钩子会改变运行轨迹。框架中到处使用。Channel中定义了需要的操作,AbstractChannel实现了核心功能,然后不同的Channel实现只需要告知具体channel的描述信息即可。 Channel 接口⬇︎⬇︎⬇︎点击查看代码 …

ifconfig命令

ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是network interfaces configuring。配置网卡的IP地址语法例:ifconfig eth0 192.168.0.1 netmask 255.255.255.0 在 实体机上 ifconfig 命令用于 显示或配置网络设备(网络接口卡) 或修改。(以CentOS…

数据智能,融合创新|12月中国数据库行业分析报告已发布, 持续为产业助力

本期报告以数据智能与融合创新为主题,除详解国产数据库市场动向外,探究了在云计算的推动下数据库自治、智能运维能力的产品创新实践,欢迎免费下载。为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析…

maven仓库

https://mvnrepository.com/

【教程】第八章:知识库——学海无涯

通过循序渐进的功能升级,你将打造一个强大的管理系统,让团队协作更高效、流程更智能。8.1 欢迎来到新的一章 在本章中,我们将深入学习如何构建一个知识库。这将是一个综合性的模块,帮助我们管理和组织文档、任务和信息。通过设计和创建一个树形结构的文档表,我们将实现对文…

【YashanDB知识库】如何处理yasql输入交互模式下单行字符总量超过限制4000字节

现象 在yasql执行sql语句后报错:YASQL-00021 input line overflow (>4000 byte at line 4)原因 yasql在交互模式模式下单行字符总量限制4000字节,超出该限制即报错。 交互式模式下,yasql会显示一个提示符,通常是 SQL>,等待用户输入命令, 用户执行的每个命令都会立即…