You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
vitepress/docs/ru/reference/runtime-api.md

10 KiB

description
Справочник по Runtime API VitePress, включая композаблы, вспомогательные функции и встроенные компоненты.

Runtime API

VitePress предлагает несколько встроенных API, позволяющих получить доступ к данным приложения. VitePress также поставляется с несколькими встроенными компонентами, которые можно использовать глобально.

Вспомогательные методы глобально импортируются из vitepress и обычно используются в компонентах Vue для пользовательских тем. Однако их можно использовать и внутри страниц .md, так как файлы markdown компилируются в однофайловые компоненты Vue.

Методы, начинающиеся с use*, указывают на то, что это функция Vue 3 Composition API («композабл»), которая может быть использована только внутри setup() или <script setup>.

useData

Возвращает данные, относящиеся к конкретной странице. Возвращаемый объект имеет следующий тип:

interface VitePressData<T = any> {
  /**
   * Метаданные на уровне сайта
   */
  site: Ref<SiteData<T>>
  /**
   * themeConfig из .vitepress/config.js
   */
  theme: Ref<T>
  /**
   * Метаданные на уровне страницы
   */
  page: Ref<PageData>
  /**
   * Метаданные страницы
   */
  frontmatter: Ref<PageData['frontmatter']>
  /**
   * Параметры динамического маршрута
   */
  params: Ref<PageData['params']>
  title: Ref<string>
  description: Ref<string>
  lang: Ref<string>
  isDark: Ref<boolean>
  dir: Ref<string>
  localeIndex: Ref<string>
  /**
   * Текущий хеш адреса
   */
  hash: Ref<string>
}

interface PageData {
  title: string
  titleTemplate?: string | boolean
  description: string
  relativePath: string
  filePath: string
  headers: Header[]
  frontmatter: Record<string, any>
  params?: Record<string, any>
  isNotFound?: boolean
  lastUpdated?: number
}

page.headers заполняется только в том случае, если включён параметр markdown.headers. Без него это свойство остаётся пустым массивом. Оглавление в теме по умолчанию получает заголовки из уже отрендеренного содержимого страницы, поэтому оно может отображаться, даже если page.headers пуст.

Пример:

<script setup>
import { useData } from 'vitepress'

const { theme } = useData()
</script>

<template>
  <h1>{{ theme.footer.copyright }}</h1>
</template>

useRoute

Возвращает текущий объект маршрута со следующим типом:

interface Route {
  path: string
  data: PageData
  component: Component | null
}

useRouter

Возвращает экземпляр маршрутизатора VitePress, чтобы вы могли программно перейти на другую страницу.

interface Router {
  /**
   * Текущий маршрут.
   */
  route: Route
  /**
   * Переход к новому URL-адресу.
   */
  go: (to?: string) => Promise<void>
  /**
   * Вызывается перед изменением маршрута. Верните `false`, чтобы отменить навигацию.
   */
  onBeforeRouteChange?: (to: string) => Awaitable<void | boolean>
  /**
   * Вызывается перед загрузкой компонента страницы (после того, как состояние истории
   * обновлено). Верните `false`, чтобы отменить навигацию.
   */
  onBeforePageLoad?: (to: string) => Awaitable<void | boolean>
  /**
   * Вызывается после загрузки компонента страницы (перед обновлением компонента страницы).
   */
  onAfterPageLoad?: (to: string) => Awaitable<void>
  /**
   * Вызывается после изменения маршрута.
   */
  onAfterRouteChange?: (to: string) => Awaitable<void>
}

Назначьте обработчики изменения маршрутов для экземпляра маршрутизатора:

const router = useRouter()

router.onBeforeRouteChange = (to) => {
  console.log('переход к', to)
}

В пользовательских темах этот же экземпляр маршрутизатора доступен через enhanceApp.

useIcon

  • Тип: (icon: MaybeRefOrGetter<string | { svg: string } | undefined>, el?: MaybeRefOrGetter<HTMLElement | null>) => ComputedRef<string | undefined>

Отрисовывает иконку iconify через пайплайн иконок VitePress. Принимает полностью квалифицированное имя collection:name (разрешается относительно пакетов @iconify-json/* в зависимостях вашего проекта) и возвращает класс, который нужно поставить на элемент — vpi-<collection>-<name>.

Во время SSR имя регистрируется в SSGContext страницы, поэтому сборка добавляет стили иконки в сгенерированную таблицу стилей; в режиме разработки иконки отдаются dev-сервером по требованию из локально установленных коллекций. Ни одна иконка никогда не загружается с внешнего сервиса.

<script setup>
import { useIcon } from 'vitepress'
import { useTemplateRef } from 'vue'
const el = useTemplateRef('el')
const iconClass = useIcon('lucide:rocket', el)
</script>
<template>
  <span ref="el" :class="iconClass" />
</template>

Передайте шаблонную ссылку элемента, несущего класс, чтобы dev-режим мог разрешить на нём иконку. Элементу нужны правила mask, которые поставляются с темой по умолчанию; в кастомной теме без них dev применяет встроенный эквивалент, а сгенерированная таблица стилей включает базовые правила с нулевой специфичностью для продакшена.

При использовании темы по умолчанию компонент VPIcon из vitepress/theme оборачивает этот композабл (а также принимает сырую строку { svg }):

<VPIcon icon="lucide:rocket" />

Иконки, отрисовываемые только на клиенте (например, внутри <ClientOnly />), не могут быть собраны во время сборки — вместо этого перечислите их в icons.include.

withBase

  • Тип: (path: string) => string

Добавляет настроенный base к заданному URL-пути. Также смотрите секцию Базовый URL.

<Content />

Компонент <Content /> отображает отрисованное содержимое Markdown. Полезно при создании собственной темы.

<template>
  <h1>Пользовательский макет!</h1>
  <Content />
</template>

<ClientOnly />

Компонент <ClientOnly /> отображает свой слот только на стороне клиента.

Поскольку приложения VitePress при генерации статических сборок рендерятся в Node.js, любое использование Vue должно соответствовать универсальным требованиям к коду. Короче говоря, убедитесь, что доступ к API Browser / DOM осуществляется только в хуках beforeMount или mounted.

Если вы используете или демонстрируете компоненты, которые не являются SSR-дружественными (например, содержат пользовательские директивы), вы можете обернуть их внутри компонента ClientOnly.

<ClientOnly>
  <NonSSRFriendlyComponent />
</ClientOnly>

$frontmatter

Прямой доступ к метаданным текущей страницы в выражениях Vue.

---
title: Привет
---

# {{ $frontmatter.title }}

$params

Прямой доступ к параметрам динамических маршрутов текущей страницы в выражениях Vue.

- имя пакета: {{ $params.pkg }}
- версия: {{ $params.version }}