hexo升级到v6.3.0
2022-12-16 10:29 2022-12-29 21:16 ≈ 1.5k字 ≈ 5分钟

2022.12.29更新,把原本分出去的一章合并到这里来了,就是解决上下页只显示同一分类的问题,很短没必要单独分一篇文章出去

这几天集中更新文章,突然发现hexo g的时候显示高亮错误,因为以前一直是提交到git自动生成文章,所以也没有仔细查看过日志

主要也是因为只有在生成的时候报警告,并不影响使用,这次是想要调一下主题样式才发现的,那么就需要对插件进行升级了(快一年没升级了,我的hexo版本还是5.4,现在已经6.3了)

升级hexo及插件

node及npm升级网上很多方法,搜一下就有

  1. 查看hexo版本: hexo version
  2. 全局升级: npm i hexo-cli -g
  3. 定位到hexo目录
  4. 检查插件: npm-check
  5. 可以根据提示手动升级,也可直接: npm-upgrade + npm update --save
  6. 再次查看版本号确认: hexo version

检查自己修改的地方是否被覆盖

升级本身是没啥问题的,只是使用的时候,由于不爱写注释,所以可能自己手动修改了某些插件后来忘记了,这次一升级就覆盖掉了。

我主要改的系统插件有两个:

hexo-generator-index 如文章所述,我从主页里面去掉了几个分类,不修改的话分页的页面里面还包含这个分类的文章,就会导致页面上的文章数不对

hexo-generator-category,这个我也改了,但是给忘的彻彻底底的,导致我小说分类里面的排序出现了问题,直接用git修改比较才找到原因,汗一个…

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
'use strict';

const pagination = require('hexo-pagination');

module.exports = function(locals) {
const config = this.config;
const perPage = config.category_generator.per_page;
const paginationDir = config.pagination_dir || 'page';
var orderBy = config.category_generator.order_by || '-order'; //要用变量var 不要用常量

return locals.categories.reduce((result, category) => {
if (!category.length) return result;

//当分类为小说novel时,采用手动排序,其他的为默认日期排序,这个order是写在小说md文件的Front-matter里的
//用于同一个分类的小说集中展示
//然后在小说页面里面再进行日期排序
if(category.name == 'novel'){
orderBy = config.category_generator.order_by || '-order';
}else{
orderBy = config.category_generator.order_by || '-date';
}

const posts = category.posts.sort(orderBy);
const data = pagination(category.path, posts, {
perPage,
layout: ['category', 'archive', 'index'],
format: paginationDir + '/%d/',
data: {
category: category.name
}
});

return result.concat(data);
}, []);
};

赶紧手动记录一下升级过程,省的以后再升级又忘记了,最后展示的效果就很好

1671162733620

上下页链接只显示同一分类的文章

我的hexo有一个遗留问题,就是文章的上下文地址,这个地址是在系统分页的时候甚至更早就创建了,原本的逻辑是没有问题的,但是我想让他根据随笔、经验、小说三个分类生成三个不同的上下文对应地址

也就是说我的网站是三个导航分属三个categories,那么在进入文章里面,页脚部分的上一页和下一页的标题和连接,其实还是整体全部文章按date顺序排列的,因此比如你在随笔里面点下一页有可能会点到经验分享里面的文章,有点别扭,这里就解决这个问题。

由于每个人的主题不同,所以对应文章页面的ejs的写法也可能有所不同,这里直接上原码来说明一下(很丑,绝对不是最佳实践,但能用,有大神看到想帮我优化一下求留言[偷笑])

我把ejs语法的以及html语法注释掉了,为了更好的显示js代码

这是写在post.ejs文件里的

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
var tmpNext = page.next;        //将当前页的下一页对象给个变量
while(true){ //暴力循环
if(tmpNext){ //当下一页不为空
if(page.categories.data[0].name == tmpNext.categories.data[0].name){ //当前页的第一个分类和下一页的分类相同
if(page.categories.data[0].name == 'novel'){ //当前页为小说分类
if(page.categories.data[1].name == tmpNext.categories.data[1].name){ //增加一个二级分类的判断
// <a href="<%- url_for(tmpNext.path) %>" target="_self">
// <span><%= tmpNext.title %></span>
// <i class="iconfont icon-chevronright"></i>
// </a>
break;
}else{
tmpNext = tmpNext.next; //再找下一个大怨种
}
}else{
// <a href="<%- url_for(tmpNext.path) %>" target="_self">
// <span><%= tmpNext.title %></span>
// <i class="iconfont icon-chevronright"></i>
// </a>
break;
}
}else{
tmpNext = tmpNext.next; //再找下一个大怨种
}
}else{ //下一页为空退出循环
break;
}
}

我发现用源码讲不清楚,也是因为我写的太暴力了吧,还是简单说明一下:

  1. 先判断是否有下一页
  2. 再判断当前页和下一页的分类是否一致,不一致的话找下一个大怨种
  3. 当前页和下一页一致的时候,再判断是否是小说分类,不是的话直接就是它了
  4. 当前页是小说分类的时候,再判断二级分类(我的小说根据二级分类来存放合集),不是的话找下一个大怨种
  5. 当前页是小说分类,且属于一个合集,那就是它了

这样就完美实现了我的需求:

  1. 随笔和经验分类所有文章挂接上下页
  2. 小说分类按合集来挂接上下页

我是觉得还有更优的写法,而且其他主题应该会有跟我一样的需求吧,不过既然喜欢这个主题,我也懒得去研究其他主题了。毕竟个人网站最重要的还是内容,能满足功能就先用着吧。