132、【Ubuntu】【Hugo】搜索功能异常(问题解决)(二)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Hugo】搜索功能异常(问题解决)(一)

分析了搜索功能异常的问题(编辑后保存会导致搜索有很多重复的内容 ),并详细分析了 .Scratch 在其中的作用,下面继续分析

搭建私人博客

上篇 blog 提到,热重载(hugo server + 保存文件)时,Hugo 不会重启程序,而是增量渲染受影响的页面,而此时 .Scratch 没被显式清空(搜索 .Scratch 没发现有显式清空的痕迹),那此时旧数据还在

举个例子

  • 第一次渲染索引文件 index.json ,此时 $.Scratch.Get "index" 获得的是空值 nil,此时站点有 5 篇文章,通过 $.Scratch.Add "index",输出 [A,B,C,D,E].Scratch 对象
  • 然后修改了一篇文章并保存,Hugo 重新渲染索引文件 index.json,但 .Scrach 对象被复用了.Scratch.Get "index" 获得的,已经是 [A,B,C,D,E],然后在此基础上,再通过 $.Scratch.Add "index" 添加 5 篇相同的文章,.Scratch 对象里面相关的内容就变成了 [A,B,C,D,E,A,B,C,D,E],造成了内容重复新增

另外,关于 .Scratch 的官方描述 https://gohugo.io/methods/page/scratch/#article 如下

可以看到,$,Scratch(也就是 PAGE.Scratch) 在 Hugo v0.138.0 版本开始,已经被官方标记为 soft deprecation 软弃用了,并推荐使用 PAGE.Store

首先得理解下【soft deprecation】这个词,软弃用不是不能用,而是当前也能支持,不会报错,但是不推荐使用 ,现在从 Hugo v0.138.0 开始,$.Scratch 实际上就是 $.Store 的别名,建议尽快迁移到 .Store 的用法,避免未来版本彻底移除 $.Scratch 导致报错

关于迁移方法,由于 $.Scratch 只是 .Store 的别名,所以语法也一模一样,比如 .Scratch 的旧写法是

go 复制代码
{{ $.Scratch.Set "key" "value" }}
{{ $.Scratch.Add "list" $item }}
{{ $.Scratch.Get "key" }}

.Store 的新写法就是换个名字

go 复制代码
{{ $.Store.Set "key" "value" }}
{{ $.Store.Add "list" $item }}
{{ $.Store.Get "key" }}

只需要把 Scratch 改成 Store,其他可以完全不变

关于 Hugo 为啥要弃用 Scratch 的用法,有如下几点猜测

  • 命名更准确 :命名永远是最难的一点,不好的命名容易造成误解,而 StoreScratch(草稿纸)更能表达结构化存储的含义
  • API 统一 :与 Hugo 的其他存储机制,比如 .Site.Store 保持一致
  • 为未来扩展铺路Store 后续可能可以支持更多数据类型或操作

OK,回到 index.json 模板

这里的第一行正是核心错误所在

go 复制代码
{{- $.Scratch.Add "index" slice -}}

slice 是 Hugo 的一个函数,用于创建 empty list 空切片,而不是值,这里 $.Scratch.Add 的作用是,向 index 这个 key 中,追加一个空切片列表,这里的行为是未定义,不确定的,会有两种场景

  • 在首次渲染 index.json 模板时,Hugo 会先创建 index,其值为空,然后将空切片塞进去,此时没问题
  • 而在热重载时,会出现多次渲染 index.json 的情况,那此时 index 就是非空的,会导致后续不断地往旧列表中追加内容,结果就造成了搜索功能异常问题(出现重复内容)

正确的做法是,每次初始化空 slice 时,应该用 Set,而不是 Add,将

go 复制代码
{{- $.Scratch.Add "index" slice -}}

改成

go 复制代码
{{- $.Scratch.Set "index" (slice) -}}

可以看到改之前,是这样,出现多个相同的搜索结果

改成 Set 之后,搜索功能恢复正常,因为 index.json 每次都会重新初始化了

这老哥把 issue 权限限制了,就不给他提 BUG 了

看他的状态,不知道后面还维不维护,有 BUG 的话就尽量自己修复


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Hugo】搜索功能异常(问题解决)(一)

相关推荐
我爱学习好爱好爱20 分钟前
Ansible 常用模块详解:yum、service/systemd、copy实战
linux·服务器·ansible
papaofdoudou40 分钟前
LINUX VFIO被IOMMUFD取代
linux·运维·服务器
平生不喜凡桃李1 小时前
浅谈 Linux 中 namespace 相关系统调用
java·linux·服务器
无忧智库2 小时前
智慧医院的“新基建”:从顶层设计到全栈式智能运维的深度解构(PPT)
大数据·运维
YMWM_2 小时前
【问题】thor上的cubLas
linux·python·thor
杨云龙UP3 小时前
mysqldump逻辑备份文件恢复总结:全库恢复、单库恢复,一篇讲明白
linux·运维·服务器·数据库·mysql·adb
舰长1153 小时前
linux系统服务器加固1、中风险 未设置登录失败处理功能和登录连接超时处理功能。2、中风险 未限制默认账户的访问权限。3、中风险 未实现管理用户的权限分离。
linux·运维·服务器
mounter6253 小时前
Linux 7.0 重磅更新:详解 nullfs 如何重塑根文件系统挂载与内核线程隔离
linux·运维·服务器·kernel
色空大师4 小时前
【网站搭建实操(一)环境部署】
java·linux·数据库·mysql·网站搭建
江南风月4 小时前
日志审计系统WGLOG支持syslog吗
运维·网络·日志审计