下面我将介绍本网站的构建过程。
安装Hugo
假设开发电脑使用Linux操作系统,执行以下命令安装Hugo:
- 对于Debian操作系统运行:
sudo apt install hugo
- 对于CentOS操作系统运行:
sudo dnf install hugo
其它操作系统安装方法参考官网文档。
创建网站项目
完成Hugo安装后,运行以下命令创建网站项目(此处假设项目名为XiaoGTechBlog
):
hugo new site XiaoGTechBlog
Hugo会生成项目目录XiaoGTechBlog
。进入项目目录,克隆PaperMod主题到本地:
cd XiaoGTechBlog
git clone https://github.com/adityatelange/hugo-PaperMod themes/PaperMod --depth=1
编辑项目的hugo.toml
配置文件,设置网站主题为PaperMod:
theme = 'PaperMod'
在修改项目的过程中,可以在项目目录下运行命令hugo server -D
来对项目进行调试。
多语言支持
在项目根目录的hugo.toml
中,有如下配置:
baseURL = 'https://xiaog.info/'
defaultContentLanguage = 'en'
defaultContentLanguage = 'en'
设置网站默认语言是英语。但我还希望给网站添加中文的语言显示。
为了给网站添加多语言支持,同时方便配置管理,网站项目采用层级化的配置管理。首先在项目目录中创建配置目录:
mkdir -p config/_default
然后在config/_default
中创建多语言配置文件languages.toml
,作为多语言支持的配置文件。本网站的languages.toml
配置如下:
[zh]
languageCode = 'zh'
languageName = '简体中文'
hasCJKLanguage = true
title = '筱霁技术博客'
weight = 1
[[zh.menu.main]]
url = '/'
name = '首页'
weight = 1
[[zh.menu.main]]
url = '/blog'
name = '文章'
weight = 2
[[zh.menu.main]]
identifier = "categories"
url = '/categories'
name = '类别'
weight = 3
[[zh.menu.main]]
identifier = "tags"
url = '/tags'
name = '标签'
weight = 4
[[zh.menu.main]]
url = '/archives'
name = '归档'
weight = 5
[[zh.menu.main]]
url = '/search'
name = '搜索'
weight = 6
[[zh.menu.main]]
url = '/about'
name = '关于'
weight = 7
[en]
languageCode = 'en'
languageName = 'English'
title = 'XiaoG Tech Blog'
hasCJKLanguage = true
weight = 2
[[en.menu.main]]
url = '/'
name = 'Home'
weight = 1
[[en.menu.main]]
url = '/blog'
name = 'Blog'
weight = 2
[[en.menu.main]]
identifier = "categories"
url = '/categories'
name = 'Category'
weight = 3
[[en.menu.main]]
identifier = "tags"
url = '/tags'
name = 'Tag'
weight = 4
[[en.menu.main]]
url = '/archives'
name = 'Archive'
weight = 5
[[en.menu.main]]
url = '/search'
name = 'Search'
weight = 6
[[en.menu.main]]
url = '/about'
name = 'About'
weight = 7
在languages.toml
中我们配置网站支持英文和中文两种语言,菜单项有首页、博客、类别、标签、归档、搜索和关于。
博客的链接是/blog
。我们在项目目录的content
目录下创建blog
目录,所有博客文章的MarkDown文件都将放在content/blog
目录中。
根据Hugo的多语言支持规则,用户使用中文访问时看到的文章,MarkDown文件名末尾要添加.zh
,英文文章文件名末尾添加.en
。例如本文的中文版MarkDown文件名是technology-stack-about-this-website.zh.md
,英文版文件名是technology-stack-about-this-website.en.md
。
为了让PaperMod主题界面上的语言切换按钮显示名称是配置中的languageName
而不是languageCode
,还需要将displayFullLangName
配置的值设置为true
。我们将该配置写在网站配置文件hugo.toml
中,在hugo.toml
添加:
[params]
displayFullLangName = true
为了适应多语言显示,在content/blog
目录下创建_index.zh.md
文件,内容如下:
+++
title = '文章'
+++
其中文件名中的.zh
对应语言配置中对应语言的languageCode
值。
这样在用户使用中文访问网站时,文章列表页显示的标题就是文章
,否则Hugo会自动推断标题是Blogs
来显示。
分类
类别和标签页面是Hugo默认自动生成的分类页面。在页面的MarkDown文件中,可以通过Front Matter的categories
和tags
配置项设置文章的类别和标签。例如本文的categories
和tags
配置如下:
+++
categories = ['Hugo', 'Web开发']
tags = ['Hugo', 'Web开发']
+++
此时会发现/categories
页面在英文和中文语言下显示的标题都是Categories
,/tags
页面在英文和中文语言下显示的标题都是Tags
。但我希望在中文语言下/categories
页面显示标题是类别
,/tags
页面显示标题是标签
。
根据官网文档Taxonomies,要实现上述需求,需要在项目目录的content
目录下创建categories
和tags
目录,并在两个目录中均创建文件_index.zh.md
。
content/categories/_index.zh.md
文件内容为:
+++
title = '类别'
+++
content/tags/_index.zh.md
文件内容为:
+++
title = '标签'
+++
当用户使用中文访问网站,类别和标签页面就会显示其中文标题,而不是默认的英文标题。
归档
为了显示归档页,根据PaperMod主题的官方文档,我们在content
目录下添加archives.en.md
文件,内容如下:
---
title: "Archive"
layout: "archives"
url: "/archives/"
summary: archives
---
该文件对英语语言下的归档页面进行了配置。
同理,我们创建archives.zh.md
文件,对中文语言下的归档页面进行配置,文件内容如下:
---
title: "归档"
layout: "archives"
summary: archives
---
搜索
PaperMod主题本身已经实现了基于fuse.js
实现了客户端侧的网站全文搜索。
该搜索方法的优点是完全基于Hugo实现,服务侧不需要运行其它的搜索服务。缺点是用户搜索时需要下载索引文件,当网站页面较多时,索引文件较大可能会消耗大量服务器和用户的流量。
为了启用内置的搜索功能,首先在项目配置文件hugo.toml
中修改输出格式配置:
[outputs]
home = ["HTML", "RSS", "JSON"]
其中HTML
、RSS
是Hugo默认会输出的文件格式,重点是添加JSON
到输出文件中。
添加该配置后,Hugo会根据themes/PaperMod/layouts/_default/index.json
,生成网站的索引文件index.json
。
如果用户要修改输出的索引文件格式,可以在项目目录的layouts/_default
目录中创建index.json
文件,仿照PaperMod主题的index.json
文件进行编写。编写完毕后需要删除themes/PaperMod/layouts/_default/index.json
文件,否则Hugo会根据两个index.json
文件生成最终的索引文件,导致网站页面可能被重复索引。
为了适应多语言支持,接下来在content
目录下创建search.en.md
和search.zh.md
文件:
search.en.md
内容如下:+++ title = 'Search' layout = 'search' +++
search.zh.md
内容如下:+++ title = '搜索' layout = 'search' placeholder = '搜素' +++
通过上述步骤,进入搜索页面即可使用PaperMod主题内置的搜索功能。
评论系统
本博客评论系统依托GitHub,使用giscus
应用实现。接入步骤如下:
- GitHub上创建公开仓库,在仓库设置中启用
Discussions
特征功能(在项目的Settings
->General
->Features
下启用Discussions
)。 - 访问giscus应用安装页面,点击安装按钮。安装完成后,在配置中选择我们创建的公开仓库。
- 访问giscus官网,在主页的Configuration小节中填选配置信息,参考配置如下:
repository
中填写项目链接,格式是GitHub的用户名/项目名
,例如本网站为XiaoGTech/XiaoGTechBlogComments
。Page ↔️ Discussions Mapping
中选择Discussion title contains page pathname
。同时勾选下方的Use strict title matching
选项,否则默认会使用模糊匹配,如果有页面的链接名包含在另一个页面的链接名中(例如blog/technology-stack-about-this-website/
和/zh/blog/technology-stack-about-this-website/
),可能会导致页面评论匹配错误。Discussion Category
中选择Announcements
。- 其它配置保持默认。
页面拉到Enable giscus
小节,可以看到页面自动生成的giscus
接入代码(一个<script>
标签)。
我们在网站项目下创建目录layouts/partials
,将文件themes/PaperMod/layouts/partials/comments.html
拷贝到目录layouts/partials
中,编辑拷贝后的文件,将giscus
的接入代码复制到文件中({{- /* Comments area start */ -}}
到{{- /* Comments area end */ -}}
中间)。
为了让评论系统显示的语言根据用户的语言变化,在comments.html
中,我们需要对giscus
生成的代码中data-lang
一行进行修改。对于本网站,其修改结果如下:
{{ if eq .Lang "en" }}
data-lang="en"
{{ else if eq .Lang "zh" }}
data-lang="zh-CN"
{{else}}
data-lang="en"
{{ end }}
当用户访问英文页面(网站设置的语言代码是en
),页面输出data-lang="en"
。当用户访问简体中文页面(网站设置的语言代码是zh
),页面输出data-lang="zh-CN"
。
对于需要开启评论功能的文章,只需要在文章的front matter
配置中添加comments = true
即可以让页面加载评论功能模板。
部署网站
在更新网站完成后,在网站项目目录运行hugo
命令,Hugo会把网站的所有静态页面生成在项目目录的public
目录中。将public
目录中的文件打包放到服务器上即可完成部署。