认识 hexo
简单来说,就是一个博客框架。社区很活跃,里面有很懂框架可以直接使用和自定义。
更多详情,直接查看官网: https://hexo.io/zh-cn/docs/index.html
本地搭建 hexo 记录
1.git 安装:略
2.node.js 安装:版本 22,详情略
3.启动终端安装框架:npm install -g hexo-cli
4.初始化 hexo
1 | hexo init <folder> |
5.在 hexo 根目录终端输入: hexo server,启动程序,访问 http://localhost:4000/ 不报错即成功。
常用命令
1.在终端输入 hexo new page 导航栏名字,如:hexo new page about
配置 github pages
注意: 创建github 仓库的时候,必须要一个 README.md,不然会失败。
详情查看官网文档:https://hexo.io/zh-cn/docs/github-pages
进阶
- Netlify:https://www.cnblogs.com/codernie/p/9062104.html
- Vercel:https://www.cnblogs.com/aitec/articles/vercel.html
netlify 尝试
netlify 最大的优点是在GitHub仓库设置为私密的时候,依旧能使用,但是GitHub pages不能。
先说结论,不是很理想,对于githubpages的速度提升不是很大:
- 优点:netlify.app 可以过移动网的防火墙。
- 缺点:微信浏览器无法访问。
| 指标 | github pages | netlify |
|---|---|---|
| 国内访问速度(avg) 站长之家 | 2.044s | 3.588s |
| 国内访问速度(avg) itdog | 1.356s | 1.486s |
| 运营商访问 | 移动网无法访问 | 三大isp都可以访问 |
| 微信访问 | 可以访问 | 无法访问 |
国内访问速度是通过站长之家测试 站长工具>国内测速
站长之家测试数据详情如下:
具体操作步骤
提前说明,很简单,官网注册一个账号,使用github注册,绑定一个已有的blog项目,跟着指引走就可以了。
时间有点老,但是能用:https://blog.grin.cool/blog/hexo-blog
注意:
github pages 和 netlify 使用同一个分支,会冲突。
尝试将 github pages 关闭,但是由于不想删除 .github\workflows\pages.yml ,导致一直关不掉。
于是重新修改逻辑,将 github pages 所需的静态文件放在分支 blog_pages 里面,再在 仓库中,按如下设置,
修改分支:Settings > Pages > Build and deployment > Branch> Deploy from a branch > blog_pages > /(root)
同时在仓库设置中启用工作流写入权限:
- 访问仓库的 Settings > Actions > General
- Workflow permissions 部分:
- 选择 Read and write permissions
- 勾选 Allow GitHub Actions to create and approve pull requests
修改page.yml 文件的内容为:
1 | name: Pages |
备注:
page.yml 文件内容是 deep seek 生成的,具体的意思和语法需要查看 github actions 的语法。
gitalk 登陆失败
如图:
解决方法:
在 github 的仓库中,Your Avatar > Settings > Developer settings > OAuth Apps > Your_App_Name
里面有 Homepage URL 和 Authorization callback URL ,将其改为 xx.netlify.app 的地址
总结:gitalk 只能绑定一个域名地址;
Vercel 尝试
由于 Vercel 国内被屏蔽掉了,必须要有域名,由于想白嫖,所以暂时不考虑
使用 theme
详情参考:https://butterfly.js.org/
配置评论系统
giscus
详情参考:https://zhuanlan.zhihu.com/p/603658639
gitalk
giscus 无法使用最新评论外挂模块,转 gitalk,具体详情参考:https://www.cnblogs.com/qisi007/p/13731562.html
https://www.summer889.com/2024/11/12/%E6%9C%89%E7%9A%84%E6%B2%A1%E7%9A%84/hexo%E5%8D%9A%E5%AE%A2%E8%AF%84%E8%AE%BA%E5%8A%9F%E8%83%BD/
注意:
gitalk 文件名不能有中文,不然会失效
twikoo
后面有时间在实践
https://niezicheng.github.io/blog-hexo/posts/a77c77c/
配置文章的路由
Add plugin to Hexo:
1 | npm install hexo-abbrlink --save |
Modify permalink in config.yml file:
1 | permalink: posts/:abbrlink/ |
Configs in _config.yml:
1 | # abbrlink config |
样本
The generated link will look like the following:
1 | crc16 & hex |
1 | crc32 & hex |
参考
遇见的问题
md 文档中图片相对路径失效
网上攻略多数都是,hexo的图片默认不支持相对路径。需要配置 post_asset_folder 选项,设置从false改成true之后支持。但是要求图片目录必须和文件名相同。
如:
1 | . |
极其不方便,然后发现有人专门写了插件,可以看原文:https://www.cnblogs.com/mlzrq/p/16099460.html
亲测可行
这个插件可以把图片可以为hexo的_posts目录下的任意目录下的资源图片,文章内可以使用相对路径引用,在模板渲染时,插件会将相对路径的图片转为inline模式,以base64编码直接在html内引用。这样就不会出现目录问题。
使用方式
- 安装插件:
安装命令如下
1 | npm i hexo-filter-inline-image |
- 配置hexo启用插件
_config.yml 增加以下配置
1 | inline_image: |
compress 是否启用图片压缩
remote 是否转换http和https图片,默认关闭
limit 限制图片大小(kb)在此以内才会进行转换
注意:
由于本身Hexo带有缓存会导致插件第一次使用可能会出现无效果,请使用hexo clean清除缓存后即可正常使用
giscus 评论失败
报错:未找到相关的 Issues 进行评论 请联系 @coder-xuyong 初始化创建
本地尝试登陆评论失败
上传到github 后,使用 https://coder-xuyong.github.io 登陆评论,成功!
特殊的md语法
md中引用其他md文件
文章嵌入视频
添加SEO
参考:
- https://qmike.top/posts/2a1b5a62
- https://blog.june-pj.cn/posts/8a0c5a62/#26-SEO%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E6%94%B6%E5%BD%95
但是毕竟不一样,还是自己做个记录,方便后续排查。和qmike里面的一样,可以先检查自己的域名有没有被搜索引擎搜录:
1 | site:你的网站 |
然后永久化url地址,之前做过了,不在赘述。剩下的两步是关键,第一步生成站点地图,这个是要给搜索引擎的,告诉它来抓取我们的页面。
安装百度和 Google 的站点地图生成插件:
1 | npm install hexo-generator-baidu-sitemap --save |
然后来到hexo根目录配置文件config.yml,在下面添加:
1 | # 站点地图 |
给你的 hexo 网站添加蜘蛛协议 robots.txt, 把 robots.txt 放在你的 hexo 站点的 source 文件下即可。
1 | # hexo robots.txt |
然后重新推送到服务器,访问如下 URL:
- https://你的域名/sitemap.xml
- https://你的域名/baidusitemap.xml
看看网页中有没有出现代码。有的话就成功。到这里第一步就完成了
最重要的一步来了,登陆搜索引擎的网址,去添加我们的域名,并且把刚刚弄好的站点地图给它。由于我使用的免费域名,百度收录达到了上限,转而去了bing的搜索引擎。这个比较简单,登录之后,添加网址,添加站点地图。然后等待过两天在看看是否被收录。其他搜索引擎同理
nofollow标签添加,和qmike的博客写的一样,主要是防止文章里面的链接被抓取。
自定义
更新版本
自己自定义之后更新版本比较麻烦,毕竟修改过源代码。我这里是将butterfly的仓库fork一份,在fork的仓库上修改。后续butterfly升级版本了,在vscode上拉取上游分支,解决冲突就好。
由于这是现在才想出来的,仓库也是刚刚fork的,暂时没有实操。后面实操的时候搜索一下”如何合并上游分支“应该就有了
自定义波浪特效
butterfly 右下角悬浮菜单栏
主页左边分类卡片自定义
目标,层级分类自定义展开。
找到 themes\butterfly\scripts\helpers\aside_categories.js ,其中找到 hierarchicalList 方法下的这段代码
替换 aside_categories.js 文件
1 |
|
同时修改自定义的css文件
1 |
|
在source/js/main.js中修改,这是控制展开开关DOM的方法,将其修改为点击整行展开:
1 | const toggleCardCategory = () => { |
加载动画
https://blog.anheyu.com/posts/52d8.html
替换不蒜子
- https://ohevan.com/vercount-website-counter-busuanzi-alternative.html
- https://elykia-cn.github.io/posts/8.html
可以去vercount的官网绑定域名,查看访问信息详情。
这个比较麻烦的是,需要一添加一个目录去放验证文件,同时还需要新增一个js:项目\scripts\vercount-verify.js:
1 | hexo.extend.generator.register('vercount-verify', () => ({ |
导航栏居中
在自己定义的custom.css中添加:
1 |
|
自定义公告来访者信息
参考的june,但是和我版本有不兼容,因此重写一下:
- 进入 腾讯位置服务 应用管理界面
- 点击创建应用,应用名称和类型随便填。
- 在新创建的应用中点击添加key,产品选择WebServiceAPI,域名白名单不填。
- 把得到的 key 记下
- 再去 配额管理 -> 账户额度 里拉满(反正就一个要用,多了的话按需分配)
- 前往 经纬度查询定位 获取你所在位置的经纬度,记下来。开了梯子可能用不了,换手机试一下。
- 修改[blogRoot]\butterfly\layout\includes\widget\card_announcement.pug,将其全部替换:
1 | if theme.aside.card_announcement.enable |
- 添加location.js:
1 | // 获取来访者信息 |
- 添加location.css:
1 | #welcome-info { |
- 在butterfly主题的配置文件中找到inject,将js和css引入
- 最后在hexo的配置文件中,添加配置:
1 | welcome: |
需要注意的是不同的版本可能会存在不同的问题,本次使用到是butterfly5.7+hexo7.30
不过有ai,有点问题让ai改一下就好了。
鼠标样式修改
在自定义的css文件中添加:
1 | body { |
添加日历倒计时卡片
但是不太行,于是让AI给我改了一下,也算符合预期,记录一下:
创建文件:\themes\butterfly\layout\includes\widget\card_schedule.pug
1 | .card-widget#card-schedule |
添加自定义的
calendar.css
1 | #card-schedule { |
calendar.js
1 | document.addEventListener("DOMContentLoaded", initializeCard); |
在_config.butterfly.yml中引入创建的js和css。此外还需要引入<script src="https://unpkg.com/chinese-lunar@0.1.4/lib/chinese-lunar.js"></script>
修改\themes\butterfly\layout\includes\widget\index.pug
1 | -#aside-content.aside-content |
还是第一次用diff这个标签,+号就是修改的地方,-号就是原样。
修改themes\butterfly\source\css_layout\aside.styl
1 | > div:first-child |
修改butterfly下的_config.yml文件的配置:
1 | - card_announcement: |
最后再在外层的_config.butterfly.yml中添加上面的配置,设置排序号
随机访问文章
参考自:https://zml3589110.github.io/posts/883659004.html
1 | npm install object-assign |
然后再照常 hexo clean 和 hexo g -d,public 下就会有个 random.html 的文件了
菜单栏可以添加上该地址
1 | menu: |
修改hexo下_config的site.url为自己的域名地址。但是这也本地调试的时候无法跳转,因此在hexo的根目录新增文件random-template.html,添加内容:
1 | <body onload="javascript:dogo();"> |
同时在_config的site.url的位置添加
1 | urls: |
即可本地访问了。
听说开启了 pjax,使用这个插件会有问题。这时候可以查看张洪Heo的改造。


