跳到主要内容
  1. Skills/
  2. Hugo 使用指南/

hugo 中的数据管理

·字数 1244·3 分钟
有悟方法

gohugo 是静态网页生成器,它使用数据与网页模板来生成网页文件。gohugo 中使用到的数据分为文章内容页面文件、data中的数据文件、通过数据函数 getJSONgetCSV获取到的外部数据。在官方文档中,有关于内容管理、数据模板,但关于数据管理方面的内容分散在几篇文章中、或者就没有数据管理角度的文章,对于熟悉使用带有数据库方式建站的用户来说,这方面的信息其实也比较重要。

gohugo 中使用到的数据 #

gohugo 使用到的数据有页面内容文件,data目录的数据文件,外部的 json、csv 文件。

官方文档 Data Templates 中有关于数据使用的描述。

页面内容 #

页面内容文件,即平时用来保存文章内容的 markdown 文件

---
# front matter
title: "hugo 中的数据管理"
slug: "hugo data management"
date: 2021-05-31T18:22:22+08:00
lastmod: 2021-05-31T18:22:22+08:00
draft: true
---

...正文内容...

上面 正文内容使用 goldmark 来解析,并将保存在 Page.Content,上面 front matter 中的值,做为参数,一部分以 Page 的属性存在(如 Page.Title),一部分未在 Page 中定义中,会被保存到 Page.Params.xxx。(后面时间允许的话,准备写一篇关于 Page 变量的文章) 这些变量值将在模板渲染过程中被使用到。

在这个官方文档 Data Templates 中,并没有关联提及 Page Bundles Page Resources (因为 Page BundlesPage Resources 确实已经超过数据管理的范围),其实在 Page Resources 除了包含图片、pdf 等资源文件外,也可以包含经常被用来保存数据的 json 文件。

data 数据目录 #

还记得 gohugo 的目录结构吗?

.
├── archetypes
├── config.toml
├── content
├── data
├── layouts
├── static
└── themes

上面那个 data 目录,是 hugo 的一个标准目录。在 hugo 启动时,会加载这个目录下 yamljsontoml文件中的数据到内存中。那么,如果在模板渲染过程中需要使用到非文章内容的数据时,就可以将需要的数据以 等格式保存在这个 data 目录。

在模板中,通过使用 site.Data.数据文件名 来引用对应的数据。

数据获取 getXXX 函数 #

前面所述的页面内容、data 数据目录,都是静态的本地数据文件。gohugo 还提供了两个数据获取函数 getJSONgetCSV,分别用来获取内容格式为 jsoncsv 数据,这些数据被用于模板渲染。虽然这些数据可能是动态的(每一次获取得到的结果可能会变化),但是当获取之后,数据就变成静态的,并渲染固化到网页。

getJSONgetCSV 仅在 Call the Functions with a URL 中有说明,并没有出现在 Functions Quick Reference

使用下面这个格式,在模板中获取指定 url 的数据:

{{ $dataJ := getJSON "url" }}
{{ $dataC := getCSV "separator" "url" }}

另外,这两个函数除了可以获取 互联网 url 的数据外,还可以读取到位于本地文件,不过要求这些文件必须在 hugo 的当前工作目录(非 data 目录)下

数据的使用模式 #

通过上一节的介绍,hugo 中使用到的数据可以保存在几个地方,同时获取方式也不是唯一的。所以,对于有长期维护网站需求的用户来说,如何才能规范使用又能方便管理? 这个问题并没有标准答案,以下有悟分享本站的建设经验,供大家参考。

  • 内容页面 markdown,保存页面级别数据、控制参数等,便于个性化
  • Page Resources,尽量少用这个方式来管理数据,除非数据是该页面独有的
  • data 目录,保存网站级别数据或者公用的数据,方便管理
  • getXXX 数据获取函数,只在获取远程数据时使用