hexo升级到v6.3.0

2022-12-16 10:29≈ 269字≈ 2分钟

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'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};

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

1671162733620

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

我的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} 

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

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

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

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

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