Jekyll Data Files 数据文件实战:用 `_data` 目录把导航、成员列表等站点内容与模板彻底分离
Jekyll Data Files 数据文件实战用_data目录把导航、成员列表等站点内容与模板彻底分离【免费下载链接】jekyll:globe_with_meridians: Jekyll is a blog-aware static site generator in Ruby项目地址: https://gitcode.com/gh_mirrors/je/jekyll本文围绕 Jekyll 官方 Step-by-Step 教程第六步「Data Files」展开讲解如何通过_data目录中的 YAML、JSON、CSV、TSV 文件存储站点内容再经由site.data在 Liquid 模板中读取与遍历。读完本文你将掌握数据文件的存放规则、site.data命名空间映射、子文件夹组织方式、CSV/TSV 解析选项并能在导航、成员列表、作者信息等真实场景中把「内容」与「结构」分离让站点更易维护。为什么需要数据文件Jekyll 是一个博客感知的静态站点生成器Ruby 实现它的核心理念之一是「内容与代码分离」。在 Step 5Includes 中导航条被提取到了_includes/navigation.html但链接仍然是硬编码的nav a href/ {% if page.url / %}stylecolor: red;{% endif %}Home/a a href/about.html {% if page.url /about.html %}stylecolor: red;{% endif %}About/a /nav问题很明显每新增一个导航项都要复制粘贴一行a标签要改变高亮颜色得同时改动多处。Jekyll 的数据文件Data Files正是为解决这类重复而设计——把「导航项是什么」放进数据文件把「导航项怎么渲染」留在模板两者解耦。Jekyll 支持加载位于_data目录下的 YAML、JSON、CSV 与 TSV 文件这些文件在构建时被解析通过site.data暴露给 Liquid 模板系统。这一特性除了减少模板中的重复代码还可以设置站点级选项而无需改动_config.yml插件与主题同样可以借助数据文件来承载配置变量详见 Data Files 官方文档。实战第一步把导航内容存入_data/navigation.yml在站点根目录创建_data/navigation.yml用 YAML 存储一个由「名称 链接」组成的数组- name: Home link: / - name: About link: /about.htmlYAML 是 Ruby 生态中非常常见的格式。这里每个-开头的条目都是一个列表元素每个元素含两个键值对name和link。创建完成后Jekyll 会把这个文件暴露为site.data.navigation变量名取自文件的基本名即不含扩展名的部分。于是_includes/navigation.html就可以改为遍历数据文件{% raw %}nav {% for item in site.data.navigation %} a href{{ item.link }} {% if page.url item.link %}stylecolor: red;{% endif %} {{ item.name }} /a {% endfor %} /nav{% endraw %}渲染输出与硬编码版本完全一致但维护体验天差地别新增导航项只需在navigation.yml中追加一行- name: xxx和link: xxx无需触碰 HTML调整 HTML 结构只改模板一处所有导航项同步生效当前页高亮通过page.url item.link判断规则集中在模板中。这正是数据文件的核心价值把数据与视图分离降低重复、提升可维护性。_data目录支持的格式与命名规则完整的规则见 Data Files 官方文档如下_data目录位于站点源目录下专门存放供 Jekyll 生成站点时使用的额外数据支持的文件扩展名.yml、.yaml、.json、.csv、.tsv所有文件通过site.data访问CSV 与 TSV 文件必须包含表头行默认情况下首行被解析为表头可通过配置关闭见下文「CSV/TSV 解析选项」数据文件的基本名决定变量名_data/members.yml→site.data.members。因此同一目录下应避免出现基本名相同、仅扩展名不同的数据文件如members.yml与members.yaml并存否则会相互覆盖。从源码看DataReader 在读取时正是用File.basename(entry, .*)去掉扩展名作为 Hash 键目录同样会被递归读入键名经sanitize_filename处理移除非法字符、空格转下划线见 test_data_reader.rb 中对sanitize_filename的测试。完整示例用数据文件渲染成员列表这是官方文档给出的最经典用例把一组人员信息放进数据文件避免在模板里复制粘贴大段结构相同的 HTML。_data/members.ymlYAML 写法- name: Eric Mill github: konklone - name: Parker Moore github: parkr - name: Liu Fengyun github: liufengyun_data/members.csv等价的 CSV 写法name,github Eric Mill,konklone Parker Moore,parkr Liu Fengyun,liufengyun两者都可通过site.data.members访问。在模板中渲染{% raw %}ul {% for member in site.data.members %} li a hrefhttps://github.com/{{ member.github }} {{ member.name }} /a /li {% endfor %} /ul{% endraw %}注意CSV 的每一行经过解析后成为一个映射列名即键名name、github与 YAML 中的键保持一致因此两种格式可以无缝切换。仓库测试夹具中的 products.yml- name: sugar / price: 5.3就是这类「列表 键值」结构的真实样例。用子文件夹组织数据命名空间逐级展开数据文件数量增多后可以放进_data的子文件夹中。每一级文件夹都会成为site.data命名空间中的一层。例如_data/orgs/jekyll.ymlusername: jekyll name: Jekyll members: - name: Tom Preston-Werner github: mojombo - name: Parker Moore github: parkr_data/orgs/doeorg.ymlusername: doeorg name: Doe Org members: - name: John Doe github: jdoe两个文件通过site.data.orgs访问随后接文件名site.data.orgs.jekyll、site.data.orgs.doeorg。由于orgs下每个文件本身是一个 Hash遍历时需要取出每个 Hash 的「值」{% raw %}ul {% for org_hash in site.data.orgs %} {% assign org org_hash[1] %} li a hrefhttps://github.com/{{ org.username }} {{ org.name }} /a ({{ org.members | size }} members) /li {% endfor %} /ul{% endraw %}org_hash是site.data.orgs中的每一对「键文件名→ 值文件内容」[1]取出值部分再通过点号访问其属性。这与源码中read_data_to的递归行为一致遇到子目录时先为目录名创建嵌套 Hash再继续向下读取data_reader.rb。按需读取通过 front matter 变量定位具体数据项数据文件不仅可以在模板中整体遍历页面与文章还可以按 key 精确访问某一条数据。官方示例_data/people.ymldave: name: David Smith twitter: DavidSilvaSmith在文章的 front matter 中声明作者--- title: sample post author: dave ---模板中用page.author作为下标取回对应数据{% raw %}{% assign author site.data.people[page.author] %} a relauthor hrefhttps://twitter.com/{{ author.twitter }} title{{ author.name }} {{ author.name }} /a{% endraw %}这种「front matter 存 key、数据文件存内容」的模式非常适合多作者博客、多语言站点等场景文章只声明author: dave作者的完整资料名字、主页、头像等统一维护在people.yml中。CSV/TSV 解析选项csv_reader与tsv_readerRuby 解析 CSV/TSV 的方式可以通过_config.yml中的csv_reader与tsv_reader两个配置键自定义二者暴露完全相同的选项配置键说明可选值默认值converters解析时应用的 CSV 转换器integer、float、numeric、date、date_time、all空列表encoding文件编码任意 Ruby 支持的编码名如utf-8站点的encoding配置项headers是否将首行解析为表头true/falsetrue配置示例csv_reader: converters: - numeric - datetime headers: true encoding: utf-8 tsv_reader: converters: - all headers: false源码实现位于 data_reader.rbcsv_config与tsv_config分别读取csv_reader/tsv_reader配置后者额外强制col_sep: \t制表符分隔read_config中converters被映射为 Symbol 数组headers默认trueencoding回退到站点级encoding。读取时.csv与.tsv文件走CSV.read(path, **config)分支其余格式YAML/JSON走SafeYAML.load_filedata_reader.rb。值得注意的两个行为当headers: true时每一行被转换为CSV::Row再to_hash列名成为键convert_row方法data_reader.rb当headers: false时首行被当作普通数据每行是一个数组此时converters: numeric会把数字字符串转成数值——这正是 test_data_reader.rb 中「with csv options set」用例验证的行为id从1变为整数1。源码视角数据文件如何被加载进site.data在构建流程中Site#processsite.rb按read → generate → render → cleanup → write的顺序执行数据读取发生在read阶段。核心实现是Jekyll::DataReaderread(dir)以_data为入口调用read_data_toread_data_to枚举目录中*.{yaml,yml,json,csv,tsv}文件以及子目录跳过符号链接entry_filter.symlink?子目录递归调用自身并将目录名作为下一层 Hash 的键普通文件以基本名作为键、解析结果作为值解析时按扩展名分发CSV/TSV 用CSV.read加对应配置YAML/JSON 用SafeYAML.load_file。这一实现直接决定了你使用数据文件时的几个「边界」数据文件的键是去扩展名后的基本名且经sanitize_filename清洗所以命名应避免特殊字符子目录层级决定命名空间深度深层嵌套会得到site.data.a.b.c式的访问路径_data下的符号链接会被跳过不会参与数据加载。进阶基于数据文件构建健壮导航本教程的数据文件导航是基础形态对于文档站点这类页数众多的场景Navigation 教程提供了更完整的方案体系核心思路与本文一脉相承用 YAML 数据源驱动导航而不是硬编码链接。该教程覆盖了按标题排序sort过滤器、二级/三级嵌套导航、通过page.sidebar等 front matter 变量动态选择数据列表、为当前页添加active类、按版本字段条件渲染条目以及用group_bysort对页面按分类分组等场景值得在掌握基础后继续深入。此外也可参考 Collections 文档了解另一种「按 front matter 属性检索内容」的组织方式。小结与下一步至此你已经完成了数据文件的完整实战在_data/navigation.yml中用 YAML 存储导航数据通过site.data.navigation在 Includes 导航模板 中遍历渲染输出与硬编码一致但更易维护掌握了 YAML/JSON/CSV/TSV 四种格式、命名规则、子文件夹命名空间与按 key 访问学会了用csv_reader/tsv_reader定制 CSV/TSV 的解析行为并理解了DataReader的底层加载逻辑。一个只有文字没有样式的站点显然不够完整。教程的下一步是 Step 7Assets将介绍如何在 Jekyll 中处理 CSS、JavaScript 与图片等静态资源。【免费下载链接】jekyll:globe_with_meridians: Jekyll is a blog-aware static site generator in Ruby项目地址: https://gitcode.com/gh_mirrors/je/jekyll创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

react-use 之 useAudio:创建 `<audio>` 元素、追踪播放状态并暴露播放控制器的 React Hook 实战指南

react-use 之 useAudio:创建 `<audio>` 元素、追踪播放状态并暴露播放控制器的 React Hook 实战指南

react-use 之 useAudio&#xff1a;创建 <audio> 元素、追踪播放状态并暴露播放控制器的 React Hook 实战指南 【免费下载链接】react-use React Hooks — &#x1f44d; 项目地址: https://gitcode.com/gh_mirrors/re/react-use 导读 useAudio 是 react-use 库中…

2026/9/18 23:39:20 阅读更多 →
Sunshine:4 步搭好你的游戏串流服务器

Sunshine:4 步搭好你的游戏串流服务器

Sunshine&#xff1a;4 步搭好你的游戏串流服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine 是一款开源、自托管的游戏串流服务器&#xff0c;把家里带独显的电脑变…

2026/9/18 23:39:20 阅读更多 →
tsParticles cosmic-radiation 调色板:从快速应用到源码级注册机制的完整指南

tsParticles cosmic-radiation 调色板:从快速应用到源码级注册机制的完整指南

tsParticles cosmic-radiation 调色板&#xff1a;从快速应用到源码级注册机制的完整指南 【免费下载链接】tsparticles tsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as anima…

2026/9/18 23:38:20 阅读更多 →

最新新闻

去ai味提示词的一点思考:AI检测分数与AI率会变,文章为什么仍然不好读?

去ai味提示词的一点思考:AI检测分数与AI率会变,文章为什么仍然不好读?

去ai味提示词的一点思考&#xff1a;AI检测分数与AI率会变&#xff0c;文章为什么仍然不好读&#xff1f; 不少人优化AI生成内容时&#xff0c;会先找一条很长的“去AI味提示词”&#xff1a;禁止使用首先其次&#xff0c;增加短句&#xff0c;加入情绪&#xff0c;替换高频词…

2026/9/19 0:24:47 阅读更多 →
YOLOv26模型在RK3588上部署:ONNX中转与RKNN量化实战

YOLOv26模型在RK3588上部署:ONNX中转与RKNN量化实战

1. 项目概述&#xff1a;为什么是 Yolov26 RK3588 RKNN ONNX 这个组合&#xff1f;Yolov26 这个名字一出来&#xff0c;很多老手第一反应是“等等&#xff0c;YOLO 系列官方最新是 v8、v10&#xff0c;v26 是什么&#xff1f;”——这恰恰是当前边缘AI部署里最典型的认知断层…

2026/9/19 0:24:47 阅读更多 →
一文讲透|一键生成论文工具测评:2026年最新推荐与对比

一文讲透|一键生成论文工具测评:2026年最新推荐与对比

2026年真正好用的一键生成论文工具&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。…

2026/9/19 0:24:47 阅读更多 →
告别低效写作:盘点2026年备受追捧的AI论文网站

告别低效写作:盘点2026年备受追捧的AI论文网站

一天写完毕业论文在2026年已成现实。2026年最实用的AI论文网站&#xff0c;覆盖选题、写作、查重、排版全流程&#xff0c;实测提速超300%&#xff0c;让你高效搞定论文不再难。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首选&#xff09; 这类工具…

2026/9/19 0:24:47 阅读更多 →
清单来了:盘点2026年口碑爆棚的一键生成论文工具

清单来了:盘点2026年口碑爆棚的一键生成论文工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年一键生成论文工具强势来袭&#xff0c;实测提速效果炸裂&#xff0c;覆盖选题、写作、查重、排版全流程&#xff0c;真正帮你高效搞定论文&#xff0c;告别熬夜赶稿&#xff01; 一、全流程王者&#xff1a;一站式搞定论文全链…

2026/9/19 0:24:47 阅读更多 →
vSAN故障诊断四层工具链与状态机解析

vSAN故障诊断四层工具链与状态机解析

简介&#xff1a;本资源是VMware vSAN运维工程师与虚拟化系统管理员必备的诊断与故障排除实战指南&#xff0c;聚焦vSAN生产环境中高频出现的健康告警、性能瓶颈、配置异常及硬件兼容性问题。手册系统梳理了运行状况服务原理、vSAN架构基础、八大核心排错工具&#xff08;vSphe…

2026/9/19 0:23:47 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介&#xff1a;面向机器学习、深度学习与数据建模学习者的一份完整研究文献&#xff0c;聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本&#xff0c;系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程&#xff0c;展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型&#xff0c;在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志&#xff0c;发现loss从凌晨两点就开始往上爬&#xff0c;一路从0.8涨到1.35&#xff0c;整整六个小时没人发现。那六个小时的训练不仅白跑&#xff0c;还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast&#xff1a;从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud &#x1f324;️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南&#xff1a;掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/16 19:03:19 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战&#xff1a;基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/17 7:57:36 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时&#xff0c;甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事&#xff0c;打开配置文件改一行不就完了&#xff1f;结果真动手才发现&#xff0c;Flutter项目里“应用名称”根本不是一处配置&#xff0c;而是一整套散落在 Androi…

2026/9/17 10:19:14 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/16 22:32:59 阅读更多 →