Skip to content

主题配置

在主题开发中,往往需要提供一些配置来丰富主题的功能,最简单的是和 Vitepress 的 themeConfig 配置合在一起:

ts
// .vitepress/config.ts
import { defineConfig } from "vitepress";

export default defineConfig({
  // ...
  themeConfig: {
    // vitepress 配置
    // 自定义主题配置
  },
});

然后在组件里通过 useData 获取 themeConfig 的内容:

vue
<script setup lang="ts">
import { useData } from "vitepress";

// 获取 themeConfig
const { theme } = useData;

// 获取自定义主题配置项
const xx = theme.value.xx;
</script>

<template></template>

这种方式仅适合简单的主题,当主题需要添加一个 head 或者 vite 插件,需要让用户修改 Vitepress 的配置,这样极其不方便。

因此可以先将主题配置抽离出来,然后使用 extends 来合并主题配置。

extends 合并配置

Vitepress 提供了 extends 来合并外界传来的配置项,比如外界的配置提供了部分 head 内容,并且在 Vitepress 也配置了 head,则最终合并为一个全新的 head,而不是覆盖。

提示

只有 Vitepress 的配置项为对象/数组时可以合并,如果配置项为一个固定的值或者函数,则以 Vitepress 的配置项为主。

extends 合并主题配置的使用方式如下:

ts
import { defineConfig } from "vitepress";

// 主题配置
const teekConfig = {};

// vitepress 配置
export default defineConfig({
  extends: teekConfig,
  // ...
  themeConfig: {
    // ...
  },
});

在 Vitepress 配置中通过 extends 可以将主题配置合并到 Vitepress 配置里,也就是说完全可以在主题配置里添加 Vitepress 的配置项,但是不能反过来,如:

ts
// .vitepress/config.ts
import { defineConfig } from "vitepress";

// 主题配置
const myThemeConfig = { themeConfig: { tkTheme: true } };

// Vitepress 配置
export default defineConfig({
  extends: myThemeConfig,
  base: "/",
});
ts
// .vitepress/config.ts
import { defineConfig } from "vitepress";

// 主题配置 + Vitepress 配置
const myThemeConfig = { base: "/", themeConfig: { tkTheme: true } };

export default defineConfig({
  extends: myThemeConfig,
});

函数式构建配置

在主题配置里,如果要使用 Vite 插件或者想要修改 Vitepress 默认的配置,则可以提供一个函数来返回主题配置:

ts
// myThemeConfig.ts
import type { DefaultTheme, UserConfig } from "vitepress";
import type { PluginOption } from "vite";

interface ThemeConfig {
  useTheme?: boolean; // 是否开启主题
  // ...
}

export default function getThemeConfig(config: ThemeConfig & UserConfig<DefaultTheme.Config> = {}): UserConfig {
  // 获取用户的配置,进行逻辑处理
  const { useTheme = true, ...themeConfig } = config;

  if (!useTheme) return {};

  return {
    // ignoreDeadLinks 默认值修改为 true,当用户在 Vitepress 手动改为 false 才为 false
    ignoreDeadLinks: true,
    // 添加主题需要的 head 信息
    head: [],
    vite: {
      // 添加主题需要的 Vite 插件
      plugins: [],
    },
    themeConfig,
  };
}

.vitepress/config.ts 引入该函数:

ts
import { defineConfig } from "vitepress";
import getThemeConfig from "myThemeConfig";

const myThemeConfig = getThemeConfig({ useTheme: false });

// Vitepress 配置
export default defineConfig({
  extends: myThemeConfig,
  // ...
});