hexo升级到v6.3.0
2022.12.29更新,把原本分出去的一章合并到这里来了,就是解决上下页只显示同一分类的问题,很短没必要单独分一篇文章出去
这几天集中更新文章,突然发现hexo g的时候显示高亮错误,因为以前一直是提交到git自动生成文章,所以也没有仔细查看过日志
主要也是因为只有在生成的时候报警告,并不影响使用,这次是想要调一下主题样式才发现的,那么就需要对插件进行升级了(快一年没升级了,我的hexo版本还是5.4,现在已经6.3了)
升级hexo及插件
node及npm升级网上很多方法,搜一下就有
- 查看hexo版本:
hexo version - 全局升级:
npm i hexo-cli -g - 定位到hexo目录
- 检查插件:
npm-check - 可以根据提示手动升级,也可直接:
npm-upgrade+npm update --save - 再次查看版本号确认:
hexo version
检查自己修改的地方是否被覆盖
升级本身是没啥问题的,只是使用的时候,由于不爱写注释,所以可能自己手动修改了某些插件后来忘记了,这次一升级就覆盖掉了。
我主要改的系统插件有两个:
hexo-generator-index 如文章所述,我从主页里面去掉了几个分类,不修改的话分页的页面里面还包含这个分类的文章,就会导致页面上的文章数不对
hexo-generator-category,这个我也改了,但是给忘的彻彻底底的,导致我小说分类里面的排序出现了问题,直接用git修改比较才找到原因,汗一个…
1'use strict';
2
3const pagination = require('hexo-pagination');
4
5module.exports = function(locals) {
6 const config = this.config;
7 const perPage = config.category_generator.per_page;
8 const paginationDir = config.pagination_dir || 'page';
9 var orderBy = config.category_generator.order_by || '-order'; //要用变量var 不要用常量
10
11 return locals.categories.reduce((result, category) => {
12 if (!category.length) return result;
13
14 //当分类为小说novel时,采用手动排序,其他的为默认日期排序,这个order是写在小说md文件的Front-matter里的
15 //用于同一个分类的小说集中展示
16 //然后在小说页面里面再进行日期排序
17 if(category.name == 'novel'){
18 orderBy = config.category_generator.order_by || '-order';
19 }else{
20 orderBy = config.category_generator.order_by || '-date';
21 }
22
23 const posts = category.posts.sort(orderBy);
24 const data = pagination(category.path, posts, {
25 perPage,
26 layout: ['category', 'archive', 'index'],
27 format: paginationDir + '/%d/',
28 data: {
29 category: category.name
30 }
31 });
32
33 return result.concat(data);
34 }, []);
35};
赶紧手动记录一下升级过程,省的以后再升级又忘记了,最后展示的效果就很好

上下页链接只显示同一分类的文章
我的hexo有一个遗留问题,就是文章的上下文地址,这个地址是在系统分页的时候甚至更早就创建了,原本的逻辑是没有问题的,但是我想让他根据随笔、经验、小说三个分类生成三个不同的上下文对应地址
也就是说我的网站是三个导航分属三个categories,那么在进入文章里面,页脚部分的上一页和下一页的标题和连接,其实还是整体全部文章按date顺序排列的,因此比如你在随笔里面点下一页有可能会点到经验分享里面的文章,有点别扭,这里就解决这个问题。
由于每个人的主题不同,所以对应文章页面的ejs的写法也可能有所不同,这里直接上原码来说明一下(很丑,绝对不是最佳实践,但能用,有大神看到想帮我优化一下求留言[偷笑])
我把ejs语法的以及html语法注释掉了,为了更好的显示js代码
这是写在post.ejs文件里的
1var tmpNext = page.next; //将当前页的下一页对象给个变量
2 while(true){ //暴力循环
3 if(tmpNext){ //当下一页不为空
4 if(page.categories.data[0].name == tmpNext.categories.data[0].name){ //当前页的第一个分类和下一页的分类相同
5 if(page.categories.data[0].name == 'novel'){ //当前页为小说分类
6 if(page.categories.data[1].name == tmpNext.categories.data[1].name){ //增加一个二级分类的判断
7 // <a href="<%- url_for(tmpNext.path) %>" target="_self">
8 // <span><%= tmpNext.title %></span>
9 // <i class="iconfont icon-chevronright"></i>
10 // </a>
11 break;
12 }else{
13 tmpNext = tmpNext.next; //再找下一个大怨种
14 }
15 }else{
16 // <a href="<%- url_for(tmpNext.path) %>" target="_self">
17 // <span><%= tmpNext.title %></span>
18 // <i class="iconfont icon-chevronright"></i>
19 // </a>
20 break;
21 }
22 }else{
23 tmpNext = tmpNext.next; //再找下一个大怨种
24 }
25 }else{ //下一页为空退出循环
26 break;
27 }
28}
我发现用源码讲不清楚,也是因为我写的太暴力了吧,还是简单说明一下:
- 先判断是否有下一页
- 再判断当前页和下一页的分类是否一致,不一致的话找下一个大怨种
- 当前页和下一页一致的时候,再判断是否是小说分类,不是的话直接就是它了
- 当前页是小说分类的时候,再判断二级分类(我的小说根据二级分类来存放合集),不是的话找下一个大怨种
- 当前页是小说分类,且属于一个合集,那就是它了
这样就完美实现了我的需求:
- 随笔和经验分类所有文章挂接上下页
- 小说分类按合集来挂接上下页
我是觉得还有更优的写法,而且其他主题应该会有跟我一样的需求吧,不过既然喜欢这个主题,我也懒得去研究其他主题了。毕竟个人网站最重要的还是内容,能满足功能就先用着吧。
