Hexo 极速进阶:手搓接入 Algolia 毫秒级云检索系统
如果你的 Hexo 博客文章开始逐渐增多,一个强大顺滑的“站内搜索”绝对是留住读者的杀手锏。但在折腾这个功能的过程中,我踩过不少坑,最终才打磨出了现在这套 极速、独立且融入了主题风格 的 Algolia 云端站内检索架构。
这篇文章就来复盘一下这几个坑与解决思路。
1. 踩坑回忆录:为什么放弃本地检索(SearchDB)?
一开始,我的首选方案是最容易搜到的 hexo-generator-searchdb。这套方案的底层逻辑非常野蛮粗暴:每次 Hexo 生成网站时,直接把所有文章揉碎了合成一个巨大的 search.xml 数据库流供前台的 Ajax 请求调用。
但在实际测试中,问题集中引爆了:
- 致命的性能卡顿:随着本地异步 JS 获取 XML 文件的操作加入,如果不将 jQuery 引入正确的渲染层级,会导致两次载入冲突。直接导致整个网页的 DOM 树进入了无极限的 Pending 冻结,卡死长达 10 到 30 秒。
- CDN 被墙的诅咒:当时各种第三方外部挂载库使用了
cdnjs或code.jquery.com等国外公共静态源,这些节点在国内环境下解析极慢(后来我也顺手全部将其重定向到了cdn.staticfile.net七牛云国内极速镜像以解决加载白屏问题)。
基于这种拖泥带水的速度,我果断舍弃了本地打包文件检索检索的方案,转身拥抱了全球最顶级的商业级云搜引擎:Algolia。
2. Algolia 秘钥系统:权利与控制的隔离
Algolia 是第三方闭源应用,所以我们必须在 Algolia 官网 开设自己的 Index 数据库。在取得配置全家桶后,你手里会掌握三把权能不等的“钥匙”:
Application ID:你的数据库宇宙地址。Search-Only API Key:搜索只能读的访问锁(完全安全,只能搜东西,可放在前端任人看)。Admin API Key:这是你数据库的毁灭按钮!绝不能写在明文里!
后端挂载:拒绝在配置里“裸奔”
你需要在博客根目录下执行以下命令接入它的服务总站:
1 | npm install hexo-algoliasearch --save |
然后在博客根目录的 _config.yml 添加配置。🚨切记,无论任何教程怎么教你,一定不要把你的 Admin API Key 直接写进配置文件的 adminApiKey 属性里,因为这会随着你的代码一起推向 GitHub Public 暴露给全网从而失去你的控制权!
正确的写法是给它留空:
1 | algolia: |
当真需要推送文章供服务器建立索引的时候,通过直接在 PowerShell/终端 召唤系统环境变量的方式潜行推送:
1 | set HEXO_ALGOLIA_INDEXING_KEY=你的AdminAPI密钥 |
3. 前端:跳出模版框架的纯手写浪漫
建立索引只是将数据传到了云电脑的大脑里。对于页面排版 UI 这种事,我不想让任何多余的主题破坏现有的高度个性化,因此我自己独立新建了一个 search/index.md 的独立渲染页面,并且直接用原生 JS 手搓了拦截框架。
实战复盘修复:两个致命缺陷
在此期间我也不是没有过翻车时刻,在这里提供两点最经典的修复方案:
破碎的外部图标:由于维基百科等外部图片公共托管库在国内存在加载封锁可能。起初加载的 Algolia SVG 立牌一直变成碎裂图片。果断采用纯文本形式,挂载上主题自带的
FontAwesome中那个精致的fa-search(\f002) 图标渲染,配合高级透明度和 CSS 代码重排版,逼格反而提升了百倍!undefined黑洞:当我在测试最终阶段去搜索关键字时,我发现点击任何一个搜索结果的文章,都会跳转到浏览器不可识别的xxx.github.io/undefined深渊链接!
经深度排查请求回包参数(hits)才发现:如果你配置索引时抓取的值是path而不是permalink,那么在 JS 中提取重定向参数就必须把曾经错误的<a href="${hit.permalink}">改写为:1
<a href="/${hit.path}" class="search-result-title">${title}</a>
4. 尾声与访问量
不仅是重构了极致速度的 Algolia 检索,我还借这个契机将神秘的全局访问量扫描(基于不蒜子 API)悬挂到了跳转层级按钮上。
现在这个充满科技感色彩的博客架构已经算是部分大功告成了,不仅底层网络极速响应,任何一片逻辑都是经过我从地基梳理起来的。