之前博客用的是 WordPress,最近觉得动态博客太占服务器资源了,想改用静态博客试试。静态博客框架有许多,常见的有 Jekyll、Hexo 以及 Hugo等。Hugo 是由 Go 语言实现的静态网站生成器。简单、易用、高效、易扩展、快速部署。Hugo 生成静态页面的效率很高,而且自带热重载模式,可以在修改 MarkDown 文章后更新生成的页面,能极大的提高博客书写效率。本站就是使用 Hugo 生成的静态博客。
本篇文章主要写写如何安装和使用 Hugo 来生成静态博客,以及我对 Hugo 主题的魔改。
一、安装 Hugo
推荐二进制安装,我是在本地 WSL 环境下装的,所以用的 deb 包。
wget https://github.com/gohugoio/hugo/releases/download/v0.58.3/hugo_0.58.3_Linux-64bit.deb
sudo dpkg -i hugo_0.58.3_Linux-64bit.deb
hugo version
二、使用 Hugo 生成静态页面
1.新建站点
使用以下命令新建 Hugo 站点。执行该命令会生成 MyBlog
文件夹。
hugo new site MyBlog
2.添加主题
可以在 themes.gohubo.io 上挑一个自己喜欢的主题,我用的是 LeaveIt 主题。进入 Myblog
文件夹,用以下命令下载安装主题。
git init
git submodule add https://github.com/liuzc/LeaveIt.git
在 config.toml
中添加主题设置
echo 'theme = "LeaveIt"' >> config.toml
3.主题设置
参考 Hugo 文档和主题文档编辑配置文件,下面是我的配置文件
baseURL = "/"
languageCode = "en-us"
title = "Ho_Zijui's B10g"
theme = "LeaveIt"
paginate = 10
enableEmoji = true
[Permalinks]
posts = "/:year/:filename/"
[menu]
[[menu.main]]
name = "Weekly Report"
url = "/report/"
weight = 1
[[menu.main]]
name = "Blog"
url = "/posts/"
weight = 2
[[menu.main]]
name = "Categories"
url = "/categories/"
weight = 3
[[menu.main]]
name = "Tags"
url = "/tags/"
weight = 4
[[menu.main]]
name = "About"
url = "/about/"
weight = 5
[params]
since = 2017
author = "Ho_Zijui"
avatar = "/images/me/panda.jpg"
subtitle = "I am a programmer, I write code"
home_mode = "post" # 首页展示博文
[params.social]
GitHub = "hozijui"
Email = "[email protected]"
WeChat = "/images/me/wechat_qrcode.png"
4.添加文章
文章用 Markdown 写,放在 content 文件夹下,根据自己的菜单配置组织文件目录结构。文章前面可以通过以下方式指明标题、时间、类别、标签以及模板中可能用到的变量值。
---
date: 2019-10-01T16:00:00
title: "This it title"
description: "This is description"
categories: ["Blog"]
tags: ["Blog"]
draft: true
---
图片等静态资源可以放在 static 目录中,在文章中引用图片的地址以 static 目录为根目录,例如图片 example.png 放在 static 下的 images 目录中,那么 Markdown 中引用该图片的地址就是 /images/example.png
5.启动服务查看生成的静态站点
在 MyBlog 文件夹下运行以下命令,该命令会构建站点并启动一个服务器,该服务器会监视 MyBlog 文件夹下的所有文件改动,并自动重新生成页面。其中 -D
表示构建的内容包括标记为草稿(draft)的内容。
hugo server -D
在浏览器中访问 127.0.0.1:1313 就可以看到生成的静态站点了。
三、魔改主题
不同主题有不同的模板结构,魔改都是以我用的主题为例。
1.添加 MathJax 支持
在 themes/LeaveIt/layouts/partials/js.html 中添加以下代码段即可
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
inlineMath: [['$','$'], ['\\(','\\)']],
displayMath: [['$$','$$'], ['\[','\]']],
processEscapes: true,
processEnvironments: true,
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
TeX: {
equationNumbers: { autoNumber: "AMS" },
extensions: ["AMSmath.js", "AMSsymbols.js"]
}
}
});
</script>
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>
2.修改页面结构和样式
站点首页
我想在博客首页同时显示个人信息和最近的几篇博文,虽然主题文档里说支持这种模式,但是有 Bug,样式也有点错乱,估计是没有做对新版本 Hugo 的兼容。在首页内容上,我要改的主要有:
文章的摘要或描述可以由我自己写,而不是直接显示博文内容
首页文章列表只显示最近 5 篇博文
分页改为 More,点击后进入博文目录
针对以上几点,要改的文件是 themes/LeaveIt/layouts/partials/home_post.html
<div class="post-warp">
......
<!-- 只显示最近的 5 篇博文 -->
{{ range first 5 (.Site.RegularPages) }}
<article class="post" itemscope itemscope="" itemtype="http://schema.org/Article">
<header class="post-header">
<h1 class="post-title" itemprop="name headline"><a href="{{ .Permalink }}">{{ .Title }}</a></h1>
</header>
<div class="post-content">
......
<!-- 文章概要或描述,由 Markdown 中的 description 指定 -->
{{ .Description }}
</div>
......
</article>
{{ end }}
<!-- {{ partial "paginator.html" . }} -->
<!-- More按钮,点击进入博文目录,样式与分页保持统一 -->
<ul class="pagination" style="padding: 0 0 20px 0">
<li class="page-item"><a href="/posts/" style="font-size: 24px">More</a></li>
</ul>
</div>
自定义样式我写在 css.html 里了,下同。虽然主题文档说了自定义样式应该写在 assets/css/_custom.scss 中,我尝试了但不知道为什么并没有被 import 进 main.scss 中。
// 解决个人信息位置错乱
.intro {
transform: translateY(0px);
margin-bottom: 50px;
}
// 文章列表项底边
article.post {
margin-bottom: 80px;
border-bottom: #ccc 1.5px dashed;
}
.post-warp .post-content {
padding-top: 0.8rem;
}
About页面
将主题本身做好的个人信息(头像、github、邮箱和微信等)放到 About 页面中。要改的文件是 themes/LeaveIt/layouts/page/single.html。参考 home_profile.html 进行修改。
......
<div class="post-content">
<!-- 是 About 页面时添加以下内容 -->
{{ if eq .Title "- About -" }}
<div class="intro">
{{ $cdn_url := .Scratch.Get "cdn_url" }}
{{ with .Site.Params.avatar}}
{{ $avatar := .}}
<div class="avatar" style="margin-top: -50px">
<img class="about" src="{{ (printf "%s%s" $cdn_url $avatar)}}"/>
</div>
{{ end }}
{{ with .Site.Params.subtitle}}
<h2 class="description" style="font-size: 16px;padding: 0.8em 0">
{{ . }}
</h2>
{{ end }}
<div class="social-links">
{{ partial "social.html" . }}
</div>
</div>
{{ partial "wechat.html" . }}
{{ end }}
{{ .Content }}
</div>
......
其他
其他的修改主要是一些细节,比如取消页面失去焦点时会改 title、数学公式的样式、微信按钮的target属性等,翻翻主题代码改就行。