插件 API 参考

本文是 Clarify 插件机制的精确 API 说明。概念和使用场景请先阅读 插件机制


ClarifyPlugin

type ClarifyPlugin = {
  name: string
  hooks: Partial<ClarifyHooks>
}
字段类型必填说明
namestring插件名称,用于错误提示和调试
hooksPartial<ClarifyHooks>插件实现的生命周期 Hook

ClarifyHooks

type ClarifyHooks = {
  'routes:resolved'?: (
    input: { routes: ContentRoute[]; navigation: NavigationTree },
    ctx: ClarifyHookContext,
  ) =>
    | Promise<{ routes: ContentRoute[]; navigation: NavigationTree }>
    | { routes: ContentRoute[]; navigation: NavigationTree }

  'modules:before'?: (
    modules: Map<string, string>,
    ctx: ClarifyHookContext,
  ) => Promise<Map<string, string>> | Map<string, string>

  'build:done'?: (ctx: ClarifyHookContext) => Promise<void> | void
}

所有 Hook 都可以同步或异步返回。除 build:done 外,Hook 必须返回同类型结果。

类型定义中还包含预留的 pages:resolvedpage:transform,但当前 CLI 构建流程不会调用它们。本文只列出当前流程实际触发的 Hook。


ClarifyHookContext

type ClarifyHookContext = {
  projectConfig: ResolvedProjectConfig
  generateOptions: ResolvedBuildOptions
}

projectConfig

已应用默认值后的站点配置:

type ResolvedProjectConfig = {
  title: string
  logo?: string | { light?: string; dark?: string }
  favicon?: string | { light?: string; dark?: string }
  theme: {
    preset: 'default' | 'base'
    tokens: ResolvedClarifyThemeTokensConfig
    layout: ResolvedClarifyThemeLayoutConfig
  }
  description: string
  routePrefix: string
  navbar?: { links?: ClarifyNavbarLink[] }
  banner?: ClarifyBannerConfig
  footer?: ClarifyFooterConfig
  i18n?: ResolvedClarifyI18nConfig
  tabs?: ClarifyTabsConfig
}

generateOptions

type ResolvedBuildOptions = {
  rootDirectory: string
  outputDirectory?: string
  ssg: {
    failOnError: boolean
  }
}

页面类型

type ClarifyPage = {
  path: string
  filePath: string
  frontmatter: Record<string, unknown>
  content: string
}
字段说明
path页面 URL 路径
filePath内容文件绝对路径
frontmatter解析后的页面元数据
content页面正文内容

路由类型

type ContentRoute = {
  path: string
  basePath?: string
  locale?: string
  isFallback?: boolean
  alternates?: Record<string, string>
  title: string
  filePath: string
  virtualModuleId: string
  kind: 'mdx' | 'openapi'
  sections?: ContentSection[]
  rawContentUrl?: string
}
字段说明
path实际访问路径,启用 i18n 时可能带 locale 前缀
basePath不带 locale 的基础路径
locale当前路由所属语言
isFallback是否由默认语言回退生成
alternates同一页面在其他语言下的路径
title导航和搜索展示标题
filePath源文件绝对路径
virtualModuleIdClarify 内部虚拟模块 ID
kind页面类型:mdxopenapi
sections从 H2/H3 或 OpenAPI operation 中提取的页面目录
rawContentUrl原始内容文件输出 URL

导航类型

type NavigationTree =
  | ClarifyNavigationNode[]
  | LocalizedNavigation
  | TabbedNavigation
  | LocalizedTabbedNavigation

type LocalizedNavigation = Record<string, ClarifyNavigationNode[]>

type TabbedNavigation = { tabs: ClarifyNavigationTab[] }

type LocalizedTabbedNavigation = Record<string, TabbedNavigation>

type ClarifyNavigationTab = {
  type: 'tab'
  path: string
  title: string
  icon?: string
  children: ClarifyNavigationNode[]
}

type ClarifyNavigationNode = {
  path: string
  title: string
  icon?: string
  children?: ClarifyNavigationNode[]
  sections?: Pick<ContentSection, 'id' | 'title' | 'badge' | 'tags'>[]
}

启用 tabs 时,navigation{ tabs } 结构;同时启用 i18n 时,navigation 是按 locale 分组的 { tabs } 对象。未启用 tabs 时仍是普通侧边栏数组,启用 i18n 时是按 locale 分组的侧边栏数组。


虚拟模块

modules:before 收到的是 Map<string, string>,键为虚拟模块 ID,值为模块源码。

常见虚拟模块包括:

模块 ID说明
virtual:clarify-config运行时站点配置
virtual:clarify-routes路由和导航数据
virtual:clarify-openapi-registry已解析的 OpenAPI 规范表
virtual:clarify-entry-client客户端入口

修改虚拟模块属于高级用法,建议只在实现搜索、分析或内部平台集成时使用。