合并键
配置数据是如何合并的
正如在 共享数据 中解释的那样,分配给每个页面的数据是将直接分配给页面的数据(例如 front matter)与父文件夹的数据(存储在 _data
文件和文件夹中)合并的结果。
├── _data.yaml
├── ...
└── documents
└── _data.json
└── ...
└── examples
└── _data.json
└── my-page.md
在这个例子中,/documents/examples/my-page.md
文件包含了来自页面 front matter 的所有数据,并与来自 /documents/examples/_data.json
、documents/_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");