hexo history 插件开发

更新: 写一个大型的插件集合, 把我之前对文章中想要的功能全集中进去, 提供按需加载功能, 预计@#$!前完成

开端

因为写文章经常想要看看以前写的是啥, 又怎么改过来的, 所以编写了这个插件, 最早的想法起于十月
详细使用方法可见 hexo-history

效果

右下角尝试一下就好, 配置如下图

简介与发展

最早时想的是能够对比出上一次文章的差异, 所以不知道自己想要什么效果, 执行的流程又是如何, 现在整个核心思想应该是展示旧文章是如何转变为新文章的, 通过删除, 新增, 更改来标注段落

但是到现在,只完成了能够查看以前写的是啥, 最想写的文章更改还差部分, 所以预计将会在面试结束前后完成

编写思路

执行流程

  • hexo 注册函数
  • vue 挂载, 请求 github 得到内容
  • 选择时间, 插入骨架屏到页面
  • 在 iframe 中加载dom, 然后返回想要的 dom 节点
  • 替换节点, 加载成功

建立整个项目的基础

找到了 git-history 项目, github 相关 api, 然后根据 hexo-helper-live2d, 了解了 hexo 注册方法, 此时正式开始

流程细节

hexo 注册

hexo 可以用 vscode debug, 具体可见 hexo debug

另外, hexo server 的内容似乎用 hexo generate 更新后也不会改变, 所以让我出现不少蜜汁操作

本来使用 after_render:html 参数基本解决插入脚本的问题, 可是想要只让 post 文章中才显示, 所以测试了filter 中的 after_post_render 参数, 在 issue 中了解到应该是新建一个 post 的时候才会调用, 又尝试了其他参数, 和 processor, renderer 等扩展注册, 都没法解决问题, 看来应该只能在执行的时候判断了,现在搁置

如何在插件中使用 vue

  • 使用 $mount 动态挂载
  • 使用 iview 省得手动写组件

遇到的问题

  • 用 innerHTML 来替换节点, 发现渲染似乎不变, 改为 dom 节点替换

骨架屏

使用手写的骨架屏方式, 然后注入进去

遇到的问题

  • 希望能动态生成
    • 用 js 读取文字长度再转为像素, 设定几个div加上css
    • 将 p 标签全部转为 span 等行内标签就可以自适应长度, 再用css显示
    • 嫌麻烦, 就这样了

请求方式

采用 fetch 请求, 就没必要写回调, 直接 await 清清楚楚, 同时有 sessionstorage, 存储下请求, 防止多次访问

节点渲染

用 iframe 在内部挂载好事件监听load再返回, 力求一致

遇到的问题

  • !!!并未解决, 如果换了主题, 之前的资源文件都被删了, 该怎么办
    • 放到某个cdn上, 然后手动替换字符串
    • 检测节点属性挂载

打包优化

  • webpack 使用生产模式
  • vue 使用外部 cdn
  • 可以把 iview css 分出来, 但没有这么做

超详细流程

从整个执行流程来看, 首先需要一个执行的

  • hexo 注册函数, 移动js文件, 修改html文件内容
  • vue 挂载, 将组件插入文档中
  • 在组件 mounted 时, 请求 github 当前页面的 commit 历史
  • 解析 response, 请求 commit 的具体信息, 再根据具体信息找出当前页面的更改信息的url, 这次请求便可得到内容
  • base64 decode 获得最终想要的文档, 返回到组件 data 中的 items 属性, 此时组件开始渲染
  • 选择想回到的时间, 插入骨架屏到页面
  • 在 iframe 中加载dom, 然后返回想要的 dom 节点
  • 替换节点, 加载成功
文章作者:
文章链接: https://luckyray-fan.github.io/2020/02/19/hexo-history/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 luckyray