【hexo专栏】实现一个hexo的sitemap功能
背景
目前我的博客站点由于原来没怎么经营导致sitemap.xml没有生成,所以需要自己实现一个sitemap功能。然后目前的博客采用hexo进行搭建,所以需要在hexo的基础上进行开发。
实现
首先最简单的方式是查询一个hexo的sitemap的文章。
由于对hexo源码还算相对熟悉,那不去查询别人实现的sitemap,先自己来实现一个,想到的是直接利用hexo的generate扩展功能,返回一个json即可,框架会根据这个json去生成对应的内容。
1. 文档
比较简单,大概就是返回的是一个对象,对象中包含了path和data两个属性,path是生成的文件路径,data是文件的内容,或者说使用layout进行渲染内容。
2. 实现
| 12
 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
 
 | hexo.extend.generator.register('sitemap', (locals) => {let postsSite = locals.posts.sort('-updated').map(item => {
 return {
 url: 'https://blog.fedfans.com/' + item.path + 'index.html',
 updateTime: item.updated.format()
 }
 });
 
 let pagesSite = locals.pages.sort('-updated').filter(item => {
 return item.path !== 'images/upload.json'
 }).map(item => {
 return {
 url: 'https://blog.fedfans.com/' + item.path,
 updateTime: item.updated.format()
 }
 });
 
 let render = (data) => {
 return data.map(item => {
 return `<url>
 <loc>${item.url}</loc>
 <lastmod>${item.updateTime}</lastmod>
 </url>`
 }).join('\n')
 }
 let info = postsSite.concat(pagesSite)
 let result = render(info);
 return {
 path: 'sitemap.xml',
 data: `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
 ${result}
 </urlset>
 `
 }
 })
 
 
 | 
此处我把文章和自定义的page生成到了一个sitemap中,然后就可以在站点根目录下面看到sitemap.xml文件了。
对比
查看社区的包:https://github.com/hexojs/hexo-generator-sitemap
可以看到,社区的包是基于hexo的generate扩展功能实现的,看来基本就是这个方法,也同时看到了社区的视线里面,假设我们的主题里面主题去generate一些其他页面,那这个sitemap就监听不到了,
然后由于我们已经知道了这个实现方式,就能比较简单完善自己的sitemap了,相比社区到时碰到这个页面的sitemap为什么没有编入进去,到时就比较懵,可能解决起来更花费时间了。
另外社区包,还用了nunjunks,感觉杀鸡焉用牛刀,直接一个函数字符串模版即可。
总结
实战了hexo的generate功能,后续有其他功能也能比较快速的实现了,另外对于完善sitemap也能自己快速解决,另外比如想要实现sitemap嵌套sitemap也能比较好实现。
Hexo专栏
目前 Hexo 系列形成了一个小专栏,欢迎读者继续阅读: Hexo专栏地址