页面头部参数默认值 Front Matter Defaults

使用页面头部参数(front matter)可以指定站点页面和文章配置。可以在页面或文章的页面头部参数中设置默认布局、自定义标题,或指定更精确的日期/时间等信息。

有时候有些配置选项需要重复设置,比如在每个文件中设置相同的布局,为文章添加相同的分类(或多个分类)等。以及其他添加的自定义变量,比如博客中大多数文章都有同一个作者。

为了避免每次创建新文章或页面时都重复设置,Jekyll 提供了在站点配置中对这些页面头部参数(front matter)设定默认值的方法。您可以在项目根目录下的 _config.yml 文件中,通过使用 defaults 键来指定全站的默认设置。

defaults 键包含一个 scope/values 对数组,用于设定特定文件路径下的默认配置,可以选择性设定默认设置。

如果您想要为站点中所有的页面和文章添加一个默认布局,您可以在 _config.yml 文件中加入如下内容:

defaults:
  -
    scope:
      path: "" # path为空时,表示所有文件。
    values:
      layout: "default"
停止 `jekyll serve` 命令并重新运行该命令。

_config.yml 是主配置文件,包含全局配置和变量定义,这些配置只在执行时读取一次。在自动重新生成期间对 _config.yml 的更改需要重新执行命令才能生效。

注意,在自动重新生成期间,数据文件 会被重新处理。

values 适用的范围为 scope 定义路径(path)中的任何文件。如果路径设置为空字符串,它会处理 Jekyll 项目中的所有文件。可能我们并不想对每个文件(例如 CSS 文件)设置布局,所以需要在 scope 键下指定一个 type 值来限制处理的范围。

defaults:
  -
    scope:
      path: "" # 如果为空表示所有文件。
      type: "posts" # Jekyll 2.2和以下版本使用`post`。
    values:
      layout: "default"

现在,只对类型为 posts 的文件设置布局。

可用的类型有 pages(页面)、posts(文章)、drafts(草稿)或站点中的任何集合。虽然 type 是可选的,但在创建 scope/values 时,必须为 path 指定一个值。

我们可以给 defaults 设置多个 scopevalues

defaults:
  -
    scope:
      path: ""
      type: "pages"
    values:
      layout: "my-site"
  -
    scope:
      path: "projects"
      type: "pages" # Jekyll 2.2和以下版本使用`page`。 previously `page` in Jekyll 2.2.
    values:
      layout: "project" # 将覆盖之前的默认布局。 overrides previous default layout
      author: "Jekylldo"

根据这个配置,所有页面都会使用 my-site 布局。projects/ 文件夹中的所有 HTML 文件都会使用 project 布局,并且将 page.author liquid 变量 设置为 Jekylldo

collections:
  my_collection:
    output: true

defaults:
  -
    scope:
      path: ""
      type: "my_collection" # 站点中的一个集合,使用复数形式。 a collection in your site, in plural form
    values:
      layout: "default"

在这个示例中,layout 被设置为 default,并放在名为 my_collection集合(collection) 中。

Front Matter(页面头部参数)默认值中的通配模式

在匹配默认值时,也可以使用通配符模式(目前仅支持包含 * 的模式)。例如,可以为 section 文件夹任意子目录中的每个 special-page.html 设置特定的布局。3.7.0

collections:
  my_collection:
    output: true

defaults:
  - 
    scope:
      path: "section/*/special-page.html"
    values:
      layout: "specific-layout"
通配模式与性能

请注意,使用路径通配符已知会对性能产生负面影响,目前尚未进行优化,尤其是在 Windows 系统中更为明显。 路径通配将根据相关集合目录的大小,成比例地增加构建时间。

优先级

Jekyll 会应用你在 _config.yml 文件中 defaults 部分指定的所有配置设置。你可以通过为 scope 指定更具体的路径,来覆盖其他范围/值对中的设置。

你可以在上面倒数第二个示例中看到这一点。首先,我们将默认页面布局设置为 my-site。接着,通过更具体的路径,我们将 projects/ 路径下页面的默认布局设置为 project。这种方式可以应用于你在页面或文章 Front Matter 中设置的任何值。

最后,如果你在站点配置中通过 _config.yml 文件添加了 defaults 部分设置了默认值,你可以在具体的文章或页面文件中进行覆盖。你只需要在文章或页面的 Front Matter 中指定这些设置。例如:

# 在 _config.yml 中
...
defaults:
  - 
    scope:
      path: "projects"
      type: "pages"
    values:
      layout: "project"
      author: "Jekylldo"
      category: "project"
...
# 在 projects/foo_project.md 中
---
author: "John Smith"
layout: "foobar"
---
文章内容写在这里...

构建站点时,projects/foo_project.md 文件的 layout 会被设置为 foobar,而不是 projectauthor 会被设置为 John Smith,而不是 Jekylldo