为何再次重建博客?
是,我知道我上次更新博客是2021年,但是这个博客我的确是没有忘的。(主播只是入狱了)
实际上这个博客是我在21年暑假用Hugo建的,使用的是Eureka主题。整体效果确实非常不错,但遗憾的是配置过程极其奇怪:虽说有专门的说明文档,但是于我而言这玩意写得实在是不太友好太坏了,准备写邮件去骂.jpg,所以当时我的配置过程纯粹靠蒙,虽说最后还是搞出来了,但确实是一种折磨。
正好最近几天又想写博客了,就把Hugo又下了回来,结果升级Eureka主题的时候又折磨了好久,还是没整明白。
使用git submodule下来的Eureka配置后存在的大量报错,不断提示module未定义,反正也看不懂,干脆换主题了。
因此本次的折腾就再走一遍之前的路,从零开始重建博客,顺带记录下以防之后忘记。
Hugo之安装
“Hugo是由Go语言实现的静态网站生成器。简单、易用、高效、易扩展、快速部署。 ”
本次我使用的是 Hugo v0.111.2 与 git v2.38.0 ,操作系统为 win 11。在 Hugo 的releases和 Git 的官网都能很方便地下载。我选择的是 hugo_extended_0.111.2_windows-amd64.zip
版本,以便后续折腾。下载完成后将压缩包里的东西解压至你喜欢的目录,再将该目录的路径添加到环境变量中以便后续调用。至于 Git 的安装,我就不再赘述了。
Hugo建站
新建网站
运行 Hugo.exe 后,输入:
hugo new site ./path //比如我这里就是./exnadio.github.io
运行后便会输出一个网站目录,其结构为(引用自炸鸡人博客):
1
2
3
4
5
6
7
8
.
├── archetypes # 存放文章模板
├── config.toml # 简单的配置文件
├── content # 存放文章
├── data # 存放生成静态页面时的配置文件
├── layouts # 存放页面布局的模板
├── static # 存放图片等静态内容
└── themes # 存放下载的主题
此时便搭好了一个基础框架,可以进行主题的导入了。
导入主题
这一步你就可以打开 Hugo Themes 这个网站,选择一个你喜欢的主题,然后跟随着它的说明一步一步配置就大功告成了。那么我们下期再见
实际上我认为这步是整个 Hugo 建站中最复杂的一步。且每个人选择的主题不尽相同,很难以一个完善的教程(何况我这篇是否算教程也有待考虑)通杀一切,我就分享下我这次的经历好了。
安装主题一般而言存在三种方式:
git submodule 安装
go module 安装(需要安装 Go 语言)
本地安装
我个人更推荐第一种方式,考虑到后续升级的难易,这算是最均衡的一种方式。具体的安装方法可以在各主题的说明中找到,我这里安装的是Stack。
在网站目录下,输入:
1
2
git init
git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack
等待下载完成后,便可以进行配置了。假如你想用其他方式安装,也可以参考这里。
Stack本身有全英文的说明文档,我建议是将./themes/hugo-theme-stack/exampleSite/content和./themes/hugo-theme-stack/config.yaml直接夺舍,根据说明与需求修改,会剩下很多时间。
根据 Stack 的说明文档,Stack后续将改用.toml格式的Config文件,不过其配置步骤基本相同。
预览网站
很多教程会先教创建文章,不过我觉得配置完主题后还是先预览网站为好。Hugo的一大好处就是可以进行即时预览,你可以看到你每一步修改所产生的变化,也可以看到你是如何把一切搞崩溃的。
输入:
1
hugo server
即可建立一个本地服务器。
当然你也可以加上一些 flag 来达到一些其他目的:比如指定主题的--theme=Stack和关闭快速渲染的--disableFastRender等,具体可以查阅文档。
之后便可以在浏览器里打开http://localhost:1313预览。
创建文章
Hugo中的文章采用Markdown格式,通过以下命令你可以在./content/post路径下创建一篇文章:
hugo new post/rebuild_blog.md
打开后你会发现生成的Markdown文档带有一段FrontMatter部分,具体的意思可以在这里找到。大体上可以认为是文档的一些属性。
虽然大部分的主题都会帮你配置好 FrontMatter 部分,但是也是有部分主题是需要自行配置的,很不幸,Stack 就是这类主题之一。不过这也没啥关系,修改之前提到的./archetypes/default.md/下的default.md即可。
生成静态页面
只需输入:
1
hugo
即可。默认生成位置为./public,你可以在配置文档中使用publishDir参数指定,也可以直接使用-d参数指定。
发布网站
首先,我不会 git。
其次,本部分全文抄袭自炸鸡人博客。
这里用 Github Pages 来部署博客。首先在config.yaml里指定:
publishDir: docs
然后再一个hugo命令,这样就把静态页面输出到docs目录下了。
接着在 Github 上以 ZhaJiMan.github.io 的名字(根据自己的用户名而定)新建一>个空仓库,进行下面的 Git 命令:
git add .
git commit -m “first commit”
git branch -M main
git remote add origin https://github.com/ZhaJiMan/ZhaJiMan.github.io.git
git push -u origin main
这段改编自空仓库页面出现的提示,大意是:
将网站目录下的所有内容暂存。
把暂存的内容提交给版本库。
把主分支的名字从 master 改为 main。
添加远程仓库。
把本地内容推送到远程仓库里。
推送成功后,进入仓库的设置页面,点击侧栏的 Pages,再把 Source 选项改为 main 分支下的docs目录,这样 Github Pages 就会根据我们推送上去的docs目录里的静态页面来显示网站。这里指定docs的好处是还可以把网站的所有文件都备份到仓库里(不包含以 submodule 形式添加主题,详见参考链接)。最后在与仓库同名的网站 https://zhajiman.github.io/ 上看看自己的博客吧!
我补充几个细节:
git push -u origin master //我采用了master分支后是要验证github账号的(也许只有首次有?),假如你没有,那么我建议你读第2点。
Github是有带GUI的客户端的,git苦手可以考虑用这个。
主题配置历程
由于主题的配置是个个体差异极大的过程,因此我不会事无巨细地说明每一个过程,而是说明几个小点。
网站图标更改
其实很简单,但是我被一个issue误导了,哈哈。
将图片生成的favicon文件夹放在./static文件夹下,然后在cofig.yaml下指定:favicon: /favicon/favicon.ico 就行。
评论系统之接入
忘了Uttrances怎么配置的了啊嗯,鸽了。
已将评论系统改为giscus,配置过程见这里
Stack主题自定义
首先放一下对比图:
改善浅色模式可读性
配置完 Stack 后,我并不是很满意,假如说满分100的话我只能打个70分左右。最大的不满在于其浅色模式下可读性实在是过于糟糕,你可以在 Demo网站 上感受一下,我不清楚为什么作者采用了#bababa这个颜色,导致其与背景的对比度来到了可怜的1.94,简直就是一场彻头彻尾的灾难。
不过好在 Stack 主题预留了自定义的空间,详见官网的说明。这里具体介绍下自定义的方法:
在Stack以及很多主题中,主题文件夹下的assets/scss下都提供了一个供用户自定义的custom.scss文件。
原理便是在最后引入这个文件,使其位于最终css文件的末尾,从而覆盖原先的属性,达到“自定义”的效果。
因此,想要自定义就很简单了:找到你希望修改的元素和它对应的选择器,重新定义这个选择器即可。
万幸,目前的浏览器为我们提供了好用的开发者工具。以我现在使用的Edge为例,按下F12弹出开发者工具,使用左上角的小箭头使你的鼠标变成一个查看器(你也可以使用SHIFT+CTRL+C的组合键),只要将光标置于你想修改的元素上,就能找到该元素的源代码。
例如我现在想改浅色模式下的文本颜色,只需选择一段文本,就能在右下角找到它对应的css:
可以看到文本被指定为---body-text-color。
再顺藤摸瓜找到对应的颜色控制:
把要修改的部分直接复制出来放进custom.scss文件中,修改下即可。比如我使用的这套:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
:root {
--body-background: #EBEBEB;
--accent-color: #1B365D;
--accent-color-darker: #202A44;
--accent-color-text: #FFF;
--body-text-color: #202A44;
}
:root {
--card-background: #FFF;
--card-background-selected: #EBEBEB;
--card-text-color-main: #202A44;
--card-text-color-secondary: #53565A;
--card-text-color-tertiary: #888B8D;
}
此时就能达到这种效果了:
Tag的修改我也说下,用上面的方法找到代码,发现:
Is this LGBT light?
然后把能找到这些颜色的地方全图图了:
1
2
3
4
5
6
7
8
9
.article-list article:nth-child(n) .article-category a {
background: #1B365D;
color: #fff;
}
.article-category a, .article-tags a {
background-color: #1B365D;
color: #fff;
}
Note:
改完之后我发现分类的 Tag 还是存在问题,虽说前几个颜色是对的,但是越往后走居然开始变色了:
此时即使在custom.scss中指定了颜色也没啥用,看了下这玩意居然在是element.style写死的,多少有点幽默:
于是便需要在源代码后面加上!important,Done。
现代码如下:
1
2
3
4
5
6
7
8
9
.article-list article:nth-child(n) .article-category a {
background: #1B365D!important;
color: #fff;
}
.article-category a, .article-tags a {
background-color: #1B365D!important;
color: #fff;
}
修改网站布局
原先挤满所有空间的布局我不喜欢,遂改。
这里使用仙贝的代码,一样是在custom.scss中添加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
.container {
margin-left: auto;
margin-right: auto;
&.extended {
/* range: 768-1024 */
@include respond(md) {
max-width: 1024px;
--left-sidebar-max-width: 25%;
--right-sidebar-max-width: 30%;
}
/* range: 1024-1280 */
@include respond(lg) {
max-width: 1280px;
--left-sidebar-max-width: 25%;
--right-sidebar-max-width: 22%;
}
}
&.compact {
@include respond(md) {
--left-sidebar-max-width: 25%;
max-width: 768px;
}
@include respond(lg) {
max-width: 1024px;
--left-sidebar-max-width: 20%;
}
@include respond(xl) {
max-width: 1280px;
}
}
}
即可。
老头滚动条修改
同上,不喜欢,仙贝代码,添加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
html{
::-webkit-scrollbar {
width: 20px;
}
::-webkit-scrollbar-track {
background-color: transparent;
}
::-webkit-scrollbar-thumb {
background-color: #d6dee1;
border-radius: 20px;
border: 6px solid transparent;
background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
background-color: #a8bbbf;
}
}
图标添加与修改
Stack主题带了几个很好看的Tabler图标,可惜并不全,部分缺失的图标要手动添加。
例如我想添加一个比比汗丽丽的图标,在Tabler官网搜索发现居然真有:
将svg文件其下载到.\themes\hugo-theme-stack\assets\icons中,再调用即可。
另外,我也不是很喜欢自带的深色模式切换开关,以我个人的的观点来看,这玩意太不直观了:
图标的添加方式就不再赘述,我这里选的是"sun-high"和"moon-stars"这两个图标。
观察网页的CSS可以发现:深色模式下图标的切换就是“一个显示,一个隐藏”,在相关文件中指定该用的图标即可。
作者将这个开关做在了侧边栏里,因而直接在有关的.\assets\scss\partials\sidebar.scss和\layouts\partials\sidebar\left.html里指定图标即可:
``
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* .\assets\scss\partials\sidebar.scss Line 154*/
[data-scheme="dark"] {
#dark-mode-toggle {
color: var(--accent-color);
font-weight: 700;
.icon-tabler-sun-high {
display: none;
}
.icon-tabler-moon-stars {
display: unset;
}
}
}
#dark-mode-toggle {
margin-top: auto;
color: var(--body-text-color);
display: flex;
align-items: center;
cursor: pointer;
gap: var(--menu-icon-separation);
.icon-tabler-moon-stars {
display: none;
}
}
1
2
3
4
5
6
7
8
{{ if (default false .Site.Params.colorScheme.toggle) }}
{{ partial "helper/icon" "sun-high" }}
{{ partial "helper/icon" "moon-stars" }}
{{ T "darkMode" }}
{{ end }}
效果如下:
顺带一提,想改中文翻译直接去\i18n\zh-cn.yaml中修改即可(暗色模式这翻译也太怪了)。
添加字数统计
Stack本身是不带字数统计的,但是Hugo本身是支持进行字数统计的。所以我决定,写一段字数统计的代码。
Stack的文章页面是由三个html控制的:
1
2
3
4
.
├── details.html
├── content.html
└── footer.html
所以在details.html中加入相应的字数统计代码就行了。
在互联网上找了一圈后,我发现之前就有人写过相关代码。
1
2
3
4
5
6
7
{{ if .Site.Params.article.readingTime }}
{{ partial "helper/icon" "brush" }}
{{ .WordCount }}字
然而这段代码没有多语言支持,所以我决定让事情变得更复杂:全面照抄Stack实现阅读时长的方式。
首先在congfig.yaml中的.params.article中添加:
1
wordCount: true
然后参考前面的和readTime的代码,在detail.html中加上下面的代码:
1
2
3
4
5
6
7
8
{{ if .Site.Params.article.readingTime }}
{{ partial "helper/icon" "file-description" }}
{{ T "article.wordCount" .WordCount }}
{{ end }}
之后只要添加多语言支持,也就是在i18n文件夹中修改对应语言的.yaml文件就好了。以英文为例,在.\i18n\en.yaml中加上:
1
2
wordCount:
other: "{{.Count}} words"
便完事大成了。反正一切主打的就是一个readTime在哪我在哪
顺带改了下图标,参考这里
文章修改时间显示
修改时间就没有字数统计这么麻烦了。Stack本身自带修改时间显示,不过这玩意放在了最底下,不太直观,我就把它提上来了。
源代码看位置就在.\layouts\partials\article\components\footer.html里,果不其然:
1
2
3
4
5
6
7
8
{{- if ne .Lastmod .Date -}}
{{ partial "helper/icon" "clock" }}
{{ T "article.lastUpdatedOn" }} {{ .Lastmod.Format ( or .Site.Params.dateFormat.lastUpdated "Jan 02, 2006 15:04 MST" ) }}
{{- end -}}
前面也说了,日期、阅读时间之类被放在了.\layouts\partials\article\components\footer.html里,因此在参考日期的代码和源代码基础上做点修改,添加进去就行:
1
2
3
4
5
6
7
8
{{- if ne .Lastmod .Date -}}
{{ partial "helper/icon" "edit" }}
{{- .Lastmod.Format (or .Site.Params.dateFormat.published "Jan 02, 2006") -}}
{{ end }}
顺带,为了自动更改修改时间,在config.yaml中添加:
1
2
frontmatter:
lastmod: [":fileModTime", "lastmod"]
友情链接改为双列显示
这里我用的是大佬的代码,修改过程和之前一样,在custom.scss添上以下css即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@media (min-width: 1024px) {
.article-list--compact.links {
display: grid;
grid-template-columns: 1fr 1fr;
background: none;
box-shadow: none;
article {
background: var(--card-background);
border: none;
box-shadow: var(--shadow-l2);
margin-bottom: 8px;
border-radius: 10px;
&:nth-child(odd) {
margin-right: 8px;
}
}
}
}
目前仍未完成的部分
当然目前这个网站仍存在以下问题以及遗憾:
过往文章未恢复
评论系统未接入
部分界面还未配置好
网站图标未设置(其实是还没做)
没有文章修改时间显示
洋文站点还没完成
Category机制还没搞懂 他妈的,实在搞不懂。 Fuck,that’s a feature.
以上,下次大概的确会修复!
预告部分
主题配置历程
Markdown小教程
つづく
参考链接
用 Hugo 重新搭建博客
Hugo Stack主题更新小记
将Hugo Stack主题友情链接改为双列显示
Hugo | 看中 Stack 主题的归档功能,搬家并做修改
Page Variables