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

相关推荐
Dovis(誓平步青云)5 分钟前
心情日记的安全编辑流程:输入校验、删除确认与状态回收
android·运维·服务器·开发语言·windows·安全
wazmlp0018873699 分钟前
控制器管理
linux·运维·服务器
薛定猫AI12 分钟前
【深度解析】DeepSeek Harness:可插拔智能体运行时如何连接大模型与真实计算机
java·运维·网络
学linux的QQ蛋12 分钟前
Linux 文件 IO:系统调用 open/read/write 完整总结
linux·运维·算法
sg_knight22 分钟前
openCode 安装与初始化配置(Windows / macOS / Linux)
linux·windows·macos·llm·agent·ai编程·opencode
Rei224825 分钟前
使用llama.cpp的Qwen3.6-27B-Q8本地部署详解【Linux GPU】
linux·运维·llama
ComputerInBook29 分钟前
Linux内核之概观
linux·linux内核代码结构·linux内核结构
裕晟资质规划30 分钟前
首次办理军工保密资质:咨询服务选择要点与全流程交付清单(评估框架)
大数据·运维·服务器·网络·数据库·经验分享
超龄超能程序猿38 分钟前
实战优化:.NET 8 容器 Debian 源+时间同步企业级 Dockerfile
运维·debian·.net
运维全栈笔记4 小时前
Vue + Spring Boot 前后端分离项目部署笔记(若依 RuoYi-Vue 3.9.2)
运维·服务器·vue.js·spring boot·笔记·开源·开源软件