合并键

配置数据是如何合并的

正如在 共享数据 中解释的那样,分配给每个页面的数据是将直接分配给页面的数据(例如 front matter)与父文件夹的数据(存储在 _data 文件和文件夹中)合并的结果。

├── _data.yaml
├── ...
└── documents
    └── _data.json
    └── ...
    └── examples
        └── _data.json
        └── my-page.md

在这个例子中,/documents/examples/my-page.md 文件包含了来自页面 front matter 的所有数据,并与来自 /documents/examples/_data.jsondocuments/_data.json/_data.yaml 文件的数据合并,优先级顺序如上

对象模式合并

在合并变量时,完整的值会被覆盖。但您可能希望以不同的方式合并某些值。例如,假设我们有以下两个数据文件,一个在根目录,另一个在子文件夹中。这两个文件都有一个 site 变量,但值不同:

site:
  title: My humble site
  author: Oscar Otero
site:
  author: Laura Rubio

子文件夹(和子子文件夹)中的所有页面都将拥有变量的最新版本,该变量具有 author 子键但缺少 title 值,因为整个变量被覆盖了。您可以使用特殊值 mergedKeys 来更改此行为。此值指示 Lume 如何合并某些键:

mergedKeys:
  site: object

site:
  title: My humble site
  author: Oscar Otero
site:
  author: Laura Rubio

在这个例子中,我们向 Lume 指示变量 site 必须使用 object 模式合并。现在,变量 site 的结果是一个对象,其中包含父变量的属性,并且仅覆盖同名的属性。所以结果会是这样的:

site:
  title: My humble site
  author: Laura Rubio

object 合并模式不是递归的;它仅适用于第一级属性。未来可能会添加递归选项。

Note

mergedKeys 变量也会与其他子文件夹和页面中的 mergedKeys 变量合并,并且始终使用 object 模式。这意味着您可以在站点的根 _data 文件中定义此变量,并在特定的子文件夹中覆盖它。

数组模式

还有另一种用于数组的合并模式。在这种模式下,合并结果是一个数组,其中包含在所有 _data 级别中找到的所有值。例如:

mergedKeys:
  category: array

category:
  - programming
  - deno
  - javascript
category: typescript

此合并的结果是:

category:
  - programming
  - deno
  - javascript
  - typescript

这是一个数组,其中包含所有父 _data 上下文中存在的所有值。结果仅包含唯一值:如果同一个值在不同的 _data 上下文中重复出现,则结果中仅包含一次。

stringArray 模式

有一种特殊情况,您希望确保数组的所有值都是字符串。让我们看下面的例子:

mergedKeys:
  category: array

category:
  - errors
  - 404
category: "404"

此合并的结果是:

category:
  - errors
  - 404
  - "404"

正如您所看到的,值 404 被重复了,一次是数字,一次是字符串。为了防止这种行为,您可能希望将所有值转换为字符串以删除重复项。使用 stringArray 模式代替 array

mergedKeys:
  category: stringArray

现在,此合并的结果是:

category:
  - errors
  - "404"

Note

为了向后兼容,Lume 自动将 stringArray 合并模式分配给键 tags

从 Lume 1.19 版本开始,可以从 _config.ts 文件中配置合并键策略:

// _config.ts

site.mergeKey("category", "stringArray");