ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Jekyll 变量完全指南:掌握 site、page、paginator 等 Liquid 数据模型

Jekyll 变量完全指南:掌握 site、page、paginator 等 Liquid 数据模型 Jekyll 变量完全指南掌握 site、page、paginator 等 Liquid 数据模型【免费下载链接】jekyll:globe_with_meridians: Jekyll is a blog-aware static site generator in Ruby项目地址: https://gitcode.com/gh_mirrors/je/jekyllJekyll 在遍历站点处理文件时会为每个带有 front matter 的文件准备一套丰富的 Liquid 数据上下文让模板可以按需读取站点配置、页面元数据、文章列表和分页信息。本篇以官方 Variables 参考文档 及其数据定义docs/_data/jekyll_variables.yml为主体完整梳理 Jekyll 的全部内置变量分类、字段语义与适用场景并结合仓库源码说明这些变量是如何注入渲染管线的帮助你在模板编写、主题开发和插件调试中精准取用。变量从何而来渲染管线与统一载荷在深入每个变量之前先理解一个关键事实Jekyll 并不是在模板里凭空提供site、page这些名字的它们来自渲染时注入的统一载荷Unified Payload。从源码看渲染的核心入口是 lib/jekyll/renderer.rb 中的Renderer#run方法它依次调用assign_pages!、assign_current_document!、assign_highlighter_options!和assign_layout_data!来装配当前渲染所需的上下文然后触发pre_render钩子并执行render_document。这些赋值最终落在一个Jekyll::Drops::UnifiedPayloadDrop实例上其定义位于 lib/jekyll/drops/unified_payload_drop.rbcontent、page、layout、paginator、highlighter_prefix、highlighter_suffix是可读写的属性该类声明了mutable truejekyll返回JekyllDrop.global单例site懒加载创建SiteDroptheme在当前站点配置了主题 gem 时创建ThemeDrop。也就是说你在模板里写的{{ site.url }}实际上是在对一个SiteDrop对象做属性访问{{ page.title }}则是对DocumentDrop或PageDrop的访问。这种设计Liquid 的 Drop 机制保证了模板只能读取白名单内的字段从而避免暴露底层对象中无关的内部状态——例如 lib/jekyll/drops/site_drop.rb 中SiteDrop#config被显式置空{{ site.config }}永远返回nil。全局变量五个顶层命名空间所有页面、文章、布局在渲染时都能直接访问以下五个顶层变量它们构成了 Jekyll 模板世界的根作用域变量说明site站点级信息 _config.yml中的配置项详细字段见下文 Site 变量一节page页面/文档级信息 该文件的 front matter自定义变量也挂在这里layout布局级信息 布局文件的 front matterjekyll与 Jekyll 构建本身相关的信息版本、环境theme主题 gem 的 gemspec 元数据可用于渲染主题 demo 的 About 页等场景content仅存在于布局文件中是被包裹的 Post 或 Page 渲染完成后的内容在 Post/Page 自身文件中未定义paginator当_config.yml设置了paginate配置项后才会出现用于分页模板注意content与layout的配合方式布局模板通过{{ content }}输出内层页面渲染结果而布局自身的 front matter 通过layout.xxx访问。关于 front matter 的写法可参考 front matter 文档。Site 变量站点级信息与配置site命名空间承载整站数据既包含 Jekyll 内置的站点对象列表也包含你在_config.yml中定义的一切自定义配置。完整字段如下变量说明site.time运行jekyll命令那一刻的当前时间site.pages所有 Page 的列表site.posts按时间倒序排列的所有 Post 列表site.related_posts若当前处理的文件是 Post则为最多 10 篇相关文章默认取最近 10 篇。若需要高质量但计算慢的结果可加--lsi参数运行 jekyll基于潜在语义索引。注意 GitHub Pages 不支持lsi选项site.static_files所有静态文件的列表即不被转换器和 Liquid 处理的文件每个文件含path、modified_time、name、basename、extname五个属性详见 静态文件文档site.html_pagessite.pages的子集以.html结尾的页面site.html_filessite.static_files的子集以.html结尾的静态文件site.collections所有集合collection的列表包含 posts 本身site.data从_data目录下 YAML/JSON 文件加载的数据site.documents所有集合中全部文档document的列表site.categories.CATEGORY属于分类CATEGORY的所有 Postsite.tags.TAG带标签TAG的所有 Postsite.url_config.yml中配置的站点 URL例如配置url: http://mysite.com后即可用{{ site.url }}取到开发环境jekyll serve下会被自动设置为host、port及 SSL 相关选项推导出的值默认http://localhost:4000site.[CONFIGURATION_DATA]命令行与_config.yml中设置的所有变量都可通过site读取例如配置foo: bar后模板中可用site.foo。注意watch 模式下 Jekyll 不会重新解析_config.yml的改动修改配置后必须重启 Jekyll 才能看到新变量从实现上看SiteDroplib/jekyll/drops/site_drop.rb通过delegate_methods把time、pages、static_files、tags、categories直接代理给底层Site对象posts方法对obj.posts.docs按日期倒序排序后缓存html_pages会额外把 URL 以/结尾的页面也纳入site.data与site[配置键]则经由fallback_data回退到站点配置哈希。因此_config.yml里几乎所有顶层键都能在模板里以site.键名访问——这与 configuration 文档 描述的配置体系完全一致。一个典型的整站遍历用法仓库测试站点 test/source/sitemap.xml 中即有体现{% for post in site.posts %} url loc{{ post.url }}/loc lastmod{{ site.time | date: %Y-%m-%d }}/lastmod /url {% endfor %}Page 变量页面、文章与文档的元数据page命名空间包含当前处理文件的具体信息与 front matter。对于 Post 和集合文档它由DocumentDroplib/jekyll/drops/document_drop.rb提供对于普通页面则由PageDrop提供。完整字段如下变量说明page.content页面内容具体是渲染前还是渲染后取决于当前处理到哪一步以及page指向谁page.title页面或文档的标题page.excerpt页面或文档未渲染的摘要excerpt。可在 front matter 中覆盖若想对某个页面/文档单独禁用摘要可在其 front matter 中设置excerpt_separator为空字符串若想全站禁用则在配置文件顶层设置相同的键page.url不带域名、带前导斜杠的 URL例如/2008/12/14/my-post.htmlpage.datePost 分配的日期。可在 front matter 中覆盖格式为YYYY-MM-DD HH:MM:SSUTC或YYYY-MM-DD HH:MM:SS /-TTTT带时区偏移如2008-12-14 10:30:00 0900。不适用于普通 Pagepage.id集合文档或 Post 的唯一标识常用于 RSS 订阅源例如/2008/12/14/my-post、/my-collection/my-document。不适用于普通 Pagepage.categories该 Post 所属分类列表。分类从_posts目录之上的目录结构推导例如位于/work/code/_posts/2008-12-24-closures.md的 Post 该字段为[work, code]也可在 front matter 中显式指定。注意基于路径的分类可能不适用于用户自定义集合中的文档page.collection文档所属集合的 label例如 Post 为posts路径_puppies/rover.md的文档为puppies不属于任何集合时返回空字符串page.tags该 Post 的标签列表可在 front matter 中指定page.dir从源目录到页面文件之间的路径例如页面位于pages/about.md时值为/pages/。它由页面的url属性推导因此可通过 front matter 的permalink覆盖。注意不适用于 Post 和用户自定义集合中的文档此类场景请用categories获取类似信息page.namePost 或页面的文件名例如about.mdpage.pathPost 或页面原始文件相对于源目录的路径。典型用法拼接仓库 blob URL 得到该文件在代码仓库中的完整地址。可在 front matter 中覆盖page.slug文档资源去掉扩展名Post 再去掉日期前缀后的文件名。例如 URL 为/2017/02/22/my-new-post.html的 Post其 slug 是my-new-post。可在 front matter 中覆盖page.ext文档资源的文件扩展名例如.html。可在 front matter 中覆盖page.next相对当前 Post 在site.posts中的位置下一篇文章最后一篇为nilpage.previous相对当前 Post 在site.posts中的位置上一篇文章第一篇为nilpage.next/page.previous在 lib/jekyll/drops/document_drop.rb 中通过obj.next_doc/obj.previous_doc生成可用于文章页底部的上一篇 / 下一篇导航。ProTip自定义 Front Matter任何你在 front matter 中自定义的键都会自动挂到page下。例如某页面声明--- custom_css: true ---模板中即可用{{ page.custom_css }}取到true。同理若在布局的 front matter 中声明--- class: full_page ---那么在布局及其父布局中可通过layout.class访问到full_page。这一机制在 lib/jekyll/drops/drop.rb 的[]方法中体现当键不是 Drop 的已定义方法时会回退到fallback_data即 front matter 哈希查找这就是自定义变量能够透明透传的原因。Jekyll 变量构建信息jekyll命名空间由JekyllDroplib/jekyll/drops/jekyll_drop.rb实现仅有两个字段变量说明jekyll.version构建当前站点所用的 Jekyll 版本jekyll.environment构建时JEKYLL_ENV环境变量的值JekyllDrop是单例JekyllDrop.globalversion直接返回Jekyll::VERSIONenvironment返回Jekyll.env。JEKYLL_ENV的取值如development/production会影响部分行为例如下文theme.root的渲染条件以及 environments 文档 中描述的配置差异。Theme 变量主题 gem 元数据4.3.0 新增从 Jekyll 4.3.0 起theme命名空间可用用于暴露当前主题 gem 的 gemspec 信息。该变量由 lib/jekyll/drops/theme_drop.rb 实现全部字段均从主题的 gemspec 读取变量说明theme.root主题 gem 的绝对路径。仅在JEKYLL_ENV为development时渲染其他环境为空字符串theme.authors主题 gem 作者逗号分隔的字符串theme.description主题 gemspec 中声明的描述description或简介summarytheme.version当前主题的版本字符串theme.dependencies主题的运行时依赖列表theme.metadata主题 gemspec 中定义的键值对映射从 lib/jekyll/drops/theme_drop.rb 源码看authors由gemspec.authors.join(, )生成description优先取gemspec.description、缺失时回退到summaryroot只在ENV[JEKYLL_ENV] development时返回obj.root否则返回空串——这正是文档中仅在开发环境渲染的实现依据。你可以在自己的主题 demo 站点中用{{ theme.description }}渲染 About 页面。Paginator分页专用变量当_config.yml中启用了paginate配置项后paginator变量才可用。这些变量仅存在于 index 类文件中但 index 文件可以位于子目录例如/blog/index.html。完整字段如下变量说明paginator.page当前页码paginator.per_page每页文章数paginator.posts当前页可用的文章paginator.total_posts文章总数paginator.total_pages总页数paginator.previous_page上一页页码不存在则为nilpaginator.previous_page_path上一页的路径不存在则为nilpaginator.next_page下一页页码不存在则为nilpaginator.next_page_path下一页的路径不存在则为nil分页的配置与完整用法包括在_config.yml中设置paginate和paginate_path参见 分页文档。paginator对象由UnifiedPayloadDrop中的同名属性承载因此只在开启分页、且当前页面被标记为 index 文件时才被填充。实战组合一页模板吃透全部变量将上述变量组合使用即可构建一个信息完整的文章页模板。以下示例结合了page元数据、site配置、jekyll环境与page.previous/next导航--- layout: default title: 我的文章 custom_css: true --- article h1{{ page.title }}/h1 time datetime{{ page.date | date_to_xmlschema }} {{ page.date | date: %Y-%m-%d }} /time p分类{{ page.categories | join: , }} | 标签{{ page.tags | join: , }}/p {{ content }} p {% if page.previous %} a href{{ page.previous.url }}← {{ page.previous.title }}/a {% endif %} {% if page.next %} a href{{ page.next.url }}{{ page.next.title }} →/a {% endif %} /p footer 由 Jekyll {{ jekyll.version }} 构建 环境{{ jekyll.environment }} /footer /article分页列表页则依赖paginator{% for post in paginator.posts %} h2a href{{ post.url }}{{ post.title }}/a/h2 {% endfor %} {% if paginator.total_pages 1 %} {% if paginator.previous_page %} a href{{ paginator.previous_page_path }}上一页/a {% endif %} span第 {{ paginator.page }} / {{ paginator.total_pages }} 页/span {% if paginator.next_page %} a href{{ paginator.next_page_path }}下一页/a {% endif %} {% endif %}延伸阅读变量中的content、excerpt、page.next等字段的渲染行为可结合 渲染过程文档 理解自定义 front matter 变量与默认值机制见 front matter 文档 与 front-matter-defaults 文档site.data的目录约定与数据组织见 数据文件文档想查看这套变量在真实站点中的用法可阅读仓库测试站点 test/source/index.html遍历site.posts与 test/source/sitemap.xml组合site.time、site.posts、site.html_pages若在模板中使用了变量却未得到预期值可运行jekyll doctor或在调试时参考 log 与调试文档 中的相关选项。【免费下载链接】jekyll:globe_with_meridians: Jekyll is a blog-aware static site generator in Ruby项目地址: https://gitcode.com/gh_mirrors/je/jekyll创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表