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 的用法,有如下几点猜测

  • 命名更准确 :命名永远是最难的一点,不好的命名容易造成误解,而 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】搜索功能异常(问题解决)(一)

相关推荐
阳光九叶草LXGZXJ9 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
奔跑的大白啊9 小时前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
黄大刀10 小时前
DataPulse一款开箱即用的SCADA(四)-历史记录
运维·scada·动环
归秋14212 小时前
2026 企业 AI 办公工具选型指南:从评估框架到产品适配
大数据·运维·人工智能
Android系统攻城狮12 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛13 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德13 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
硅基手札14 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨16 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业16 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie