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

相关推荐
jingyu飞鸟2 分钟前
linux系统二进制安装MySQL 8.4、8.0版本数据库,配置crontab和xtrabackup数据库热备份脚本
linux·数据库·mysql
无限进步_4 分钟前
从Multics到Linux:操作系统的自由之路
linux·运维·服务器
China_Yanhy4 分钟前
【云原生实战】从零构建无节点 EKS:Karpenter 极简注入与全自动算力接管指南
linux·运维·云原生
北山有鸟8 分钟前
常用的快捷键
linux·前端·chrome·单片机·学习
蜀道山老天师11 分钟前
从零搭建 Prometheus 监控 MySQL:含二进制安装、授权、exporter 配置全流程
运维·数据库·mysql·adb·云原生·prometheus
岳来14 分钟前
Linux Capabilities(能力机制)细分学习
linux·root
哈哈浩丶29 分钟前
存储相关知识②—eMMC协议
linux·驱动开发·emmc
geshifei30 分钟前
Sched_ext 回调深度解析(一):init_task —— 每个任务走进调度器的第一道门(6.18.26)
linux·ebpf
专注API从业者40 分钟前
Open Claw 实战:用淘宝商品 API 实现自动化监控选品系统
大数据·运维·数据库·自动化
没文化的阿浩42 分钟前
【Linux系统】Ext系列文件系统
linux·运维·电脑