静态文件与模板:资源目录、gview 模板渲染与变量

引言

除接口外,网站通常还有静态资源(图片、CSS/JS)与动态页面。GoFrame 的静态目录由服务端配置,页面渲染由 gview 模板引擎负责。本章讲资源目录约定与模板基本渲染。

概念

  • 资源目录:工程静态资源统一放在 resource/ 下(如 resource/public 放静态文件、resource/template 放模板),可用 gres 组件打包进二进制(以官方文档资源管理章节为准)。
  • 静态文件:服务端通过 s.SetServerRoot("resource/public") 等方式指定静态目录,浏览器直接访问其中的文件。
  • 模板引擎 gview:g.View() 获取默认视图,模板语法与标准库 html/template 风格相近:{{.变量}} 输出、{{if}}/{{range}} 做控制。
  • 渲染入口:解析字符串用 ParseContent(ctx, 内容, 数据);解析模板文件用 Parse(ctx, 文件, 数据);路径解析规则见官方文档 gview 章节。
  • 模板变量:渲染数据通常是 g.Map,键在模板中以 .键名 访问。

代码示例

先做静态文件。假设目录结构:

resource/
├── public/
│   └── logo.png
└── template/
    └── index.html

服务端代码:

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
)

func main() {
	s := g.Server()

	// 指定静态资源目录
	s.SetServerRoot("resource/public")

	// 渲染模板页面
	s.BindHandler("/", func(r *ghttp.Request) {
		content, err := g.View().Parse(r.Context(), "index.html", g.Map{
			"title":   "GoFrame 首页",
			"welcome": "欢迎学习 GoFrame v2",
		})
		if err != nil {
			r.Response.WriteStatus(500, "render error")
			return
		}
		r.Response.Write(content)
	})

	s.SetPort(8000)
	s.Run()
}

模板文件 resource/template/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>{{.title}}</title>
</head>
<body>
    <h1>{{.welcome}}</h1>
    {{if .user}}
        <p>当前用户:{{.user.name}}</p>
    {{else}}
        <p>未登录</p>
    {{end}}
</body>
</html>

其中 {{.user.name}} 演示嵌套数据(user 是 map/结构体)。不依赖文件时,也可以直接渲染模板字符串:

content, err := g.View().ParseContent(r.Context(),
	"hello {{.name}}, 今年 {{.age}} 岁",
	g.Map{"name": "GoFrame", "age": 4},
)

注意点

  • SetServerRoot 指定的路径相对运行目录;gf run 下以工程根目录为基准,部署后注意工作目录。
  • Parse 的"文件路径"基于 gview 的模板目录查找规则,目录结构与默认路径不一致时先按官方文档配置。
  • 模板变量默认支持 {{.键}} 自动转义行为依配置而定;输出用户内容做富文本时注意转义配置(autoescape)。
  • 静态文件与动态路由重名时,路由注册顺序与静态服务规则的匹配优先级以官方文档为准。

小结

resource/ 管资源、SetServerRoot 放静态、g.View().Parse 出页面,即可支撑传统 Web 页面场景;前后端分离时静态资源由网关/CDN 托管,后端只出 JSON。gview 布局、继承等高级用法以官方文档 goframe.org 为准。

笔记加载中…