For AI agents: the complete documentation index is available at https://rspress.rs/zh/llms.txt, the full documentation bundle is available at https://rspress.rs/zh/llms-full.txt, and this page is available as Markdown at https://rspress.rs/zh/api/config/config-basic.md.
close
  • 中文
  • 基础配置

    root

    • 类型: string
    • 默认值: docs

    指定文档根目录。比如:

    rspress.config.ts
    import { 
    function defineConfig<const Config extends UserConfig>(config: () => Promise<Config>): UserConfigAsyncFn (+1 overload)

    Define an async Rspress configuration function. Use this overload when you need to perform async operations during configuration, such as fetching remote data, reading files, or dynamically generating config.

    @paramconfig - An async function that returns the Rspress configuration.@returnsThe same async function (enables type checking and IDE autocompletion).@example
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig(async () => {
      const remoteConfig = await fetchConfig();
      return {
        title: remoteConfig.title,
      };
    });
    defineConfig
    } from '@rspress/core';
    export default
    function defineConfig(config: UserConfig): UserConfig (+1 overload)

    Define a static Rspress configuration object.

    @paramconfig - The Rspress configuration object.@returnsThe same configuration object (enables type checking and IDE autocompletion).@example
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      title: 'My Site',
    });
    defineConfig
    ({
    UserConfig.root?: string | undefined

    The root directory of the site.

    @default'docs'
    root
    : 'docs',
    });

    该配置同时支持相对路径和绝对路径,相对路径相对于当前工作目录。

    当然,除了通过配置文件来指定文档根目录,你也可以通过命令行参数来指定,比如:

    rspress dev docs
    rspress build docs

    base

    • 类型: string
    • 默认值: /

    部署基础路径。比如,如果你计划将你的站点部署到 https://foo.github.io/bar/,那么你应该将 base 设置为 "/bar/":

    rspress.config.ts
    import { 
    function defineConfig<const Config extends UserConfig>(config: () => Promise<Config>): UserConfigAsyncFn (+1 overload)

    Define an async Rspress configuration function. Use this overload when you need to perform async operations during configuration, such as fetching remote data, reading files, or dynamically generating config.

    @paramconfig - An async function that returns the Rspress configuration.@returnsThe same async function (enables type checking and IDE autocompletion).@example
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig(async () => {
      const remoteConfig = await fetchConfig();
      return {
        title: remoteConfig.title,
      };
    });
    defineConfig
    } from '@rspress/core';
    export default
    function defineConfig(config: UserConfig): UserConfig (+1 overload)

    Define a static Rspress configuration object.

    @paramconfig - The Rspress configuration object.@returnsThe same configuration object (enables type checking and IDE autocompletion).@example
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      title: 'My Site',
    });
    defineConfig
    ({
    UserConfig.base?: string | undefined

    Base path of the site.

    @default'/'
    base
    : '/bar/',
    });

    siteOrigin

    • 类型: string
    • 默认值: ""

    站点的可选部署 origin,例如 https://foo.github.io。

    Rspress 在生成需要绝对 URL 的文件时会结合该值和 base,例如 sitemap.xml、llms.txt 链接或插件输出。完整 URL 拼接顺序是 siteOrigin + base + routePath。

    如果没有配置 siteOrigin,Rspress 会回退使用 base + routePath。

    如果你的站点部署到 https://foo.github.io/bar/,请将 siteOrigin 设置为 "https://foo.github.io",并将 base 设置为 "/bar/":

    rspress.config.ts
    import { 
    function defineConfig<const Config extends UserConfig>(config: () => Promise<Config>): UserConfigAsyncFn (+1 overload)

    Define an async Rspress configuration function. Use this overload when you need to perform async operations during configuration, such as fetching remote data, reading files, or dynamically generating config.

    @paramconfig - An async function that returns the Rspress configuration.@returnsThe same async function (enables type checking and IDE autocompletion).@example
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig(async () => {
      const remoteConfig = await fetchConfig();
      return {
        title: remoteConfig.title,
      };
    });
    defineConfig
    } from '@rspress/core';
    export default
    function defineConfig(config: UserConfig): UserConfig (+1 overload)

    Define a static Rspress configuration object.

    @paramconfig - The Rspress configuration object.@returnsThe same configuration object (enables type checking and IDE autocompletion).@example
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      title: 'My Site',
    });
    defineConfig
    ({
    UserConfig.siteOrigin?: string | undefined

    Origin of the site, such as https://example.com.

    siteOrigin
    : 'https://foo.github.io',
    UserConfig.base?: string | undefined

    Base path of the site.

    @default'/'
    base
    : '/bar/',
    });

    title

    • 类型: string
    • 默认值: "Rspress"

    站点标题。这个参数将被用作 HTML 页面的标题。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      title: '我的站点',
    });

    description

    • 类型: string
    • 默认值: ""

    站点描述。这将用作 HTML 页面的描述。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      description: '我的站点描述',
    });

    icon

    • 类型: string | URL
    • 默认值: ""

    站点图标。这个路径将用作 HTML 页面的图标路径。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      icon: '/favicon.ico',
    });

    对于普通路径,Rspress 会在 public 目录中找到你的图标,当然你也可以设置成一个 CDN 地址,或使用 file:// 协议或 URL 来使用本地文件绝对路径。

    lang

    • 类型: string
    • 默认值: "en"

    站点默认使用的语言。查看 国际化 了解更多。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      lang: 'en',
      locales: [
        {
          lang: 'en',
          // ...
        },
        {
          lang: 'zh',
          // ...
        },
      ],
    });

    locales

    • 类型: Locale[]
    • 默认值: undefined

    配置站点支持的语言,以及各语言的站点信息。

    export interface Locale {
      lang: string;
      label: string;
      title?: string;
      description?: string;
    }
    字段说明
    lang语言代码,需要与文档根目录下对应的语言目录名一致。
    label导航栏语言切换器中的显示文本。
    title当前语言的站点标题。
    description当前语言的站点描述。

    将顶层的 lang 设为其中一个语言代码,指定站点的默认语言。Rspress 会去掉默认语言路由中的语言前缀。

    例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      lang: 'en',
      locales: [
        {
          lang: 'en',
          label: 'English',
          title: 'My Site',
          description: 'My site description',
        },
        {
          lang: 'zh',
          label: '简体中文',
          title: '站点标题',
          description: '站点描述',
        },
      ],
    });

    完整配置流程请参考国际化。如需按语言配置 nav、sidebar 等主题选项,请参考 themeConfig.locales。

    i18nSourcePath

    • 类型: string
    • 默认值: path.join(cwd, 'i18n.json')

    指定国际化文案数据源文件的路径。默认情况下,Rspress 从当前工作目录下的 i18n.json 读取。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    import path from 'path';
    
    export default defineConfig({
      i18nSourcePath: path.join(__dirname, 'config/i18n.json'),
    });
    Tip

    效果与在项目根目录放置 i18n.json 文件一致。如果同时配置了 i18nSource,i18nSource 的数据将会合并并覆盖 i18nSourcePath 加载的数据。

    i18nSource

    • 类型: Record<string, Record<string, string>> | ((value: Record<string, Record<string, string>>) => Record<string, Record<string, string>> | Promise<Record<string, Record<string, string>>>)
    • 默认值: {}

    你可以通过这个配置项来修改 Rspress 内置的国际化文案或扩展自定义组件的文案。当扩展文案时,通常配合 useI18n 一起使用。

    Tip

    与 i18n.json 的实现和效果均一致,任选一个使用即可,i18nSource 比 i18n.json 的优先级高,并且支持函数。

    参数 i18nSource 是一个对象,其结构为:

    {
      [textKey: string]: {
        [locale: string]: string;
      }
    }

    其中第一层的 textKey 是文案的键名,第二层的 locale 是语言代码(如 zh、en),值是对应语言的翻译文本。

    下面是一个修改 Rspress 内置国际化文案的示例:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    export default defineConfig({
      i18nSource: {
        editLinkText: {
          en: '📝 Edit this page on Gitlab',
          zh: '📝 在 Gitlab 上编辑此页',
        },
      },
    });

    i18nSource 也可以是一个函数,例如:

    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      i18nSource: async source => {
        for (const key of Object.keys(source)) {
          source[key]['en_US'] = source[key]['en'];
        }
        return source;
      },
    });

    以下是 Rspress 内置的国际化文案:

    import type { I18nText } from '@rspress/core';
    
    // cspell:disable
    export const DEFAULT_I18N_TEXT = {
      languagesText: {
        zh: '语言',
        en: 'Languages',
        ja: '言語',
        ko: '언어',
        ru: 'Языки',
        ta: 'மொழிகள்',
        es: 'Idiomas',
        fr: 'Langues',
        de: 'Sprachen',
        pt: 'Idiomas',
        'pt-BR': 'Idiomas',
        'zh-Hant': '語言',
        'zh-TW': '語言',
        it: 'Lingue',
        pl: 'Języki',
        vi: 'Ngôn ngữ',
        tr: 'Diller',
        cs: 'Jazyky',
        nl: 'Talen',
      },
      themeText: {
        zh: '主题',
        en: 'Theme',
        ja: 'テーマ',
        ko: '테마',
        ru: 'Тема',
        ta: 'தோற்றம்',
        es: 'Tema',
        fr: 'Thème',
        de: 'Design',
        pt: 'Tema',
        'pt-BR': 'Tema',
        'zh-Hant': '主題',
        'zh-TW': '主題',
        it: 'Tema',
        pl: 'Motyw',
        vi: 'Giao diện',
        tr: 'Tema',
        cs: 'Motiv',
        nl: 'Thema',
      },
      versionsText: {
        zh: '版本',
        en: 'Versions',
        ja: 'バージョン',
        ko: '버전',
        ru: 'Версии',
        ta: 'பதிப்புகள்',
        es: 'Versiones',
        fr: 'Versions',
        de: 'Versionen',
        pt: 'Versões',
        'pt-BR': 'Versões',
        'zh-Hant': '版本',
        'zh-TW': '版本',
        it: 'Versioni',
        pl: 'Wersje',
        vi: 'Phiên bản',
        tr: 'Sürümler',
        cs: 'Verze',
        nl: 'Versies',
      },
      menuTitle: {
        zh: '菜单',
        en: 'Menu',
        ja: 'メニュー',
        ko: '사이드바 메뉴',
        ru: 'Меню',
        ta: 'பட்டி',
        es: 'Menú',
        fr: 'Menu',
        de: 'Menü',
        pt: 'Menu',
        'pt-BR': 'Menu',
        'zh-Hant': '選單',
        'zh-TW': '選單',
        it: 'Menu',
        pl: 'Menu',
        vi: 'Trình đơn',
        tr: 'Menü',
        cs: 'Nabídka',
        nl: 'Menu',
      },
      outlineTitle: {
        zh: '目录',
        en: 'ON THIS PAGE',
        ja: '目次',
        ko: '이 페이지 목차',
        ru: 'ОГЛАВЛЕНИЕ',
        ta: 'இந்தப் பக்கத்தில்',
        es: 'EN ESTA PÁGINA',
        fr: 'SUR CETTE PAGE',
        de: 'AUF DIESER SEITE',
        pt: 'NESTA PÁGINA',
        'pt-BR': 'NESTA PÁGINA',
        'zh-Hant': '本頁目錄',
        'zh-TW': '本頁目錄',
        it: 'IN QUESTA PAGINA',
        pl: 'NA TEJ STRONIE',
        vi: 'TRÊN TRANG NÀY',
        tr: 'BU SAYFADA',
        cs: 'NA TÉTO STRÁNCE',
        nl: 'OP DEZE PAGINA',
      },
      scrollToTopText: {
        en: 'Back to top',
        zh: '回到顶部',
        ja: 'トップに戻る',
        ko: '맨 위로',
        ru: 'Наверх',
        ta: 'பக்கத்தின் மேலே செல்லவும்',
        es: 'Volver arriba',
        fr: 'Retour en haut',
        de: 'Nach oben',
        pt: 'Voltar ao topo',
        'pt-BR': 'Voltar ao topo',
        'zh-Hant': '回到頂端',
        'zh-TW': '回到頂端',
        it: 'Torna in alto',
        pl: 'Wróć na górę',
        vi: 'Về đầu trang',
        tr: 'Başa dön',
        cs: 'Zpět nahoru',
        nl: 'Terug naar boven',
      },
      lastUpdatedText: {
        en: 'Last Updated',
        zh: '最后更新于',
        ja: '最終更新',
        ko: '업데이트 날짜',
        ru: 'Последнее обновление',
        ta: 'கடைசியாகப் புதுப்பிக்கப்பட்டது',
        es: 'Última actualización',
        fr: 'Dernière mise à jour',
        de: 'Zuletzt aktualisiert',
        pt: 'Última atualização',
        'pt-BR': 'Última atualização',
        'zh-Hant': '最後更新於',
        'zh-TW': '最後更新於',
        it: 'Ultimo aggiornamento',
        pl: 'Ostatnia aktualizacja',
        vi: 'Cập nhật lần cuối',
        tr: 'Son güncelleme',
        cs: 'Naposledy aktualizováno',
        nl: 'Laatst bijgewerkt',
      },
      lastUpdatedAuthorText: {
        en: 'by',
        zh: '作者',
        ja: '更新者',
        ko: '작성자',
        ru: 'автор',
        ta: 'புதுப்பித்தவர்',
        es: 'por',
        fr: 'par',
        de: 'von',
        pt: 'por',
        'pt-BR': 'por',
        'zh-Hant': '作者',
        'zh-TW': '作者',
        it: 'di',
        pl: 'przez',
        vi: 'bởi',
        tr: 'Güncelleyen',
        cs: 'Autor aktualizace',
        nl: 'door',
      },
      prevPageText: {
        en: 'Previous page',
        zh: '上一页',
        ja: '前のページ',
        ko: '이전 페이지',
        ru: 'Предыдущая страница',
        ta: 'முந்தைய பக்கம்',
        es: 'Página anterior',
        fr: 'Page précédente',
        de: 'Vorherige Seite',
        pt: 'Página anterior',
        'pt-BR': 'Página anterior',
        'zh-Hant': '上一頁',
        'zh-TW': '上一頁',
        it: 'Pagina precedente',
        pl: 'Poprzednia strona',
        vi: 'Trang trước',
        tr: 'Önceki sayfa',
        cs: 'Předchozí stránka',
        nl: 'Vorige pagina',
      },
      nextPageText: {
        en: 'Next page',
        zh: '下一页',
        ja: '次のページ',
        ko: '다음 페이지',
        ru: 'Следующая страница',
        ta: 'அடுத்த பக்கம்',
        es: 'Página siguiente',
        fr: 'Page suivante',
        de: 'Nächste Seite',
        pt: 'Página seguinte',
        'pt-BR': 'Próxima página',
        'zh-Hant': '下一頁',
        'zh-TW': '下一頁',
        it: 'Pagina successiva',
        pl: 'Następna strona',
        vi: 'Trang sau',
        tr: 'Sonraki sayfa',
        cs: 'Další stránka',
        nl: 'Volgende pagina',
      },
      sourceCodeText: {
        en: 'Source Code',
        zh: '源码',
        ja: 'ソースコード',
        ko: '소스 코드',
        ru: 'Исходный код',
        ta: 'மூலக் குறியீடு',
        es: 'Código fuente',
        fr: 'Code source',
        de: 'Quellcode',
        pt: 'Código-fonte',
        'pt-BR': 'Código-fonte',
        'zh-Hant': '原始碼',
        'zh-TW': '原始碼',
        it: 'Codice sorgente',
        pl: 'Kod źródłowy',
        vi: 'Mã nguồn',
        tr: 'Kaynak kodu',
        cs: 'Zdrojový kód',
        nl: 'Broncode',
      },
      searchPlaceholderText: {
        en: 'Search',
        zh: '搜索',
        ja: '検索',
        ko: '검색',
        ru: 'Поиск',
        ta: 'தேடுக',
        es: 'Buscar',
        fr: 'Rechercher',
        de: 'Suchen',
        pt: 'Pesquisar',
        'pt-BR': 'Buscar',
        'zh-Hant': '搜尋',
        'zh-TW': '搜尋',
        it: 'Cerca',
        pl: 'Szukaj',
        vi: 'Tìm kiếm',
        tr: 'Ara',
        cs: 'Hledat',
        nl: 'Zoeken',
      },
      searchPanelCancelText: {
        en: 'Cancel',
        zh: '取消',
        ja: 'キャンセル',
        ko: '취소',
        ru: 'Отмена',
        ta: 'ரத்து செய்',
        es: 'Cancelar',
        fr: 'Annuler',
        de: 'Abbrechen',
        pt: 'Cancelar',
        'pt-BR': 'Cancelar',
        'zh-Hant': '取消',
        'zh-TW': '取消',
        it: 'Annulla',
        pl: 'Anuluj',
        vi: 'Hủy',
        tr: 'İptal',
        cs: 'Zrušit',
        nl: 'Annuleren',
      },
      searchNoResultsText: {
        en: 'No matching results',
        zh: '未找到与之匹配的结果',
        ja: '一致する結果が見つかりません',
        ko: '일치하는 결과가 없습니다',
        ru: 'Нет результатов, соответствующих запросу',
        ta: 'பொருந்தும் முடிவுகள் இல்லை',
        es: 'No se encontraron resultados',
        fr: 'Aucun résultat correspondant',
        de: 'Keine passenden Ergebnisse',
        pt: 'Nenhum resultado correspondente',
        'pt-BR': 'Nenhum resultado encontrado',
        'zh-Hant': '找不到符合的結果',
        'zh-TW': '找不到符合的結果',
        it: 'Nessun risultato corrispondente',
        pl: 'Brak pasujących wyników',
        vi: 'Không tìm thấy kết quả phù hợp',
        tr: 'Eşleşen sonuç bulunamadı',
        cs: 'Nebyly nalezeny žádné odpovídající výsledky',
        nl: 'Geen overeenkomende resultaten',
      },
      searchSuggestedQueryText: {
        en: 'Try searching for different keywords',
        zh: '试试搜索不同关键词',
        ja: '別のキーワードで検索してみてください',
        ko: '다른 키워드로 검색해 보세요',
        ru: 'Попробуйте поискать по другим ключевым словам',
        ta: 'வேறு தேடல் சொற்களை முயற்சிக்கவும்',
        es: 'Prueba con otras palabras clave',
        fr: 'Essayez d’autres mots-clés',
        de: 'Versuche es mit anderen Suchbegriffen',
        pt: 'Experimente pesquisar com outras palavras-chave',
        'pt-BR': 'Tente buscar com outras palavras-chave',
        'zh-Hant': '試著搜尋其他關鍵字',
        'zh-TW': '試著搜尋其他關鍵字',
        it: 'Prova a cercare con altre parole chiave',
        pl: 'Spróbuj wyszukać inne słowa kluczowe',
        vi: 'Thử tìm kiếm bằng từ khóa khác',
        tr: 'Farklı anahtar kelimelerle aramayı dene',
        cs: 'Zkuste vyhledat jiná klíčová slova',
        nl: 'Probeer andere zoektermen',
      },
      'overview.filterNameText': {
        en: 'Filter',
        zh: '筛选',
        ja: 'フィルター',
        ko: '필터',
        ru: 'Фильтр',
        ta: 'வடிகட்டு',
        es: 'Filtrar',
        fr: 'Filtrer',
        de: 'Filtern',
        pt: 'Filtrar',
        'pt-BR': 'Filtrar',
        'zh-Hant': '篩選',
        'zh-TW': '篩選',
        it: 'Filtra',
        pl: 'Filtruj',
        vi: 'Lọc',
        tr: 'Filtrele',
        cs: 'Filtrovat',
        nl: 'Filteren',
      },
      'overview.filterPlaceholderText': {
        en: 'Search API',
        zh: '搜索 API',
        ja: 'API を検索',
        ko: 'API 검색',
        ru: 'API поиска',
        ta: 'API-ஐத் தேடுக',
        es: 'Buscar en la API',
        fr: 'Rechercher une API',
        de: 'API suchen',
        pt: 'Pesquisar API',
        'pt-BR': 'Buscar API',
        'zh-Hant': '搜尋 API',
        'zh-TW': '搜尋 API',
        it: 'Cerca API',
        pl: 'Szukaj API',
        vi: 'Tìm API',
        tr: 'API ara',
        cs: 'Hledat API',
        nl: 'API zoeken',
      },
      'overview.filterNoResultText': {
        en: 'No matching API found',
        zh: '未找到匹配的 API',
        ja: '一致する API が見つかりません',
        ko: '일치하는 API가 없습니다',
        ru: 'Не найден подходящий API',
        ta: 'பொருந்தும் API எதுவும் கிடைக்கவில்லை',
        es: 'No se encontró ninguna API',
        fr: 'Aucune API correspondante',
        de: 'Keine passende API gefunden',
        pt: 'Não foi encontrada nenhuma API correspondente',
        'pt-BR': 'Nenhuma API correspondente encontrada',
        'zh-Hant': '找不到符合的 API',
        'zh-TW': '找不到符合的 API',
        it: 'Nessuna API corrispondente',
        pl: 'Nie znaleziono pasującego API',
        vi: 'Không tìm thấy API phù hợp',
        tr: 'Eşleşen API bulunamadı',
        cs: 'Nebylo nalezeno odpovídající API',
        nl: 'Geen overeenkomende API gevonden',
      },
      openInText: {
        en: 'Open in {{name}}',
        zh: '在 {{name}} 中打开',
        ja: '{{name}} で開く',
        ko: '{{name}}에서 열기',
        ru: 'Открыть в {{name}}',
        ta: '{{name}}-இல் திறக்கவும்',
        es: 'Abrir en {{name}}',
        fr: 'Ouvrir dans {{name}}',
        de: 'In {{name}} öffnen',
        pt: 'Abrir em {{name}}',
        'pt-BR': 'Abrir em {{name}}',
        'zh-Hant': '在 {{name}} 中開啟',
        'zh-TW': '在 {{name}} 中開啟',
        it: 'Apri in {{name}}',
        pl: 'Otwórz w {{name}}',
        vi: 'Mở trong {{name}}',
        tr: '{{name}} ile aç',
        cs: 'Otevřít v aplikaci {{name}}',
        nl: 'Openen in {{name}}',
      },
      copyMarkdownText: {
        en: 'Copy Markdown',
        zh: '复制 Markdown',
        ja: 'Markdown をコピー',
        ko: '마크다운 복사',
        ru: 'Скопировать Markdown',
        ta: 'Markdown-ஐ நகலெடு',
        es: 'Copiar Markdown',
        fr: 'Copier le Markdown',
        de: 'Markdown kopieren',
        pt: 'Copiar Markdown',
        'pt-BR': 'Copiar Markdown',
        'zh-Hant': '複製 Markdown',
        'zh-TW': '複製 Markdown',
        it: 'Copia Markdown',
        pl: 'Skopiuj Markdown',
        vi: 'Sao chép Markdown',
        tr: 'Markdown’u kopyala',
        cs: 'Zkopírovat Markdown',
        nl: 'Markdown kopiëren',
      },
      copyMarkdownLinkText: {
        en: 'Copy Markdown link',
        zh: '复制 Markdown 链接',
        ja: 'Markdown リンクをコピー',
        ko: '마크다운 링크 복사',
        ru: 'Скопировать ссылку в формате Markdown',
        ta: 'Markdown இணைப்பை நகலெடு',
        es: 'Copiar enlace de Markdown',
        fr: 'Copier le lien Markdown',
        de: 'Markdown-Link kopieren',
        pt: 'Copiar ligação Markdown',
        'pt-BR': 'Copiar link do Markdown',
        'zh-Hant': '複製 Markdown 連結',
        'zh-TW': '複製 Markdown 連結',
        it: 'Copia il link Markdown',
        pl: 'Skopiuj link do pliku Markdown',
        vi: 'Sao chép liên kết Markdown',
        tr: 'Markdown bağlantısını kopyala',
        cs: 'Zkopírovat odkaz na Markdown',
        nl: 'Markdown-link kopiëren',
      },
      viewMarkdownText: {
        en: 'View as Markdown',
        zh: '以 Markdown 查看',
        ja: 'Markdown として表示',
        ko: '마크다운으로 보기',
        ru: 'Просмотреть в формате Markdown',
        ta: 'Markdown ஆகப் பார்க்கவும்',
        es: 'Ver como Markdown',
        fr: 'Afficher en Markdown',
        de: 'Als Markdown anzeigen',
        pt: 'Ver como Markdown',
        'pt-BR': 'Ver como Markdown',
        'zh-Hant': '以 Markdown 檢視',
        'zh-TW': '以 Markdown 檢視',
        it: 'Visualizza come Markdown',
        pl: 'Wyświetl jako Markdown',
        vi: 'Xem dưới dạng Markdown',
        tr: 'Markdown olarak görüntüle',
        cs: 'Zobrazit jako Markdown',
        nl: 'Weergeven als Markdown',
      },
      editLinkText: {
        en: 'Edit this page',
        zh: '编辑此页面',
        ja: 'このページを編集',
        ko: '이 페이지 편집',
        ru: 'Отредактировать страницу',
        ta: 'இந்தப் பக்கத்தைத் திருத்தவும்',
        es: 'Editar esta página',
        fr: 'Modifier cette page',
        de: 'Diese Seite bearbeiten',
        pt: 'Editar esta página',
        'pt-BR': 'Editar esta página',
        'zh-Hant': '編輯此頁面',
        'zh-TW': '編輯此頁面',
        it: 'Modifica questa pagina',
        pl: 'Edytuj tę stronę',
        vi: 'Chỉnh sửa trang này',
        tr: 'Bu sayfayı düzenle',
        cs: 'Upravit tuto stránku',
        nl: 'Deze pagina bewerken',
      },
      codeButtonGroupCopyButtonText: {
        en: 'Copy code',
        zh: '复制代码',
        ja: 'コードをコピー',
        ko: '코드 복사',
        ru: 'Скопировать код',
        ta: 'குறியீட்டை நகலெடு',
        es: 'Copiar código',
        fr: 'Copier le code',
        de: 'Code kopieren',
        pt: 'Copiar código',
        'pt-BR': 'Copiar código',
        'zh-Hant': '複製程式碼',
        'zh-TW': '複製程式碼',
        it: 'Copia il codice',
        pl: 'Skopiuj kod',
        vi: 'Sao chép mã',
        tr: 'Kodu kopyala',
        cs: 'Zkopírovat kód',
        nl: 'Code kopiëren',
      },
      codeButtonGroupWrapButtonText: {
        en: 'Toggle code wrap',
        zh: '切换代码换行',
        ja: 'コードの折り返しを切り替え',
        ko: '코드 줄바꿈 전환',
        ru: 'Переключить перенос кода',
        ta: 'குறியீட்டு வரி மடக்கத்தை மாற்று',
        es: 'Activar o desactivar el ajuste de línea',
        fr: 'Activer ou désactiver le retour à la ligne',
        de: 'Zeilenumbruch umschalten',
        pt: 'Alternar a quebra de linha',
        'pt-BR': 'Alternar quebra de linha',
        'zh-Hant': '切換程式碼自動換行',
        'zh-TW': '切換程式碼自動換行',
        it: 'Attiva o disattiva il ritorno a capo',
        pl: 'Przełącz zawijanie wierszy kodu',
        vi: 'Bật hoặc tắt ngắt dòng mã',
        tr: 'Kod satırı kaydırmayı aç veya kapat',
        cs: 'Přepnout zalamování řádků',
        nl: 'Regelterugloop aan- of uitzetten',
      },
      notFoundText: {
        en: 'PAGE NOT FOUND',
        zh: '页面未找到',
        ja: 'ページが見つかりません',
        ko: '페이지를 찾을 수 없음',
        ru: 'СТРАНИЦА НЕ НАЙДЕНА',
        ta: 'பக்கம் கிடைக்கவில்லை',
        es: 'PÁGINA NO ENCONTRADA',
        fr: 'PAGE INTROUVABLE',
        de: 'SEITE NICHT GEFUNDEN',
        pt: 'PÁGINA NÃO ENCONTRADA',
        'pt-BR': 'PÁGINA NÃO ENCONTRADA',
        'zh-Hant': '找不到頁面',
        'zh-TW': '找不到頁面',
        it: 'PAGINA NON TROVATA',
        pl: 'NIE ZNALEZIONO STRONY',
        vi: 'KHÔNG TÌM THẤY TRANG',
        tr: 'SAYFA BULUNAMADI',
        cs: 'STRÁNKA NENALEZENA',
        nl: 'PAGINA NIET GEVONDEN',
      },
      takeMeHomeText: {
        en: 'Take me home',
        zh: '返回首页',
        ja: 'ホームに連れてって',
        ko: '홈으로 이동',
        ru: 'Вернуться на главную',
        ta: 'முகப்புக்குச் செல்லவும்',
        es: 'Volver al inicio',
        fr: 'Retour à l’accueil',
        de: 'Zur Startseite',
        pt: 'Voltar à página inicial',
        'pt-BR': 'Voltar para o início',
        'zh-Hant': '返回首頁',
        'zh-TW': '返回首頁',
        it: 'Torna alla pagina iniziale',
        pl: 'Wróć na stronę główną',
        vi: 'Về trang chủ',
        tr: 'Ana sayfaya dön',
        cs: 'Zpět na úvodní stránku',
        nl: 'Terug naar de startpagina',
      },
    
      errorTitleText: {
        en: 'Something went wrong',
        zh: '页面出了点问题',
        ja: 'エラーが発生しました',
        ko: '문제가 발생했습니다',
        ru: 'Что-то пошло не так',
        ta: 'பிழை ஏற்பட்டது',
        es: 'Algo salió mal',
        fr: 'Une erreur est survenue',
        de: 'Ein Fehler ist aufgetreten',
        pt: 'Ocorreu um erro',
        'pt-BR': 'Algo deu errado',
        'zh-Hant': '發生錯誤',
        'zh-TW': '發生錯誤',
        it: 'Qualcosa è andato storto',
        pl: 'Coś poszło nie tak',
        vi: 'Đã xảy ra lỗi',
        tr: 'Bir sorun oluştu',
        cs: 'Něco se pokazilo',
        nl: 'Er is iets misgegaan',
      },
      errorDescriptionText: {
        en: 'This page could not be loaded. Try reloading it or return to the home page.',
        zh: '页面未能正常加载,请尝试重新加载,或返回首页。',
        ja: 'ページを読み込めませんでした。再読み込みするか、ホームに戻ってください。',
        ko: '페이지를 불러올 수 없습니다. 새로고침하거나 홈으로 돌아가세요.',
        ru: 'Не удалось загрузить страницу. Попробуйте обновить её или вернуться на главную.',
        ta: 'இந்தப் பக்கத்தை ஏற்ற முடியவில்லை. மீண்டும் ஏற்றவும் அல்லது முகப்புப் பக்கத்திற்குத் திரும்பவும்.',
        es: 'No se pudo cargar esta página. Intenta recargarla o vuelve al inicio.',
        fr: 'Impossible de charger cette page. Essayez de la recharger ou retournez à l’accueil.',
        de: 'Diese Seite konnte nicht geladen werden. Lade sie erneut oder kehre zur Startseite zurück.',
        pt: 'Não foi possível carregar esta página. Experimente recarregá-la ou volte à página inicial.',
        'pt-BR':
          'Não foi possível carregar esta página. Tente recarregá-la ou volte para o início.',
        'zh-Hant': '無法載入此頁面。請重新載入或返回首頁。',
        'zh-TW': '無法載入此頁面。請重新載入或返回首頁。',
        it: 'Impossibile caricare questa pagina. Prova a ricaricarla o torna alla pagina iniziale.',
        pl: 'Nie udało się wczytać tej strony. Spróbuj ją odświeżyć lub wróć na stronę główną.',
        vi: 'Không thể tải trang này. Hãy thử tải lại hoặc về trang chủ.',
        tr: 'Bu sayfa yüklenemedi. Sayfayı yeniden yüklemeyi dene veya ana sayfaya dön.',
        cs: 'Tuto stránku se nepodařilo načíst. Zkuste ji načíst znovu nebo se vraťte na úvodní stránku.',
        nl: 'Deze pagina kon niet worden geladen. Probeer de pagina opnieuw te laden of ga terug naar de startpagina.',
      },
      reloadPageText: {
        en: 'Reload page',
        zh: '重新加载',
        ja: '再読み込み',
        ko: '새로고침',
        ru: 'Обновить страницу',
        ta: 'பக்கத்தை மீண்டும் ஏற்றவும்',
        es: 'Recargar página',
        fr: 'Recharger la page',
        de: 'Seite neu laden',
        pt: 'Recarregar a página',
        'pt-BR': 'Recarregar página',
        'zh-Hant': '重新載入頁面',
        'zh-TW': '重新載入頁面',
        it: 'Ricarica la pagina',
        pl: 'Odśwież stronę',
        vi: 'Tải lại trang',
        tr: 'Sayfayı yeniden yükle',
        cs: 'Načíst stránku znovu',
        nl: 'Pagina opnieuw laden',
      },
      errorDetailsText: {
        en: 'Error details',
        zh: '错误详情',
        ja: 'エラーの詳細',
        ko: '오류 세부 정보',
        ru: 'Подробности ошибки',
        ta: 'பிழை விவரங்கள்',
        es: 'Detalles del error',
        fr: 'Détails de l’erreur',
        de: 'Fehlerdetails',
        pt: 'Detalhes do erro',
        'pt-BR': 'Detalhes do erro',
        'zh-Hant': '錯誤詳細資訊',
        'zh-TW': '錯誤詳細資訊',
        it: 'Dettagli dell’errore',
        pl: 'Szczegóły błędu',
        vi: 'Chi tiết lỗi',
        tr: 'Hata ayrıntıları',
        cs: 'Podrobnosti o chybě',
        nl: 'Foutdetails',
      },
    
      promptCopyText: {
        en: 'Copy Prompt',
        zh: '复制 Prompt',
        ja: 'Prompt をコピー',
        ko: '프롬프트 복사',
        ru: 'Скопировать Prompt',
        ta: 'Prompt-ஐ நகலெடு',
        es: 'Copiar prompt',
        fr: 'Copier le prompt',
        de: 'Prompt kopieren',
        pt: 'Copiar prompt',
        'pt-BR': 'Copiar prompt',
        'zh-Hant': '複製提示詞',
        'zh-TW': '複製提示詞',
        it: 'Copia il prompt',
        pl: 'Skopiuj prompt',
        vi: 'Sao chép lời nhắc',
        tr: 'İstemi kopyala',
        cs: 'Zkopírovat prompt',
        nl: 'Prompt kopiëren',
      },
      promptCopiedText: {
        en: 'Copied',
        zh: '已复制',
        ja: 'コピーしました',
        ko: '복사됨',
        ru: 'Скопировано',
        ta: 'நகலெடுக்கப்பட்டது',
        es: 'Copiado',
        fr: 'Copié',
        de: 'Kopiert',
        pt: 'Copiado',
        'pt-BR': 'Copiado',
        'zh-Hant': '已複製',
        'zh-TW': '已複製',
        it: 'Copiato',
        pl: 'Skopiowano',
        vi: 'Đã sao chép',
        tr: 'Kopyalandı',
        cs: 'Zkopírováno',
        nl: 'Gekopieerd',
      },
      promptExpandText: {
        en: 'Expand',
        zh: '展开',
        ja: '展開',
        ko: '펼치기',
        ru: 'Развернуть',
        ta: 'விரிவாக்கு',
        es: 'Expandir',
        fr: 'Développer',
        de: 'Ausklappen',
        pt: 'Expandir',
        'pt-BR': 'Expandir',
        'zh-Hant': '展開',
        'zh-TW': '展開',
        it: 'Espandi',
        pl: 'Rozwiń',
        vi: 'Mở rộng',
        tr: 'Genişlet',
        cs: 'Rozbalit',
        nl: 'Uitklappen',
      },
      promptCollapseText: {
        en: 'Collapse',
        zh: '折叠',
        ja: '折りたたむ',
        ko: '접기',
        ru: 'Свернуть',
        ta: 'சுருக்கு',
        es: 'Contraer',
        fr: 'Réduire',
        de: 'Einklappen',
        pt: 'Recolher',
        'pt-BR': 'Recolher',
        'zh-Hant': '收合',
        'zh-TW': '收合',
        it: 'Comprimi',
        pl: 'Zwiń',
        vi: 'Thu gọn',
        tr: 'Daralt',
        cs: 'Sbalit',
        nl: 'Inklappen',
      },
    } as const satisfies Required<I18nText>;
    
    // cspell:enable
    

    logo

    • 类型: string | { dark: string; light: string; width?: number; height?: number }
    • 默认值: ""

    站点 logo。这个路径将用作导航栏左上角的 logo。对象形式可选提供 width 和 height(单位为像素)作为两张图片的固有尺寸;请填写源图片的实际尺寸,以预留宽高比并减少布局偏移。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      logo: '/logo.png',
    });

    Rspress 会在 public 目录中找到你的图标,当然你也可以设置成一个 CDN 地址。

    当然你可以针对浅色/暗黑模式设置不同的 logo:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      logo: {
        dark: '/logo-dark.png',
        light: '/logo-light.png',
        width: 120,
        height: 32,
      },
    });

    logoHref

    • 类型: string
    • 默认值: /${lang}/

    自定义 logo 的链接。默认情况下点击 logo 会跳转到当前语言的首页。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      logo: '/logo.png',
      logoHref: 'https://example.com',
    });

    logoText

    • 类型: string
    • 默认值: ""

    站点 logo 文字。这个文字将用作导航栏左上角的 logo 文字。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      logoText: 'rspress',
    });

    outDir

    • 类型: string
    • 默认值: doc_build

    自定义构建站点的输出目录。比如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      outDir: 'doc_build',
    });

    themeDir

    • 类型: string
    • 默认值: theme

    指定自定义主题目录。默认情况下,Rspress 使用当前工作目录下的 theme 目录作为自定义主题目录。你可以通过 themeDir 来自定义它。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    import path from 'path';
    
    export default defineConfig({
      themeDir: path.join(__dirname, 'my-theme'),
    });

    该配置同时支持相对路径和绝对路径,相对路径相对于当前工作目录。

    更多关于自定义主题的内容,请参阅 自定义主题。

    • 类型: string | [string, Record<string, string>] | (route) => string | [string, Record<string, string>] | undefined
    • 也可以通过 frontmatter 针对每个页面设置

    用于设置生产模式下页面 HTML 的 <head> 标签中呈现的附加元素。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      // ... 其他用户配置
      head: [
        '<meta name="author" content="John Doe">',
        // 或者
        ['meta', { name: 'author', content: 'John Doe' }],
        // [htmlTag, { attrName: attrValue, attrName2: attrValue2 }]
        // 或者
        route => {
          if (route.routePath.startsWith('/jane/'))
            return "<meta name='author' content='Jane Doe'>";
          if (route.routePath.startsWith('/john/'))
            return ['meta', { name: 'author', content: 'John Doe' }];
          // 也可以不返回任何内容
          return undefined;
        },
      ],
    });

    globalStyles

    • 类型: string
    • 默认值: undefined

    用于添加全局样式,配置为样式文件的路径。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    import path from 'path';
    
    export default defineConfig({
      globalStyles: path.join(__dirname, 'styles/global.css'),
    });
    styles/global.css
    :root {
      --rp-c-brand: #f00;
    }

    sitemap

    • 类型:boolean | SitemapOptions
    • 默认值:true

    在生产构建时向输出目录生成 sitemap.xml。此功能已内置于 Rspress,无需安装插件,在 ssg: false 时也可使用。从 public 目录复制的已有 sitemap 文件会保留。生成的 URL 遵循 route.cleanUrls。

    配置 siteOrigin 可让 sitemap 包含绝对 URL。Rspress 会将 siteOrigin、base 和每个页面的路由路径拼接起来:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      siteOrigin: 'https://example.com',
      base: '/docs/',
      // sitemap 默认开启。
    });

    设置 sitemap: false 可关闭生成,也可以传入选项对象进行自定义:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      siteOrigin: 'https://example.com',
      sitemap: {
        defaultChangeFreq: 'weekly',
        defaultPriority: '0.7',
      },
    });

    选项类型如下,可从 @rspress/core 导入 SitemapOptions:

    type ChangeFreq =
      'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';
    
    type Priority =
      | '0.0'
      | '0.1'
      | '0.2'
      | '0.3'
      | '0.4'
      | '0.5'
      | '0.6'
      | '0.7'
      | '0.8'
      | '0.9'
      | '1.0';
    
    // https://www.sitemaps.org/protocol.html
    interface Sitemap {
      loc: string;
      lastmod?: string;
      changefreq?: ChangeFreq;
      priority?: Priority;
    }
    
    interface CustomMaps {
      [routePath: string]: Sitemap;
    }
    
    export interface SitemapOptions {
      siteUrl?: string;
      customMaps?: CustomMaps;
      defaultPriority?: Priority;
      defaultChangeFreq?: ChangeFreq;
    }

    sitemap.siteUrl

    • 类型:string
    • 默认值:siteOrigin + base,未配置 siteOrigin 时使用 base

    覆盖 sitemap 条目使用的部署 URL。请使用包含基础路径的绝对 URL,例如 https://example.com/docs/。此值优先于 siteOrigin 和 base。仅支持不含查询参数和片段的 HTTP(S) URL。

    如果既没有配置 sitemap.siteUrl,也没有配置 siteOrigin,条目会使用 base + routePath,保留为相对路径。配置其中任意一项即可生成绝对 sitemap URL。

    sitemap.customMaps

    • 类型:Record<string, Sitemap>
    • 默认值:{}

    覆盖指定页面的 sitemap 值。键为不含 base 的路由路径,值会覆盖生成的 loc、lastmod、changefreq 和 priority。lastmod 默认使用源文件的修改时间。此选项用于自定义已有页面,不会添加路由。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      siteOrigin: 'https://example.com',
      base: '/docs/',
      sitemap: {
        customMaps: {
          '/guide': {
            loc: 'https://example.com/docs/guide',
            lastmod: '2026-01-01',
            changefreq: 'weekly',
            priority: '0.8',
          },
        },
      },
    });

    sitemap.defaultChangeFreq

    • 类型:ChangeFreq
    • 默认值:'monthly'

    每个页面默认的 changefreq 值。可选值为 'always'、'hourly'、'daily'、'weekly'、'monthly'、'yearly' 和 'never'。可通过 customMaps 为指定页面覆盖此值。

    sitemap.defaultPriority

    • 类型:Priority
    • 默认值:'0.5'

    每个页面默认的 priority 值,可选值从 '0.0' 到 '1.0',间隔为 0.1。根路由 / 使用 '1.0'。可通过 customMaps 为指定页面覆盖此值。

    mediumZoom

    • 类型: boolean | { selector?: string }
    • 默认值: true

    是否开启图片放大功能。默认开启,你可以通过设置 mediumZoom 为 false 来关闭。

    底层使用的是 medium-zoom 库来实现的。

    使用示例:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      // 关闭图片放大功能
      mediumZoom: false,
      // 配置 CSS 选择器,自定义要放大的图片,默认为 '.rspress-doc img'
      mediumZoom: {
        selector: '.rspress-doc img',
      },
    });
    • 类型:
    type SearchOptions = {
      searchHooks?: string;
      versioned?: boolean;
      codeBlocks?: boolean;
    };
    Tip

    如果需要从搜索索引中排除某个页面,可以在该页面的 front matter 中设置 search: false。

    searchHooks

    • 类型: string
    • 默认值: undefined

    你可以通过 searchHooks 参数来增加搜索运行时钩子逻辑,比如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    import path from 'path';
    
    export default defineConfig({
      search: {
        searchHooks: path.join(__dirname, 'searchHooks.ts'),
      },
    });

    关于具体的钩子逻辑,你可以阅读 自定义搜索功能。

    versioned

    • 类型: boolean
    • 默认值: true

    配置 multiVersion 后,默认会为每个版本创建独立的搜索索引,使搜索结果仅包含用户当前所选版本的页面。将 versioned 设为 false 可以关闭该行为,搜索结果将包含所有版本的文档。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      search: {
        versioned: false,
      },
    });

    codeBlocks

    • 类型: boolean
    • 默认值: true

    是否在搜索的索引中包含代码块的内容,这可以让用户搜索代码块。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      search: {
        codeBlocks: false,
      },
    });

    globalUIComponents

    • 类型: (string | object)[]
    • 默认值: []

    你可以通过 globalUIComponents 参数来增加全局 UI 组件,比如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    import path from 'path';
    
    export default defineConfig({
      globalUIComponents: [path.join(__dirname, 'components', 'MyComponent.tsx')],
    });

    globalUIComponents 的每一项可以是一个字符串,代表组件的文件路径;也可以是一个数组,第一项为组件的文件路径,第二项为组件的 props 对象,比如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      globalUIComponents: [
        [
          path.join(__dirname, 'components', 'MyComponent.tsx'),
          {
            foo: 'bar',
          },
        ],
      ],
    });

    当你注册了全局组件之后,Rspress 会自动将这些 React 组件在主题中进行渲染,而不用你手动引入。

    通过全局组件,你可以完成诸多自定义的功能,比如:

    compUi.tsx
    import React from 'react';
    
    // 需要默认导出一个组件
    // 通过 props 来拿到配置中传入的 props 数据
    export default function PluginUI(props?: { foo: string }) {
      return <div>This is a global layout component</div>;
    }

    这样,在主题页面中会渲染组件的内容,比如添加回到顶部按钮。

    同时,你也可以通过全局组件来注册全局副作用。比如:

    compSideEffect.tsx
    import { useEffect } from 'react';
    import { useLocation } from '@rspress/core/runtime';
    
    // 需要默认导出一个组件
    export default function PluginSideEffect() {
      const { pathname } = useLocation();
      useEffect(() => {
        // 组件初次渲染时执行
      }, []);
    
      useEffect(() => {
        // 路由变化时执行
      }, [pathname]);
      return null;
    }

    这样,在主题页面中会执行组件的副作用。比如以下的一些需要副作用的场景:

    • 针对某些页面路由进行重定向操作。
    • 对页面的 img 标签进行事件监听,实现图片放大功能。
    • 路由变化时,上报不同页面的 PV 数据。
    • ......

    multiVersion

    • 类型: { default: string; versions: string[] }

    你可以通过 multiVersion 参数来增加多版本文档支持,比如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      multiVersion: {
        default: 'v1',
        versions: ['v1', 'v2'],
      },
    });

    其中,default 为默认版本,versions 为所有版本列表。

    route

    • 类型: Object

    自定义路由配置。

    route.include

    • 类型: string[]
    • 默认值: []

    在路由中添加一些额外的文件。默认情况下,只有文档根目录中的文件才会包含在路由中。如果你想在路由中添加一些额外的文件,你可以使用这个选项。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        include: ['other-dir/**/*.{md,mdx}'],
      },
    });

    注意:数组中的字符串支持 glob 模式,填写的 glob 表达式应基于文档的 root 目录,并带上对应的 extensions 后缀。

    Note

    我们更加推荐在自定义 Rspress 插件中使用 addPages hook 来在路由中添加一些额外的文件,这样可以更灵活且更合理地指定页面路由和文件路径/内容。

    route.exclude

    • 类型: string[]
    • 默认值: []

    从路由中排除一些文件。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        exclude: ['custom.tsx', 'component/**/*'],
      },
    });

    注意:数组中的字符串支持 glob 模式,填写的 glob 表达式应基于文档的 root 目录。

    route.excludeConvention

    • 类型: string[]
    • 默认值: ['**/_[^_]*']

    为方便用户在 docs 目录 中使用组件,而设置的 路由约定,默认排除以 _ 开头的文件。

    如果你确实需要一些 _ 开头的路由时,你可以调整这个规则,例如设置为以 _fragment- 开头才会被排除:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        excludeConvention: ['**/_fragment-*'],
      },
    });

    route.extensions

    • 类型: string[]
    • 默认值: ['.js', '.jsx', '.ts', '.tsx', '.md', '.mdx']

    将包含在路由中的文件的扩展名。默认情况下,Rspress 会在路由中包含所有 `'js'、'jsx'、'ts'、'tsx'、'md'、'mdx' 文件。如果你想自定义扩展名,你可以使用这个选项。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        extensions: ['.md', '.mdx'],
      },
    });

    route.cleanUrls

    • 类型: boolean
    • 默认值: true(在 v2.1.0 之前是 false)

    开启后可以生成无 .html 后缀的链接,URL 可以更加简洁。设置为 false 可以保留 .html 后缀。

    需要服务器支持

    启用此选项可能需要在托管平台上进行额外配置。要使其生效,服务器必须能够在访问 /foo 时不经过重定向直接提供 /foo.html。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        cleanUrls: false,
      },
    });

    route.cleanUrlsRedirect

    • 类型: boolean
    • 默认值: true

    开启后,Rspress 会在客户端启动阶段以实际匹配到的路由为准,规范化浏览器地址栏中的 非规范 URL。目标格式遵循 route.cleanUrls。

    route.cleanUrls 控制生成链接所使用的首选 URL 格式, route.cleanUrlsRedirect 仅负责规范化浏览器地址栏。

    客户端路由兜底

    该配置会在请求页面的 HTML 和客户端运行时代码加载后执行。它使用 history.replaceState,不会返回 HTTP 301/308 响应,因此无法完全替代服务端或 CDN 的 canonical 重定向,尤其不能提供相同的 SEO 效果。托管平台仍需为当前 URL 变体返回正确的 Rspress 页面;如果条件允许,建议优先配置服务端重定向。

    cleanUrls: true

    普通页面路由不保留 trailing slash,目录首页路由则会保留。

    传入 URL匹配路由浏览器 URL 更新
    /file/file不更新
    /file.html/filereplaceState 到 /file
    /file//filereplaceState 到 /file
    /file/index/filereplaceState 到 /file
    /file/index.html/filereplaceState 到 /file
    /folder/folder/replaceState 到 /folder/
    /folder.html/folder/replaceState 到 /folder/
    /folder//folder/不更新
    /folder/index/folder/replaceState 到 /folder/
    /folder/index.html/folder/replaceState 到 /folder/

    cleanUrls: false

    普通页面路由使用 .html,目录首页路由使用 /index.html。

    传入 URL匹配路由浏览器 URL 更新
    /file/filereplaceState 到 /file.html
    /file.html/file不更新
    /file//filereplaceState 到 /file.html
    /file/index/filereplaceState 到 /file.html
    /file/index.html/filereplaceState 到 /file.html
    /folder/folder/replaceState 到 /folder/index.html
    /folder.html/folder/replaceState 到 /folder/index.html
    /folder//folder/replaceState 到 /folder/index.html
    /folder/index/folder/replaceState 到 /folder/index.html
    /folder/index.html/folder/不更新

    例如,/zh/guide/start/introduction.html 和 /zh/guide/start/introduction/index.html 都会匹配 /zh/guide/start/introduction,最终 URL 会遵循 cleanUrls 配置,并保留语言前缀。

    Canonical URL 格式与 Cloudflare 的 HTML handling 保持一致,但 Cloudflare 执行的是服务端 HTTP 重定向,本配置只会在浏览器中更新 URL。

    将 cleanUrlsRedirect 设置为 false 可以关闭浏览器 URL 规范化:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        cleanUrlsRedirect: false,
      },
    });

    route.localeRedirect

    • 类型:'auto' | 'never' | 'only-default-lang'
    • 默认值:'auto'

    控制如何根据 window.navigator.language 将首次访问的用户重定向到最匹配的已配置语言:

    • auto:从任意语言重定向到最匹配的已配置语言。
    • never:禁用自动语言重定向。
    • only-default-lang:仅在访问默认语言时重定向。
    建议使用服务端重定向

    该选项在浏览器端执行重定向。生产环境中,如果条件允许,更推荐在服务器或 CDN 边缘完成语言协商与重定向。这样可以在 HTML 下发前完成跳转,并且不依赖客户端 JavaScript。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        localeRedirect: 'never',
      },
    });

    route.useTransitions

    • 类型: boolean
    • 默认值: true

    启用针对 Rspress 默认 Link 组件的并发优化路由。它覆盖 Markdown 和 MDX 内容中的链接,也覆盖侧边栏项等默认主题导航链接。

    默认情况下,该选项开启。除非你显式将 useTransitions 设置为 false,否则内部页面跳转都会被包裹在 React 的 startTransition 中。这可以避免新页面内容的重渲染阻塞用户输入,使页面在导航过程中保持响应和可交互。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        useTransitions: false,
      },
    });
    • 类型: boolean
    • 默认值: true

    默认情况下,Rspress 的 Link 组件会在用户 hover 链接时,预请求对应内部路由的资源;在 touch 设备上也会触发同样的行为。这是一个性能优化手段。将该配置设置为 false 可禁用这一行为。

    Tip

    在开发环境下,链接预取会和 Rspress 默认开启的 dev.lazyCompilation 配合使用。按需编译让页面只在被访问时才编译,从而提升启动速度;链接预取则会在 hover 时提前启动目标路由编译,减少首次打开目标路由时的等待。

    示例:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      route: {
        prefetchLink: false,
      },
    });

    ssg

    • 类型: boolean | { experimentalWorker?: boolean; experimentalLoose?: boolean; }
    • 默认值: true

    是否在构建时将页面内容预渲染为 HTML。Rspress 默认开启 SSG。

    设置 ssg: false 后会生成用于客户端渲染的 HTML 空壳。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      ssg: false,
    });
    Tip

    SSG 和 SSG-MD 均要求源码支持在 SSR 下编译,如果使用了不兼容 SSR 场景下的代码,会导致编译失败。你可以尝试:

    1. 修复不兼容 SSR 的代码。具体方法请参阅 SSG 指南中的常见问题与解决方案。

    2. 如果代码不支持 SSR,需要同时设置 ssg: false 和 llms: false:

      rspress.config.ts
      import { defineConfig } from '@rspress/core';
      
      export default defineConfig({
        ssg: false,
        llms: false,
      });

    experimentalWorker

    • 类型: boolean
    • 默认值: false

    开启后可以使用 Worker 来加速 SSG 过程并降低内存占用,适合大型文档站点,底层基于 tinypool。

    experimentalExcludeRoutePaths

    • 类型: (string | RegExp)[]
    • 默认值: []

    开启后一部分页面将不进行 SSG 渲染,直接使用 CSR 下的 html,适合用于大型文档站点绕过一小部分页面的 SSG 错误,不建议主动开启。

    此选项仅影响 SSG,不会将页面排除在 SSG-MD 之外。如果被排除的页面不兼容 SSR,需要修复兼容性问题,或设置 llms: false 关闭 SSG-MD。

    replaceRules

    • 类型: { search: string | RegExp; replace: string; }[]
    • 默认值: []

    你可以通过 replaceRules 来对整个站点设置文本替换规则,规则会作用于包括 _meta.json 文件、frontmatter 配置以及文档内容和标题等所有内容。

    rspress.config.ts
    export default {
      replaceRules: [
        {
          search: /foo/g,
          replace: 'bar',
        },
      ],
    };

    languageParity

    • 类型: Object

    对文档根目录的 md 和 mdx 文件进行扫描,检测是否存在某些语言版本缺失的情况,保证语言一致性。

    languageParity.enabled

    • 类型: boolean
    • 默认值: false

    是否启用语言一致性检查。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      languageParity: {
        enabled: true,
      },
    });

    languageParity.include

    • 类型: string[]
    • 默认值: []

    需要检查的文件夹,默认为文档根目录下所有文件。填写路径时,相对于文档各语言目录。例如:

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      languageParity: {
        // 包含 zh/en 语言目录下的 posts/foods 和 articles 文件夹
        include: ['posts/foods', 'articles'],
      },
    });

    languageParity.exclude

    • 类型: string[]
    • 默认值: []

    从文档目录排除一些文件夹和文件,不进行检查。

    rspress.config.ts
    import { defineConfig } from '@rspress/core';
    
    export default defineConfig({
      languageParity: {
        exclude: ['excluded-directory', 'articles/secret.md'],
      },
    });