Hugo PAGE.Scratch 方法详解:页面级持久键值存储与 PAGE.Store 迁移指南
Hugo PAGE.Scratch 方法详解页面级持久键值存储与 PAGE.Store 迁移指南【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugoPAGE.Scratch是 Hugo 在Page对象上提供的一个方法用于创建并返回一个作用域限定于当前页面的持久化键值数据结构可在模板、短代码shortcode、局部模板partial与渲染钩子render hook之间安全地暂存和传递状态。本文以 docs/content/en/methods/page/Scratch.md 为骨架结合仓库源码与官方 Store 系列文档完整讲解其方法语义、作用域规则、软弃用状态以及迁移到PAGE.Store的路径。读完本文你将能在模板开发中熟练使用这套页面级状态存储 API并安全地完成从Scratch到Store的代码迁移。一、PAGE.Scratch 是什么根据官方文档的定义Scratch方法返回一个持久化数据结构maps.Scratch用于存储和操作按键key组织的值且作用域限定于当前页面。其方法签名为PAGE.Scratch返回类型为maps.Scratch即仓库中common/hstore/scratch.go定义的*hstore.Scratch类型。典型的使用场景包括在短代码内部累积统计值、在渲染钩子中传递中间计算结果、在父模板与子模板之间共享临时状态等。由于它随页面生命周期持久存在同一页面内多次访问Scratch都会操作同一个底层数据实例。二、软弃用说明v0.138.0 起别名为 PAGE.StoreScratch方法自 v0.138.0 起被标记为软弃用soft deprecation官方建议改用PAGE.Store方法详见 docs/content/en/methods/page/Store.md。需要明确的弃用细节别名关系自 v0.138.0 起PAGE.Scratch方法被直接别名为PAGE.Store二者在功能上完全等价。软弃用含义该方法会在未来某个版本被移除但移除日期尚未确定在你继续使用Scratch期间Hugo不会发出任何警告。迁移建议尽管目前仍可正常使用官方明确建议尽快改用PAGE.Store。从源码可以印证这一别名关系。在 hugolib/page__common.go 中func (p *pageCommon) Store() *hstore.Scratch { return p.store() } // See issue 13016. func (p *pageCommon) Scratch() *hstore.Scratch { return p.Store() }Scratch()直接调用Store()两者返回同一类型的实例而底层实例的创建采用了sync.OnceValue保证惰性初始化与并发安全见 hugolib/page__new.gostore: sync.OnceValue(func() *hstore.Scratch { return hstore.NewScratch() }), // Rarely used.这意味着无论模板中调用多少次Scratch或Store每个页面都只会在首次访问时创建一次存储实例后续访问复用同一对象天然适合在服务器重建rebuild期间跨模板保持状态。三、数据结构提供的方法官方通过 docs/content/en/_common/store-methods.md 完整记录了该数据结构支持的方法Scratch与Store共用同一套方法。以下示例均以.Scratch编写迁移时仅需将.Scratch替换为.Store。Set设置键值Set用于将指定键的值设为给定值{{ .Scratch.Set greeting Hello }}Get获取键值Get返回指定键的值类型为any{{ .Scratch.Set greeting Hello }} {{ .Scratch.Get greeting }} → HelloAdd在既有值上累加Add将给定值添加到指定键的既有值之上。规则如下对于单值Add支持 Go 的运算符即支持数值相加与字符串拼接如果某个键的首次Add传入的是数组或切片则后续的Add会把新值追加到该列表中。字符串拼接示例{{ .Scratch.Set greeting Hello }} {{ .Scratch.Add greeting Welcome }} {{ .Scratch.Get greeting }} → HelloWelcome数值累加示例{{ .Scratch.Set total 3 }} {{ .Scratch.Add total 7 }} {{ .Scratch.Get total }} → 10切片追加示例{{ .Scratch.Set greetings (slice Hello) }} {{ .Scratch.Add greetings (slice Welcome Cheers) }} {{ .Scratch.Get greetings }} → [Hello Welcome Cheers]从源码实现看common/hstore/scratch.go 中Add会先检查既有值的类型若是 Slice/Array 则通过collections.Append追加否则通过math.DoArithmetic(existingAddend, newAddend, )执行运算。同时该方法内部全程使用读写锁sync.RWMutex保护valuesmap保证并发环境下模板渲染的安全。SetInMap向键下的 map 中写入条目SetInMap接收key、mapKey和value三个参数将mapKey与value组成的键值对写入key指向的 map 中{{ .Scratch.SetInMap greetings english Hello }} {{ .Scratch.SetInMap greetings french Bonjour }} {{ .Scratch.Get greetings }} → map[english:Hello french:Bonjour]实现上SetInMap在键首次使用时自动创建map[string]any作为底层容器。DeleteInMap删除 map 中的条目DeleteInMap接收key与mapKey从key指向的 map 中移除对应条目{{ .Scratch.SetInMap greetings english Hello }} {{ .Scratch.SetInMap greetings french Bonjour }} {{ .Scratch.DeleteInMap greetings english }} {{ .Scratch.Get greetings }} → map[french:Bonjour]GetSortedMapValues按 mapKey 排序取值GetSortedMapValues返回[]any即从key指向的 map 中取出所有值并按mapKey排序后的数组。由于 map 的迭代顺序在 Go 中是不确定的需要稳定输出时应当使用此方法而非直接遍历{{ .Scratch.SetInMap greetings english Hello }} {{ .Scratch.SetInMap greetings french Bonjour }} {{ .Scratch.GetSortedMapValues greetings }} → [Hello Bonjour]对应的源码在 common/hstore/scratch.go先收集 map 的所有键经sort.Strings排序后按序组装成切片返回。Delete删除键Delete从数据结构中移除指定键{{ .Scratch.Set greeting Hello }} {{ .Scratch.Delete greeting }}四、作用域Scope规则创建数据结构的方法或函数决定了其作用域官方在 docs/content/en/_common/store-scope.md 中给出了完整对照表作用域方法或函数page页面PAGE.Storesite站点SITE.Storeglobal全局hugo.Storelocal局部collections.NewScratchshortcode短代码SHORTCODE.StorePAGE.Scratch以及同等的PAGE.Store创建的即是页面级作用域同一页面内的模板、短代码、渲染钩子共享该实例而不同页面之间互不影响。若需要其他作用域可选用上表中的对应方法或函数。例如站点级SITE.Store在 hugolib/site.go 中定义短代码级SHORTCODE.Store/SHORTCODE.Scratch在 hugolib/shortcode.go 中定义它们返回的都是同一个*hstore.Scratch类型。五、存储值的不确定性Determinate Values使用Scratch/Store时有一个重要的时序陷阱。官方在 Store 文档 中专门说明了这一点Store含Scratch常被用于在短代码模板、由短代码调用的局部模板或渲染钩子模板中写入值在这三种场景下存储的值在 Hugo渲染页面内容之前是无法确定的indeterminate。如果你需要在父模板中读取这些值而父模板此时尚未渲染页面内容可以通过将页面内容渲染结果赋给一个 noop空操作变量来强制触发内容渲染{{ $noop : .Content }} {{ .Scratch.Get mykey }}除了.Content以下方法同样可以触发内容渲染ContentWithoutSummary、FuzzyWordCount、Len、Plain、PlainWords、ReadingTime、Summary、Truncated、WordCount。例如{{ $noop : .WordCount }} {{ .Scratch.Get mykey }}六、最佳实践与迁移清单结合本文内容给出如下实操建议新代码一律使用PAGE.StoreScratch是软弃用 API虽然暂时无警告但应避免在新模板中引入技术债。机械替换即可完成迁移由于Scratch与Store底层是同一实例见 hugolib/page__common.go迁移时只需将模板中的.Scratch.全部替换为.Store.方法签名与返回类型完全一致。跨页面不要共享状态页面级作用域意味着状态隔离在单页面内需要站点级共享时请改用SITE.Store需要全局共享时使用hugo.Store。读取父模板值时先触发内容渲染若在父模板中读取短代码写入的值务必先用 noop 变量触发.Content或等效方法渲染否则可能读到空值。需要稳定顺序时使用GetSortedMapValuesGo 的 map 遍历顺序不确定涉及多语言、多分类等需要固定输出的场景务必使用排序方法而非直接遍历。综上PAGE.Scratch是 Hugo 模板体系中实现页面级状态管理的经典 API其功能完整、实现健壮读写锁保护 惰性单例创建随着 v0.138.0 将其软弃用并别名为PAGE.Store开发者应逐步迁移到新命名以跟随 Hugo 的演进方向。【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

图神经网络驱动的熔池温度预测与能耗优化方案

图神经网络驱动的熔池温度预测与能耗优化方案

简介:DeepSeek工业低碳铸造能耗优化方案是一份面向工业智能、能源优化与绿色制造领域技术人员的499页完整PDF文档,聚焦于利用图神经网络(GNN)实现熔池温度预测,并构建能耗最优调度策略。全文包含72个大章节&#xff0c…

2026/9/21 8:06:15 阅读更多 →
为什么Python新手该从IDLE开始:零抽象泄漏的入门开发环境

为什么Python新手该从IDLE开始:零抽象泄漏的入门开发环境

1. 为什么我坚持让新手从 IDLE 开始写 Python,而不是直接装 PyCharm 或 VS Code你可能已经看过太多“Python 入门必装 PyCharm”“VS Code Python 插件才是生产力”的教程。我也试过——刚教完一个零基础的同事,他兴冲冲装好 PyCharm,配了 S…

2026/9/20 2:14:43 阅读更多 →
LeRobot端到端机器人学习框架:数据采集到策略部署实战指南

LeRobot端到端机器人学习框架:数据采集到策略部署实战指南

LeRobot端到端机器人学习框架:数据采集到策略部署实战指南 【免费下载链接】lerobot 🤗 LeRobot: Making AI for Robotics more accessible with end-to-end learning 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot 把一批低成本机械…

2026/9/20 2:14:43 阅读更多 →

最新新闻

企业网站做电脑营销避坑指南:选哪家好别只看价格,看这套设计规范

企业网站做电脑营销避坑指南:选哪家好别只看价格,看这套设计规范

企业网站做电脑营销避坑指南:选哪家好别只看价格,看这套设计规范 改个需求建站公司拖一周,这种憋屈事谁没经历过?很多老板找企业网站做电脑营销,问得最多的一句话就是“哪家好”。其实,网站好不好用,营销转不转化,核心不在你付了多少钱,而在前端代码写得够不够规范,设计逻辑是否支撑你的业务目标。…

2026/9/21 8:00:00 阅读更多 →
做品管圈网站哪家好?3步避开被黑挂马陷阱

做品管圈网站哪家好?3步避开被黑挂马陷阱

做品管圈网站哪家好?3步避开被黑挂马陷阱 网站上线三天,后台突然多了个奇怪的脚本,页面弹出一堆博彩广告,SEO排名一夜清零。如果你正面临这种“网站被黑挂马不知道怎么办”的噩梦,先别慌着删库重装。很多站长在找做品管圈网站哪家好时,只盯着价格和功能,却忽略了最底层的代码安全与架构选型。今天咱们不聊虚的,…

2026/9/21 7:44:43 阅读更多 →
Voyager 資料夾管理指南:為 Gemini 與 AI Studio 的 AI 對話打造真正的「檔案系統」

Voyager 資料夾管理指南:為 Gemini 與 AI Studio 的 AI 對話打造真正的「檔案系統」

AI 应用前端 【免费下载链接】voyager Enhancement suite for Gemini, AI Studio, Claude & ChatGPT — plus a prompt manager for any websites, DeepSeek Harness included. / 面向 Gemini、AI Studio、Claude 与 ChatGPT 的增强套件;其中的提示词管理器可用…

2026/9/21 7:41:44 阅读更多 →
gatsby-source-graphql 插件全解析:将任意第三方 GraphQL API 缝合进 Gatsby 数据层

gatsby-source-graphql 插件全解析:将任意第三方 GraphQL API 缝合进 Gatsby 数据层

前端静态站点Web框架 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/gatsby 点击查看 免费下载 本篇技术指南以 gatsby-source-graphql 插件的 CHANGELOG 版…

2026/9/21 7:41:44 阅读更多 →
Lightweight Charts v3 到 v4 迁移指南:破坏性变更逐项分析与实战改造方案

Lightweight Charts v3 到 v4 迁移指南:破坏性变更逐项分析与实战改造方案

Lightweight Charts v3 到 v4 迁移指南:破坏性变更逐项分析与实战改造方案 【免费下载链接】lightweight-charts Performant financial charts built with HTML5 canvas 项目地址: https://gitcode.com/gh_mirrors/li/lightweight-charts 本指南以 Lightweig…

2026/9/21 7:41:44 阅读更多 →
FoundationDB 存储基准测试上 RAM Disk:mako_storage_bench.sh 在 okteto 开发 Pod 上的 tmpfs 实践指南

FoundationDB 存储基准测试上 RAM Disk:mako_storage_bench.sh 在 okteto 开发 Pod 上的 tmpfs 实践指南

分布式数据库KV存储数据库后端 【免费下载链接】foundationdb FoundationDB - the open source, distributed, transactional key-value store 项目地址: https://gitcode.com/gh_mirrors/fo/foundationdb 点击查看 免费下载 mako_storage_bench.sh 是 FoundationD…

2026/9/21 7:41:44 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →