目录

博客搭建过程(二)

摘要
这是博客搭建过程记录文章的第二篇。

博客搭建过程_1


信息
由于我的懒惰,拖延,以及效率低下,博客搭建从4月份搞到了8月份才基本完成,现在记录一下这个过程。

1 静态博客搭建(Hugo)

选择Hugo的原因前面有写,没想到本来以为很简单的静态博客也会遇到坑,无语,还是自己太菜了啊。

1.1 Hugo本地安装

  1. 首先通过homebrew安装Hugo
  2. 然后通过hugo version命令检查一下Hugo的版本。
  3. 然后是通过hugo new site <blog> 命令生成项目目录。
  4. 然后是安装主题,这是必须的。
  5. 通过Git安装比较方便,要先在Github上创建一个仓库,用来存放博客源文件。
  6. 然后执行git init命令。
  7. 然后安装主题(这里用的是Anubis主题)。 git submodule add https://github.com/mitrichius/hugo-theme-anubis.git themes/anubis
  8. 安装后需要启用主题,方法是将主题名称写入到根目录下的默认配置文件 config.yml 中echo 'theme = “anubis”’ >> config.toml
  9. 现在可以生成第一篇文章了hugo new posts/my-first-post.md
  10. 想本地看的话,就执行 hugo server,然后去1313端口查看,不过要把markdown里的draft改成false

1.2 托管到Github Pages(后期放弃)

  1. 发布到GitHub Pages上去,稍微有点复杂,容易踩坑。

  2. 先去GitHub上再建一个仓库,名字有要求,不想花钱就得public

  3. 这里有个超级大坑,就是静态目录的仓库创建的时候,不能是空仓库,不然之后添加Git子模块会报错,手动搞非常麻烦,解决方法是创建的时候,选择添加readme文件。

  4. 然后把配置文件里的baseUrl改成自己的地址,很容易忘记。

  5. 先去到项目文件夹,这个时候只有git init,没有添加远程仓库git remote add origin XXX.git

  6. 然后推送一波:

    git init

    git remote add origin https://github.com/Github 用户名/Github 用户名.github.io.git

    git add .

    git commit -m '[介绍,随便写点什么,比如日期]'

    git push -u origin master

  7. 然后如果你这个时候,生成了public文件夹,要先删掉,这一步不能少。

  8. 然后执行 git submodule add -b main https://github.com/<USERNAME>/<USERNAME>.github.io.git public

  9. 如果远程仓库是空的,会失败。

    1
    2
    3
    
    warning: You appear to have cloned an empty repository.
    fatal: 'origin/main' is not a commit and a branch 'main' cannot be created from it
    Unable to checkout submodule 'public'
    
  10. 如果之前创建仓库的之后,添加了readme文件就不会有这个问题。

  11. 然后编辑自动执行脚本,运行,成功!



1.3 实现博客的中英文切换

  • 首先,Hugo本身是支持多语言的。
  • 如果用的主题,原生不支持多语言的话,关键在于HugoTOML配置文件的修改,可以实现博客整体的多语言切换。
  • 某一篇文章单独的双语言切换,需要主题的原生支持。
  • 例如,我最开始用的主题,Anubis,支持全站的语言切换,但是不支持单独一篇文章的语言切换,后来联系作者,他表示需要他做一些工作,然后就可以单篇文章切换语言。

1.4 主题变更

  • 一开始我用的是一个在Hugo主题网站随便找的一个比较简洁的主题,叫Anubis,但是过于简单,主要还是多语言这里做的不是太好。
  • 后面试过Eureka,也是一个非常不错的主题,不过设计这块没有戳中我。
  • 最终选择了LoveIt,一个非常强大非常灵活的主题。

1.5 LoveIt主题报错无法使用

  • 大坑报错什么failed to render pages

1.6 托管到Vercel

  • GitHub Pages托管简单,但是有国内访问慢,不容易被百度收录等问题,可考虑其他托管平台,例如Vercel或者Netlify,查了点资料似乎前者更好。

  • 经实际测验,同时部署的情况下,Netlify的DNS会优先于Vercel,遂放弃Netlify

  • 值得注意的是,VercelHugo版本比较低,不支持LoveIt主题,需要手动指定一下,在项目根目录添加vercel.json 文件,并加入以下内容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "github": {
    "silent": true
  },
  "build": {
    "env": {
      "HUGO_VERSION": “0.84.1”
    }
  }
}

  • Netlify也是一样的问题 在项目根目录添加netlify.toml 文件,并加入以下内容。
1
2
3
4
5
[context.deploy-preview.environment]
  HUGO_VERSION = “0.84.1”

[context.production.environment]
  HUGO_VERSION = “0.84.1”

1.7 托管后国内无法访问

  • 解决国内无法访问的问题,关键在于添加的域名,要带www,然后把阿里云的解析,解析道VercelDNS,而不是IP地址,可实现国内正常访问,自带Https,舒服。

1.8 Valine评论系统异常

  • 还要解决一个Valine评论异常:Code 403: 访问被API域名白名单拒绝,请检查你的安全域名设置,原因是Valine评论基于LeanCloud,主题里默认用的是别人的账户,没有自己注册,自然不在别人的白名单里。

  • Valine有隐私问题,目前尚未解决,但是可以手动处理一下,实测已经可以用了。

1.9 更换Waline评论系统

  • Valine许久不更新,还有各种各样的问题,决定换成Waline,毕竟是为了解决Valine的问题而生,而且更好看一点。
参考
  • serverUrl不要忘了https://,不然不行。。。
  • 多语言支持,页面顶部的评论数没有修改,需要改一下。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{{- if $comment.enable | and $comment.waline.enable | and $comment.waline.visitor -}}
     <span id="{{ .RelPermalink }}" class="leancloud_visitors" data-flag-title="{{ .Title }}">
     				<i class="far fa-eye fa-fw"></i>&nbsp;<span class=leancloud-visitors-count></span>&nbsp;{{ T "views" }}
      </span>
      {{- if eq $comment.waline.lang "en" -}}
           <a href="#comments" id="post-meta-vcount" title="{{ T `viewComments` }}">
                  <i class="fas fa-comment fa-fw"></i>&nbsp;<span id="{{ .RelPermalink }}" class="waline-comment-count"></span>&nbsp;comments
           </a>
       {{ else }}
           <a href="#comments" id="post-meta-vcount" title="{{ T `viewComments` }}">
                	<i class="fas fa-comment fa-fw"></i>&nbsp;<span id="{{ .RelPermalink }}" class="waline-comment-count"></span>&nbsp;条评论
           </a>
        {{- end -}}&nbsp;
{{- end -}}
  • 下一步是改评论框的样式,现在这样太丑了,原来Valine的样式比较好看,而且支持明暗主题变化,写在后面。

1.10 LoveIt主题样式修改

注意
LoveIt的主题样式修改,其实可以通过根目录新建文件实现,因为文件的优先级不同,但是我这里基本上都是修改原有主题文件,两种方式都可以,看个人喜好。

1.10.1 图标删除

  • 删除主页的头像,配置文件中avatarURL = ""即可。
  • 删除页脚主题的图标,找到/themes/LoveIt/layouts/partials/footer.html这个文件,删除15行的标签<i class="far fa-kiss-wink-heart fa-fw"></i>即可。
  • 删除文章作者前的头像图标
    • 删除/themes/LoveIt/layouts/_default/summary.html中第30行的”Icon" (dict "Class" "fas fa-user-circle fa-fw")
    • 删除/themes/LoveIt/layouts/_default/single.html中第36行的"Icon" (dict "Class" "fas fa-user-circle fa-fw")
  • 删除标签页的图标,去到/themes/LoveIt/layouts/partials/link.html,把417行的href后的路径全部干掉即可。

1.10.2 许可证协议更改

  • 协议链接改为https://creativecommons.org/licenses/by-nc-nd/4.0/

1.10.3 背景颜色修改

  • 感觉浅色主题背景颜色太白,刺眼,改灰一点
    • 修改/themes/LoveIt/assets/css/_variable.scss中的13行颜色变量即可,改成#f1f0f0
    • 再把/themes/LoveIt/assets/css/_variable.scss中第56行的Header颜色加深一点,改成#f9f9f9
  • 感觉深色主题背景颜色不好看,模仿少数派
    • 修改/themes/LoveIt/assets/css/_variable.scss中的14行颜色变量即可,改成#232222
    • 再把/themes/LoveIt/assets/css/_variable.scss中第57行的Header颜色加深一点,改成#2F2D2D

1.10.4 字体修改

  • 字体大小修改
    • 把页面标题的字体改大一点
      • /themes/LoveIt/assets/css/_page/home.scss中第116行,改成1.6rem
      • /themes/LoveIt/assets/css/_page/_single.scss中第6行,改成1.8rem
    • 把副标题的字体改小一点,主题的/themes/LoveIt/assets/css/_page/_home.scss文件里中第34行,修改为font-size: 2rem;
    • 把作者名字字体改小一点,/themes/LoveIt/assets/css/_page/_single.scss中的第34行,改成0.875rem
    • 把文章目录字体改小一点,/themes/LoveIt/assets/css/_variable.scss中的第75行,改成0.8rem
    • 把菜单字体改粗一点,/themes/LoveIt/assets/css/partial/_header.scss中的第50行,增加font-weight: 400;
  • 字体粗细修改
    • 正文字体改细一点,修改/themes/LoveIt/assets/css/_variable.scss中的9行字体粗细即可,改成300
    • 首页标题字体改细一点,/themes/LoveIt/assets/css/_home.scss中的119加入font-weight: 400;
    • 单篇文章标题字体改细一点,/themes/LoveIt/assets/css/_page/_single.scss中的第7行改成font-weight: 400;
  • 字体颜色修改
    • 暗色背景下,把字体颜色改亮一点,修改/themes/LoveIt/assets/css/_variable.scss中的18行字体颜色即可,改成#B6B6B6
    • 浅色背景下,修改摘要字体颜色,注释/themes/LoveIt/assets/css/_home.scss中的130行即可

1.10.5 标题目录修改

参考
通过写_custom.scss实现,基本靠雨临大佬的博客。
  • /themes/LoveIt/assets/css/_single.scss中的第106行到108行,111行,117行全部注释掉

  • /themes/LoveIt/assets/css/_partial/_single/_toc.scss中的17行注释掉,28行改成padding-left: 1rem;

  • 这里是我的_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
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
// ==============================
// Custom style
// 自定义样式
// ==============================
/* 文章元数据meta */

// 修改二级标题样式(背景、颜色)
.page.single h2 {
  font-weight: bold;
  line-height: 1.3;
  padding: 5px;
  margin: 18px 0px 18px -5px !important
}

[theme=dark] .page.single h2 {
  color: #fff;
}

// 修改三级标题样式(背景、颜色)
[theme=dark] .page.single h3 {
  color: rgba(255, 255, 255, 0.9);
  line-height: 1.3;
}

[theme=light] .page.single h3 {
  line-height: 1.3;
}

// 修改四级标题样式(颜色)
[theme=dark] .page.single h4 {
  color: rgba(255, 255, 255, 0.8);
}

// 修改目录样式
nav#TableOfContents ol {
  padding-inline-start: 30px
}

nav#TableOfContents ol ol {
  padding-inline-start: 15px;
  font-size: .75rem;
  display: none
}

nav#TableOfContents ol li.has-active ol {
  display: block
}

/* 子菜单栏 */
.dropdown {
  display: inline-block;
}

/* 子菜单的内容 (默认隐藏) */
.dropdown-content {
  display: none;
  position: absolute;
  background-color: #f9f9f9;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  border-radius: 4px;
  line-height: 1.3rem;
}

/* 子菜单的链接 */
.dropdown-content a {
  padding: 10px 18px 10px 14px;
  text-decoration: none;
  display: block;

  & i {
    margin-right: 3px;
  }
}

/* 鼠标移上去后修改子菜单链接颜色 */
.dropdown-content a:hover {
  background-color: #c5c5cb;
  border-radius: 4px;
}

/* 在鼠标移上去后显示子菜单 */
.dropdown:hover .dropdown-content {
  display: block;
}

// 博客菜单栏修改
@media screen and (max-width: 680px) {
  .dropdown {
    display: inline;
  }
  .dropdown:hover .dropdown-content {
    display: inline;
    z-index: 1;
    margin-top: -2em;
    margin-left: 3em;
  }
  .dropdown-content a:hover {
    background-color: transparent;
  }
}

1.10.6 Waline评论框样式修改

  • LoveIt主题默认不支持Waline,需要手动加入。

  • 默认的Waline,样式不是很喜欢,想改成默认Valine的样式。
注意
这里如果把样式写在_custom.scss文件里是不会生效的,至少我这里是这样,会被覆盖,不知道如何解决,只能去修改引入的Waline.min.js,配置文件里的路径为https://cdn.jsdelivr.net/npm/@waline/client/dist/Waline.min.js,把这个文件下载下来,修改完再上传到某个地方,重新引入配置文件即可(我用的是阿里云OSS)。

  • 修改评论框背景:删除.v[data-class=v] .vpanel {}中的background: var(--waline-bgcolor);
  • 修改输入框高亮:删除.v[data-class=v] .veditor:focus, .v[data-class=v] .vinput:focus {}中的background: var(--waline-bgcolor-light);
  • 修改字体颜色:删除:root {}中的--waline-text-color: #444;
  • 修改评论者名称颜色:删除v[data-class=v] .vcard .vhead span.vnick {}中的 color: var(--waline-dark-grey);

1.10.7 增加二级菜单


1.10.8 添加站点运行时间

大佬的博客中只给出了中文的站点运行时间,这里给出根据主题切换的中英文站点运行时间。


custom.js文件

 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
37
38
39
40
41
42
43
44
45
46
47
48
49
/* 中文站点运行时间 */
function runtime_zh_cn() {
    window.setTimeout("runtime_zh_cn()", 1000);
    /* 请修改这里的起始时间 */
    let startTime = new Date('08/08/2021 20:00:00');
    let endTime = new Date();
    let usedTime = endTime - startTime;
    let days = Math.floor(usedTime / (24 * 3600 * 1000));
    let leavel = usedTime % (24 * 3600 * 1000);
    let hours = Math.floor(leavel / (3600 * 1000));
    let leavel2 = leavel % (3600 * 1000);
    let minutes = Math.floor(leavel2 / (60 * 1000));
    let leavel3 = leavel2 % (60 * 1000);
    let seconds = Math.floor(leavel3 / (1000));
    let runbox = document.getElementById('run-time-zh-cn');
    if (runbox) {
    runbox.innerHTML = '本站已运行 '
        + ((days < 10) ? '0' : '') + days + ' 天 '
        + ((hours < 10) ? '0' : '') + hours + ' 时 '
        + ((minutes < 10) ? '0' : '') + minutes + ' 分 '
        + ((seconds < 10) ? '0' : '') + seconds + ' 秒 ';
    }
}
runtime_zh_cn();

/* 英文站点运行时间 */
function runtime_en() {
    window.setTimeout("runtime_en()", 1000);
    /* 请修改这里的起始时间 */
    let startTime = new Date('08/08/2021 20:00:00');
    let endTime = new Date();
    let usedTime = endTime - startTime;
    let days = Math.floor(usedTime / (24 * 3600 * 1000));
    let leavel = usedTime % (24 * 3600 * 1000);
    let hours = Math.floor(leavel / (3600 * 1000));
    let leavel2 = leavel % (3600 * 1000);
    let minutes = Math.floor(leavel2 / (60 * 1000));
    let leavel3 = leavel2 % (60 * 1000);
    let seconds = Math.floor(leavel3 / (1000));
    let runbox = document.getElementById('run-time-en');
    if (runbox) {
    runbox.innerHTML = 'This website has been running '
        + ((days < 10) ? '0' : '') + days + ' days '
        + ((hours < 10) ? '0' : '') + hours + ' hours '
        + ((minutes < 10) ? '0' : '') + minutes + ' minutes '
        + ((seconds < 10) ? '0' : '') + seconds + ' seconds ';
    }
}
runtime_en();

footer.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
{{- if ne .Site.Params.footer.enable false -}}
    <footer class="footer">
        <div class="footer-container">

            {{- if eq .Site.Language.Lang "en" -}}
                <div class="footer-line">
                    <span id="run-time-en"></span>
                </div>

            {{- else if eq .Site.Language.Lang "zh-cn" -}}
                <div class="footer-line">
                    <span id="run-time-zh-cn"></span>
                </div>
            {{- end -}}
            

            {{- /* Custom Content */ -}}
            {{- with .Site.Params.footer.custom -}}
                <div class="footer-line">
                    {{- safeHTML . -}}
                </div>
            {{- end -}}

            {{- /* Hugo and LoveIt */ -}}
            {{- if ne .Site.Params.footer.hugo false -}}
                <div class="footer-line">
                    {{- $hugo := printf `<a href="https://gohugo.io/" target="_blank" rel="noopener noreffer" title="Hugo %v">Hugo</a>` hugo.Version -}}
                    {{- $theme := .Scratch.Get "version" | printf `<a href="https://github.com/dillonzq/LoveIt" target="_blank" rel="noopener noreffer" title="LoveIt %v">LoveIt&nbsp;&nbsp;</a>` -}}
                    {{- dict "Hugo" $hugo "Theme" $theme | T "poweredBySome" | safeHTML }}

            {{- end -}}


                {{- /* Copyright year */ -}}
                {{- if ne .Site.Params.footer.copyright false -}}
                    <i class="far fa-copyright fa-fw"></i>
                    {{- with .Site.Params.footer.since -}}
                        <span itemprop="copyrightYear">
                            {{- if lt . now.Year }}{{ . }} - {{ end }}{{ now.Year -}}
                        </span>
                    {{- else -}}
                        <span itemprop="copyrightYear">{{ now.Year }}</span>
                    {{- end -}}
                {{- end -}}

                {{- /* Author */ -}}
                {{- if ne .Site.Params.footer.author false -}}
                    <span class="author" itemprop="copyrightHolder">&nbsp;<a href="{{ $.Site.Author.link | default .Site.Home.RelPermalink }}" target="_blank">{{ .Site.Author.name }}</a></span>
                {{- end -}}

                {{- /* License */ -}}
                {{- with .Site.Params.footer.license -}}
                    &nbsp;|&nbsp;<span class="license">{{ . | safeHTML }}</span>
                {{- end -}}

                {{- /* ICP */ -}}
                {{- with .Site.Params.footer.icp -}}
                    <span class="icp-splitter">&nbsp;|&nbsp;</span><br class="icp-br"/>
                    <span class="icp">{{ . | safeHTML }}</span>
                {{- end -}}
            </div>
        </div>
    </footer>
{{- end -}}

1.10.9 增加标签页效果与点击效果

1.10.10 增加正文宽度

  • /themes/LoveIt/assets/css/_core/_media.scss 中的第 3 行与第 9 行,将宽度改为 150%

1.11 图片展示

  • 有两种方式,一是在文档的同目录下,建立images文件夹,把图片放进去,使用相对路径放到markdown中,这样的好处是编写的时候可以预览,缺点是部署到网页后,图片不会自适应,会保持原大小,居左。
  • 另一种方式是使用内置Shortcodesfigure标签,或者扩展Shortcodes中的image标签,图片必须放在assets目录下的images目录中,缺点是不能预览,好处是可以自适应。
  • 比较各种样式之后,选择figure
  • 【2021/11/15更新】figure标签不生效,需要使用image,原因未知。

1.12 显示数学公式

  • 不知道为什么,按照文档的默认方式无法显示数学公式。

  • 参考大佬的解决方法解决了这一问题。

  • /themes/LoveIt/layouts/partial/ 目录下,加入 mathjax.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
    29
    30
    31
    32
    33
    34
    35
    
    <script type="text/javascript"
            async
            src="https://cdn.bootcss.com/mathjax/2.7.3/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
    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"] }
      }
    });
    
    MathJax.Hub.Queue(function() {
        // Fix <code> tags after MathJax finishes running. This is a
        // hack to overcome a shortcoming of Markdown. Discussion at
        // https://github.com/mojombo/jekyll/issues/199
        var all = MathJax.Hub.getAllJax(), i;
        for(i = 0; i < all.length; i += 1) {
            all[i].SourceElement().parentNode.className += ' has-jax';
        }
    });
    </script>
    
    <style>
    code.has-jax {
        font: inherit;
        font-size: 100%;
        background: inherit;
        border: inherit;
        color: #515151;
    }
    </style>
    
  • 修改同一目录下的 header.html,第二行加入 {{ partial "mathjax.html" . }}


1.13 博客收录

  • Internet Archive收录自己的网站,比较简单

  • 让搜索引擎能检索到自己的网站,要先验证自己是网站所有者,要去DNS解析服务商那边提供验证,粘贴谷歌给的TXT,然后主题自带的sitemap,在谷歌的控制台上传即可。

  • 百度收录竟然要真实姓名,手机QQ微信等,不想弄了,就让百度搜索不到吧。


1.14 文章链接与SEO

  • LoveIt默认的文章链接使用标题,而中文标题会乱码且不利于SEO,所以使用slug的方式。

  • 先在配置文件里将Permalinks改成posts = “:slug.html”,然后在每篇文章的yaml头信息里添加slug即可。