高级用法

转换器

Nuxt Content 中的 Transformers 允许你在内容文件处理过程中以编程方式解析、修改或分析你的内容文件。

Nuxt Content 中的 Transformers 允许你在内容文件处理过程中以编程方式解析、修改或分析你的内容文件。它们特别适用于:

  • 添加或修改字段(例如,给标题追加内容、生成 slug)
  • 提取元数据(例如,列出使用的组件)
  • 用计算数据丰富内容
  • 支持新的内容类型

定义 Transformer

你可以使用来自 @nuxt/contentdefineTransformer 辅助函数定义一个 transformer:

~~/transformers/title-suffix.ts
import { defineTransformer } from '@nuxt/content'

export default defineTransformer({
  name: 'title-suffix',
  extensions: ['.md'], // 要应用此 transformer 的文件扩展名
  transform(file) {
    // 根据需要修改文件对象
    return {
      ...file,
      title: file.title + ' (suffix)',
    }
  },
})

Transformer 选项

  • name(字符串):你的 transformer 的唯一名称。
  • extensions(字符串数组):此 transformer 应应用的文件扩展名(例如 ['.md'])。
  • transform(函数):接收文件对象并返回修改后文件的函数。

注册 Transformers

在你的 nuxt.config.ts 中注册 transformers:

nuxt.config.ts
export default defineNuxtConfig({
  content: {
    build: {
      transformers: [
        '~~/transformers/title-suffix',
        '~~/transformers/my-custom-transformer',
      ],
    },
  },
})

示例:添加元数据

Transformers 可以向文件添加一个 __metadata 字段。该字段不会存储到数据库中,但可用于运行时逻辑。

~~/transformers/component-metadata.ts
import { defineTransformer } from '@nuxt/content'

export default defineTransformer({
  name: 'component-metadata',
  extensions: ['.md'],
  transform(file) {
    // 示例:检测是否使用了自定义组件
    const usesMyComponent = file.body?.includes('<MyCustomComponent>')
    return {
      ...file,
      __metadata: {
        components: usesMyComponent ? ['MyCustomComponent'] : [],
      },
    }
  },
})

注意: __metadata 字段仅在运行时可用,不会持久化到内容数据库中。

API 参考

interface Transformer {
  name: string
  extensions: string[]
  transform: (file: ContentFile) => ContentFile
}
  • ContentFile 是表示已解析内容文件的对象,包括 frontmatter、主体及其他字段。

使用 Transformers 支持新的文件格式

Transformers 不仅限于修改现有内容——它们还可以用于为 Nuxt Content 添加对新文件格式的支持。通过定义带有自定义 parse 方法的 transformer,你可以指示 Nuxt Content 如何读取和处理带有新扩展名的文件,如 YAML。

示例:YAML 文件支持

假设你想在内容目录中支持 .yml.yaml 文件。你可以创建一个 transformer,解析 YAML frontmatter 和正文,并为这些扩展名注册它:

~~/transformers/yaml.ts
import { defineTransformer } from '@nuxt/content'

export default defineTransformer({
  name: 'Yaml',
  extensions: ['.yml', '.yaml'],
  parse: (file) => {
    const { id, body } = file
    
    // 使用你喜欢的 YAML 解析器解析正文
    const parsed = parseYaml(body)

    return {
      ...parsed,
      id,
    }
  },
})

像注册其他 transformer 一样在 Nuxt 配置中注册你的 YAML transformer:

export default defineNuxtConfig({
  content: {
    build: {
      transformers: [
        '~~/transformers/yaml',
        // ...其他 transformers
      ],
    },
  },
})

此方法允许你扩展 Nuxt Content,以处理你需要的任意自定义文件格式。