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】搜索功能异常(问题解决)(一)

相关推荐
大树8811 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠11 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质11 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush411 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52012 小时前
Linux 11 动态监控指令top
linux
Inhand陈工12 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智13 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩13 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_13 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈13 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix