记录一下如何修改url为XXX.1.html后,新建博文能够自动填入最新的id。
1、背景概述
在最开始搭建博客的时候,为了美观我就把网址的URL改成了纯数字,具体的修改过程详见修改文章访问路径。所以每次在新写一篇文章的时候都要手动填入最新的id。
我每次也记不住最新的id是多少,都打开博客首页然后打开最新发布的一篇文章,看看当前的最大id为多少,然后设置新文章为最大id+1。
这个过程实在是太繁琐并且毫无必要了。我就思考能不能在我新建文章的时候自动填充id。
2、解决思路
思路其实很简单,新建一个文件,里面保存当前最大的id号。
然后写一个脚本。在每次新建完文章后调用这个脚本。
这个脚本的功能也很简单,首先获取id文件里面的当前最大id,然后将新建文章的id修改为最大id+1,然后将最大id+1写入id文件。
但是比较麻烦的是我对前端很不熟悉,不知道怎么在新建文章的时候调用一个脚本,也不清楚怎么读取、格式化新建的文章。
幸运的是我在谷歌的时候搜到了一个Hexo自增id的插件,给我提供一个如何注册事件和如何格式化的思路。
3、试用插件
插件叫hexo-incremental-id, GitHub地址。
是一个已经集成好的插件,思路很简单,在每次新建文章的时候去扫描sources
文件夹下的文件去获取最大id,然后将新建文章的id修改为最大id+1。
在使用的时候遇到了几个问题,如文档所说,在文章较多的时候会有性能问题,因为会去遍历所有的文章获取最大id。同时对于老的文章会被修改,识别不到设置的id。
同时由于这是一个插件,所以更换写作环境的时候都需要重新安装,有些麻烦。
基于上述问题,我对插件进行了一些改造。非常感谢KagamiChan,给我提供了思路如何注册事件和格式化文章等。
4、插件改造
修改的思路如上。
核心文件为index.js,可以看到注册事件的代码为:
1 | hexo.on('new', setId) |
也就是文章被创建完成之后会调用setId
方法。同时使用了hexo-front-matter对文章进行格式化。
只需要修改setId方法即可,修改完的代码比较简单就不赘述了:
文件位置为 themes/icarus/scripts/incremental.js
1 | const fs = require('fs-extra') |
注意 要新建themes/icarus/scripts/id
文件,将里面的值修改为当前系统的最大id。
5、测试总结
执行hexo n “test”后,可以看到新建的文章中已经自动填充了id,同时id文件的值也+1了,成功运行,后续就不需要再手动记最大id了。