为Hexo文章自动生成唯一的自增ID
前文曾提到过我将博客从WordPress迁移到Hexo时,希望保留原有的永久链接格式:/blog/:id/
,然而Hexo本身并不支持自动生成这样的id
,虽然有一些插件例如hexo-abbrlink支持生成这种数字id
,但好像也不是我想要的样子。
我仍希望保持之前那种WordPress下的格式,即每篇文章的id
单调递增,且每次的递增值比较“随机”(这个自增在WordPress中是MySQL数据库的行为,MySQL会为wp_post
表中的所有内容分配id
,而这些内容不仅包含了已发布的文章,还包含文章中插入的图片、文章的修订版本以及文章的自动保存版本等等,因此在发布文章时,往往这个新文章的id
会看上去比较随机地递增)。
而现在Hexo没有数据库了,但我仍想保持这种随机增长的文章id
风格。那要怎么办呢?每次手动算id
自然不太方便,不妨自己来写个插件。
通过阅读Hexo的文档,我简单了解了一下如何在Hexo中监听事件,例如在“生成新文章后”触发一些自定义的函数。首先在博客的根目录下(这里的根目录是项目的根目录,即包含了博客配置文件的目录)创建scripts
文件夹,然后在下面创建的javascript
文件会自动被Hexo读取执行。
先安装一个包:fs-extra
,是fs
模块的扩展。
npm install fs-extra --save
我安装的版本:"fs-extra": "^11.2.0"
在scripts
目录下创建一个auto-id.js
:
const fs = require('fs-extra');
const path = require('path');
const fm = require('hexo-front-matter');
hexo.on('new', function(post){
if (!post.path.includes(path.join(process.cwd(), 'source', '_posts'))) return;
let maxId = 0;
fs.readdir(path.join(process.cwd(), 'source', '_posts'), (err, files) => {
if (err) throw err;
files.forEach( (fpath) => {
if(fpath.endsWith('.md')){
let content = fm.parse(fs.readFileSync(path.join(process.cwd(), 'source', '_posts', fpath), "utf8"));
if (typeof content.id !== 'undefined') {
maxId = Math.max(maxId, content.id);
}
}
});
content = fm.parse(fs.readFileSync(post.path, "utf8"));
content.id = maxId + Math.floor(Math.random() * 100) + 1;
console.log(`${post.path} -> ${content.id}`);
fs.writeFileSync(post.path, '---\n' + fm.stringify(content));
});
});
然后遍历一遍文章,取出当前最大的id
(这个操作有点蠢,不过暂且这样吧,懒得用其他方式去做持久化),然后在此基础上加一个随机值,就得到了新的id
,最后将它写入到新文章的front-matter
中。不过不知道为什么最后得手动在最前面添加---\n
,试了一下fm.stringify
的参数prefixSeparator
也并没有啥用。
这样就相当于写了一个非常简单的插件了,这个插件可以为文章自动生成一个id
,效果如下:
╰─➤ npx hexo new post "为Hexo文章自动生成唯一的自增ID"
INFO Validating config
INFO
===================================================================
##### # # ##### ##### ###### ##### ###### # # #
# # # # # # # # # # # # #
##### # # # # ##### # # ##### # #
# # # # # # # ##### # # #
# # # # # # # # # # # #
##### #### # # ###### # # # ###### #
4.14.0-b1
===================================================================
INFO Created: ~/.../source/_posts/为Hexo文章自动生成唯一的自增ID.md
.../source/_posts/为Hexo文章自动生成唯一的自增ID.md -> 11219