【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如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 的用法,有如下几点猜测
- 命名更准确 :命名永远是最难的一点,不好的命名容易造成误解,而
Store比Scratch(草稿纸)更能表达结构化存储的含义 - 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】搜索功能异常(问题解决)(一)