Hexo的搭建和后续优化等踩坑经验记录

为什么要做这个网站

1.把每天的知识感想记录下来,缓解自己的知识焦虑感,也给其他人一个看到自己想法的机会。

2.可以把自己很多的数据资料等安心的放在这里保存,作为自己的一个小窝。

曾经有过的设想

1.提供RSS浏览功能

2.TOP10新闻,天气,股票等

3.相关资讯推送

4.网盘能力

5.表情包的存放库

只能说想的很美好,但是实际上实践有点困难,都是黑历史QAQ,当然不排除以后有机会实现这些

如何建站

建造工具的选择

1.动态网站:网站的交互性比较强,有登录注册评论等这些功能。这类网站的制作工具主要是Typecho、Wordpress等。

​ 好处:这类网站的制作工具功能十分齐全和强大,且只要有网就可以随时随地连接上自己的数据库进行对博客的管理和更新。

​ 坏处:需要一个数据库,这就意味着需要花一定的金钱成本。

2.静态网站:整个网站是静态的,没有过多的交互。如github pages

​ 好处:简单方便

​ 坏处:交互性没动态网站强

从个人用户的角度来看,我们直接选择静态网站即可,简单也方便,网上教程也十分多。

服务器和域名

网站离不开服务器和域名。服务器是网站文件寄托的位置,而域名就是一个网站的地址。

服务器我们可以选择国内各大云服务器服务商的,如阿里云、腾讯云等等。

也可以选择代码托管平台。这些代码托管平台提供了一个网站代码存放的位置。对于自己的钱包而言,我更推荐放在托管平台上面,免费。如果你想用钱换更快的速度,那也可以选择前者。

托管平台
Github Pages(最常用)
Netlify
Vercel
Coding(国内)

而域名,如果个人要求不高,可以直接使用免费的github pages的 默认用户名+.github.io 这么一个域名,而如果你嫌弃这个名字实在太长,也可以去国内各大云服务提供商买个域名,现在域名都很便宜了。

所以基本上参考了很多资料。使用的是Hexo+Github Pages+Next+Typora。非常常规。

在开始之前

因为Hexo是把Markdown转化为Html的,你需要对Markdown的语法有一定的了解。但不用担心,Markdown的语法十分简单,很容易上手。

当然在Hexo中也可以直接用html的语法来书写内容,可以拿html语法代替markdown。因为hexo就是为了把简单的markdown转化为复杂的html而存在的。

从对后面维护blog的角度来说,更希望各位能对html有一定的知识,对修改blog内的原始文件如swig和添加css代码等有很大的帮助

开始

从我懵懵懂懂一点知识都没有接触到后面完善blog以来,我都是利用下面这些文章一点一点把自己网站建了起来。很多问题我相信你都可以在接下来这些文章里找到答案。

参考的他人文章

点击展开折叠内容

搭建Hexo博客中遇到的那些“坑”_Chak Aciano的博客-CSDN博客_validating config

Hexo+github搭建个人博客 | 武师叔

hexo史上最全搭建教程 - JS脚本 - 博客园

Hexo的常用指令合集_连接数据库的博客-CSDN博客_hexo命令

Hexo博客的搭建及NexT主题一些问题的解决方案_sixsheep17的博客-CSDN博客

hexo-theme-next/README.cn.md at master · iissnan/hexo-theme-next

Hexo_更换主题(Next)_CHN_Joker的博客-CSDN博客_hexo更换主题

Hexo博文加密思路总结_程序员在旅途的博客-CSDN博客_hexo加密

【Hexo】nexT主题使用攻略基础——添加分类、标签及关于_离明zh的博客-CSDN博客_hexo next 标签

【个人网站搭建】GitHub pages+hexo框架下为next主题添加分类及标签_wangqingchuan92的博客-CSDN博客

hexo之next主题添加分类 - 简书

hexo之next主题优化篇2_CoderCXF的博客-CSDN博客

hexo之next主题优化篇1_CoderCXF的博客-CSDN博客_# a button to open designated chat widget in sideb

hexo博客常用插件及教程_幻凡ss的博客-CSDN博客

Hexo中插入图片和音乐的几种方式_sunfove的博客-CSDN博客_hexo插入图片

Hexo-设置阅读全文 - 百度文库

Hexo博文置顶(自定义排序) - 灰信网(软件开发博客聚合)

书签分类栏报错

hexo插件推荐 - Happen’s Blog

Typora 常用快捷键大全_一&粟的博客-CSDN博客_typora快捷键

Markdown常用语法汇总 - 知乎

解决Hexo博客模板hexo-theme-next的翻页按钮不正常显示问题 - xiejava - 博客园

Hexo-NexT 设置博客背景图片 | 小丁的个人博客

小标题美化

hexo添加动态背景 | 别样

为Hexo添加Valine评论系统_昕zqx的博客-CSDN博客_hexo valine

Chrome浏览器提示您的连接不是私密连接解决办法_孤寂的游魂的博客-CSDN博客_您的链接不是私密链接,攻击者可能会窃取您的信息谷歌

hexo 发布之后 gitpage 自定义域名失效_许许盛的博客-CSDN博客

Hexo的SEO优化-使用abbrlink设置永久链接为随机值 - 腾讯云开发者社区-腾讯云

hexo-tag-bilibili 通过BV号获取嵌入代码

【图床搭建】腾讯云COS+PicGo+Typora图床搭建_lonelysnowman的博客-CSDN博客_腾讯图床

up2b: 图床支持

Typora+路过图床实现插入图片即上传图床_蒋楼丶的博客-CSDN博客_路过图床

Hexo 双线部署到 Coding Pages 和 GitHub Pages 并实现全站 HTTPS_ITBOB • 鲍勃的博客-CSDN博客_coding pages

终于解决了hexo开启懒加载后图片无法立即显示的问题_东曜的博客-CSDN博客_hexo首次加载页面问题

npm常用命令(npm install --save 和npm install --save-dev的区别)_陈坚泓的博客-CSDN博客

WordPress B站和A站视频插入文章 - 简书

本博客当前使用的插件总结 | 小丁的个人博客

Hexo添加自定义分类菜单项并定制页面布局 | Finisky Garden

Hexo添加自定义分类菜单项并定制页面布局 - 知乎

同时支持置顶和隐藏文章的 hexo 生成器插件(hexo-generator-index-custom)_0o酱的博客-CSDN博客_hexo generatur index

自己写的文章

点击展开折叠内容

如何给自己的博客添加404页面

如何备份hexo源文件到github上

Hexo添加自定义菜单栏

Next主题加载速度优化

Hexo博客日常操作自动化部署

解决一下Hexo首页简介的一些bug

关于网站图片上传的几种方法和优化

关于域名白嫖

Next5.1.4更新至8.2记


个人一些杂碎笔记的集合

点击展开折叠内容

这些篇幅较短,就不单独每个都开一个md文件写一篇博客了,直接把这里作为一些简短笔记的集合。

1.要注意常用多用hexo cl这条命令,有时候不清理之前的缓存很有可能弄乱全部的文件,在部署之前都最好先用一用。


2.在安装了主题后不能使用是因为hexo5.0之后删除了swig,需要自己安装。


3.在github的库中是main而不是master目录,记得在_config.yml中branch: 一栏的master改为main


4.在部署之后github会审核一次才会更新内容,需要等待,审核过程可以在仓库的action一栏查看过程。只有三个绿才会更新网站。


5.实际上hexo中心在本地,只是提交到了Github上,所以其部署过程全按照你本地的文件来部署,你本地是多少上面仓库就会变成和本地一样,你在本地删了文件仓库也会删掉那个文件。所以删文章是在本地进行,然后再部署就行了。


6.在建站时部署前可以开hexo s命令监测,如果有什么错误可以第一时间排查解决,否则很难一个一个扒开来看。


7.背景头像等图网上的教程都是插入本地图片,这样上传到github上打开很慢,建议把图片文件改为图床里的url,能加快速度(只要在相应的配置文件下的命令下)

1
XXX: url()

在括号内输入自己的图片外链或者本地图片路径(不推荐本地图片,速度慢)(如用本地图片路径则填的路径是/image/XXX.jpg,前面的绝对路径不用写)


8.每次上传到github上,自己的自定义域名总是不绑定,可以在source文件夹下面新建一个名叫CNAME的txt,在里面写入自己的域名

image-20230112140015961

然后保存去掉后缀名image-20230112140027991

这样之后hexo d上传不会再需要手动加自定义域名


9.查看自己的hexo安装了多少插件和如何删除

hexo插件安装路径在根目录下的node_modules文件夹里面含有全部插件和自己的一些依赖包,插件都是hexo-XXXXX开头的

卸载就是和npm install一样,命令改为

1
npm uninstall

记得查看一下残留在根目录和主题的_config.yml内的插件内容

和文章md文件开头插件所添加的一些信息


10.在博客内嵌入视频:

首先是b站,可以在旧版网页版中点分享获取嵌入代码

如果是自己的视频可以在自己的创作中心中点要嵌入的稿件的分享按钮获取嵌入代码

YouTube则更简单,点开任意一个视频右键获取嵌入代码即可

其他平台大同小异,核心是获取嵌入代码(即iframe代码)。

在markdown文章中编辑嵌入视频的大小:只要在代码内加入width=XXX height=XXX(X为数值)即可调整大小。

在F12调试工具中打开这个点击网站中想要分析的部分,会跳到html相关部分的源代码。比如点击视频也许就有机会直接找到外链,下载视频。

image-20230127233429570

成功案例

image-20230127234245559


11.让博客首页文章摘要只显示图片和空白

image-20230116191755964

next的文章摘要会跳过图片而直接把文字放在摘要,如果要只显示一张图片,只需开头插入图片,在图片底下输入

1
<!-- more -->

这是手动断阅读摘要选取长度的标志,往后面的文字就不会显示在首页文章摘要了。发现网络上很多文章里这条命令都是错的,或者格式不对。–后和–前都应该是有一个空格才对。

如果这条命令输入正确的话,在Typora里面这条命令会变成蓝色。

如果想让文章显示空白简介的话,在文章第一行打几个空格,然后第二行打more截断,让next以为你有内容

1
2
      
<!-- more -->

折叠内容为Next 5.1.4旧版本适用,新版本可掠过

12.next图标(Next 5.1.4旧版本适用

next用的是FontAwesome的图标库,先确定next主题内的FontAwesome版本

1
打开themes\next\source\lib\font-awesome\css\font-awesome.css

image-20230218085621589

我的是4.7版本,打开https://fontawesome.dashgame.com/,选择自己的版本

image-20230218085734003

选择自己喜欢的图标点击右边的复制使用,但会发现用不了。其实只要把复制的名字中的"fa-"部分去掉就行了,只需要后面的部分。比如fa-buth就要改成单独的buth

Next 8新版本

在引用图标时候不要去掉fa-,直接在fa-xx前面加个fab,格式为

fab fa-xx


13.next主页文章摘要,文章内文字分行但摘要不换行

image-20230218090334968

在md文件内要换行的地方加上

1
<br>

有时候用br标签不管用,在后面加

1
<!-- more -->

14.(Next旧版本5.1.4才适用,新版本已修复

hexo的next主题,在点击头像下面的日志时无法正常跳转,显示cannot get archives%7C%7C%20archive

打开/themes/next/layout/_macro/sidebar.swig,找到这里

1
2
3
4
5
6
7
8
9
10
11
12
{% if config.archive_dir != '/' and site.posts.length > 0 %}
<div class="site-state-item site-state-posts">
{% if theme.menu.archives %}
<a href="{{ url_for(theme.menu.archives).split('||')[0] | trim }}">
{% else %}
<a href="{{ url_for(config.archive_dir) }}">
{% endif %}
<span class="site-state-item-count">{{ site.posts.length }}</span>
<span class="site-state-item-name">{{ __('state.posts') }}</span>
</a>
</div>
{% endif %}

改为

1
2
3
4
5
6
7
8
{% if config.archive_dir != '/' and site.posts.length > 0 %}
<div class="site-state-item site-state-posts">
<a href="{{ url_for(config.archive_dir) }}">
<span class="site-state-item-count">{{ site.posts.length }}</span>
<span class="site-state-item-name">{{ __('state.posts') }}</span>
</a>
</div>
{% endif %}

也就是把原来的第3、4、5、7行删掉。


15.(next旧版本才适用,新版本已修复该bug

next文章点目录树不跳转打开F12点击目录树显示错误

image-20230218143259682

找到\themes\next\source\js\src\post-details.js,打开文件

找到文件的72行左右

1
2
3
4
$('.post-toc a').on('click', function (e) {
e.preventDefault();
var targetSelector = NexT.utils.escapeSelector(this.getAttribute('href'));
var offset = $(targetSelector).offset().top;

在第三行下加一行代码,变为

1
2
3
4
5
$('.post-toc a').on('click', function (e) {
e.preventDefault();
var targetSelector = NexT.utils.escapeSelector(this.getAttribute('href'));
targetSelector = decodeURI(this.getAttribute('href'))
var offset = $(targetSelector).offset().top;

这样点击目录树可以跳转了。


16.(是Next5.1.4旧版本的权宜之计,在更新Next 8新版本后问题得到解决。强烈推荐更新)

文章目录只显示同级目录,不能显示多级目录

语法要求是:在写md文件的时候标题有h1到h6,目录之间不能跳级跨级。比如h1就后面只能h2,不能h1下面接着h3。

同时,next5.1.4版本有Bug,当目录名为中文的时候就无法展开下一级目录。这个目前还无法修复,只能暂时使用英文来代替,或者用html语言跳转方法绕过bug

先在要跳转到的位置写上

1
<a id=""></a>  在""之间写一个任意的跳转ID

文章显示的时候不会把这串代码显示出来,所以直接在后面写你自己跳转显示部分的内容就行了。

在设置跳转按钮的地方写上

1
[链接名称](#锚点id)   链接名称任意选,id面前记得有一个#号

17.新版本Next已经支持内置显示文章更新时间

显示文章更新时间

只有发布时间其实是不够准确的。我们需要一个能够显示更新时间功能。

1
打开themes\next\layout\_macro\post.swig

找到这段

1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="post-meta">
<span class="post-time">
{% if theme.post_meta.created_at %}
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
{% if theme.post_meta.item_text %}
<span class="post-meta-item-text">{{ __('post.posted') }}</span>
{% endif %}
<time title="{{ __('post.created') }}" itemprop="dateCreated datePublished" datetime="{{ moment(post.date).format() }}">
{{ date(post.date, config.date_format) }}
</time>
{% endif %}

改为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<div class="post-meta">
<span class="post-time">
{% if theme.post_meta.created_at %}
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
{% if theme.post_meta.item_text %}
<span class="post-meta-item-text">{{ __('post.posted') }}</span>
{% endif %}
<time title="{{ __('post.created') }}" itemprop="dateCreated datePublished" datetime="{{ moment(post.date).format() }}">
{{ date(post.date, config.date_format) }}
</time>
{% endif %}
{%if post.updated and post.updated > post.date%}
<span class="post-updated">
&nbsp; | &nbsp; {{ __('post.updated') }}
<time itemprop="dateUpdated" datetime="{{ moment(post.updated).format() }}" content="{{ date(post.updated, config.date_format) }}">
{{ date(post.updated, config.date_format) }}
</time>
</span>
{% endif %}
1
再打开\themes\next\languages\zh-Hans.yml

在post栏处加上一行

1
2
post:
updated: 更新于
1
再打开\themes\next\_config.yml

文件最后处加上

1
display_updated: true


18.在hexo-asset-image的加持下快速插入多张本地图片

直接将本地图片拖入相对应的文件夹内,然后把图片拖入typora中。这时直接拖图片进来显示的路径是绝对路径。在Typora中打开源代码模式全选复制

再把复制到word中,利用word的“替换”功能,把绝对路径前面部分替换成无

image-20230405232551149

再把代码拖入typora即可


19.Hexo对花括号的支持很差,很容易出问题,能不在md文件中使用花括号就不使用。否则有可能出现hexo d部署之后文章只显示一部分的bug。


20.hexo-blog-encrypt这个博文密码加密插件,在使用next主题的情况下,加密博文打开后不会有目录树功能。如果需要修复,除非更换别的主题,或者更换博文密码插件。


21.在md编辑器中打一行空格实际上在网页里是没有空行的,要做出空行来,请在空行输入

1
<br>

22.在除了侧边栏以外区域显示文章目录:

安装插件

1
npm install hexo-toc --save

再在config里加以下内容

1
2
3
4
5
6
7
8
9
toc:
maxdepth: 3
class: toc
slugify: transliteration
decodeEntities: false
anchor:
position: after
symbol: '#'
style: header-anchor

接着直接在md文章内要显示文章目录的地方加上

1
<!-- toc -->

这个显示的效果等效于在csdn许多文章开头显示的的内容目录。

但是使用这个插件会和next侧边栏的目录冲突,导致Next的侧边栏目录树不能正常跳转

可以使用这个插件的修改版:https://github.com/erictt/hexo-toc-dllcn ,防止了和next侧边栏导航的冲突。

安装插件(记得先卸载上面的原hexo-toc插件):

1
npm i @dllcnx/hexo-toc

在根目录的config文件下添加

1
2
3
4
5
6
7
mdtoc:
maxdepth: 3
class: toc
decodeEntities: false
anchor:
symbol: '#'
style: header-anchor

用法和原hexo-toc一样,都是在文章需要添加目录的地方输入

1
<!-- toc -->

Next文章目录的标题开头第一个字不要使用特殊符号,否则有可能造成无法点击目录树跳转。

但是使用这个插件的时候会有几个问题。

第一个是标题内英文必须全小写,否则无法跳转。同时基本上标题几乎不能有任何标点符号,否则都有可能无法跳转。


或者使用其他markdown生成toc目录的项目,github上面有很多,比如markdown-toc,但是hexo-toc插件比这些项目都更傻瓜化,使用方法更简单。

next自带的目录树会自动在目录前面加数字,因为个人更喜欢自己添加序号,不太喜欢这个功能

可以在config里面关闭自动添加数字

把number一项改为false

同时,expand_all: true可以让文章的目录默认全部展开


23.关于在typora内写文章

在一行文字后回车,下一行的文字和上一行的文字会有间隔,取消间隔的办法是shift+回车,这样上下行之间就没有间隔了。


24.在文中折叠部分内容

格式如下:

1
2
3
4
<details>
<summary>点击展开折叠内容</summary>
****
</details>

第一个<summary>标签前要打四个英文空格
在两个<summary>标签之间写折叠的提示信息
第三行****处意味着要写入的被折叠信息。可以多行等操作。

这个格式,被折叠的内容是默认折叠的,如果要默认展开,则把<details>改为<details open>

也可以使用插件,我觉得不好用

https://github.com/fletchto99/hexo-sliding-spoiler


25.在markdown内,可以用`来显示代码段内容,使其在文章中更为凸显。

效果展示:一个函数 print()

用法:

1
`print()`

26.有时想修改博文但是由于post文件夹内的md文件名都是随便起的,找到对应的md文件总需要很多时间。

可以在备份到github上的hexo原文件的仓库来查找,复制对应博文的一部分文字到搜索栏中搜索即可。



关于插件

hexo本身有很多的插件可以使用,你可以根据自己的情况来下载一些自己喜欢的插件来完善自己的网站。

https://hexo.io/plugins/


最后

建完网站,以为这就结束了?比建站几十分钟的时间耗费来看,后期维护和完善blog所要耗费的时间会比这多更多,希望你能靠自己,努力向前探索。