解决 hexo 持久化链接中出现 undefined 的问题

在此之前,先说明下用到的两个插件和作用。

hexo-abbrlink用于持久化链接,将原本 年/月/日/标题 的链接转换为 hash 路由,这样路由层级减少,有利于 SEO。

hexo-addlink这个插件的用途是在底部添加一个版权声明,会添加本文的地址。

之前的时候,如果只编译一次的话,虽然成功生成了 hash 路由,但是底部的版权声明中的地址总是 undefined,百思不得其解。

最后查看源码时发现 hexo-addlink 这个插件没有定义优先级,因此默认为 10;而 hexo-abbrlink 这个插件定义的优先级为 15,按 hexo 的规则是数字越大越晚执行,因此 hexo-abbrlink 在 hexo-addlink 后执行。所以,既然没有生产 hash 路由,那么自然是 undefined。

明白了问题所在,那么就是解决问题了

实际上只要修改两个插件中的一个的优先级就行了,让 hexo-abbrlink 比 hexo-addlink 先执行。在这里我们以修改 hexo-addlink 为例。

由于年代久远,因此让原作者修改源码是基本上不可能的事情。好在这是一个开源项目,上 GitHub 上 fork 一份,下载到本地,修改优先级为 20。

const hexo = hexo || {};
const config = hexo.config;
const addlink = hexo.config.addlink;

hexo.extend.filter.register('before_post_render', data => {
  if (!addlink || !config.url || data.layout !== 'post') {
    return data;
  }

  let domain = config.url;
  let beforeText = addlink.before_text || '';
  let afterText = addlink.after_text || '';
  let layout = data.layout;
  let href = `${domain}/${data.path}`;
  let hrefText = `${beforeText} [${href}](${href}) ${afterText}`;

  data.content += `\n\n${hrefText}`;
},20);//这里添加优先级选项

注意:本项目还需要编译后才能使用

按照 package.json 中的提示,我们修改完 main.js 文件后再执行

npm i
npm run build

这样才是生成了可用的文件

同时注意到该项目的.gitignore 文件中忽略了 index.js,去掉即可。

git add .
git commit -m "修改了优先级"
git push

最后提交到 GitHub 上。

再回到自己的 hexo 项目中,修改 package.json 中 hexo-addlink 的源地址为从 GitHub 下载

"hexo-addlink": "git+https://github.com/CaoMeiYouRen/hexo-addlink.git"

完工,现在再执行

hexo clean && hexo g

现在应该在版权声明中也能看到 hash 路由了

如果没有生效那么可能是 node_modules 的问题,删除后重新下载依赖即可


评论

发表回复