テーマ紹介
VitePressには、デフォルトで多くの機能を備えたテーマが用意されています。各機能の詳細については、以下の専用ページをご覧ください。
- Nav
- Sidebar
- Prev Next Link
- Edit Link
- Last Updated
- Layout
- Home Page
- Team Page
- Badge
- Footer
- Search
- Carbon Ads
探している機能が見つからない場合や、自分でテーマを作りたい場合は、VitePressをカスタマイズすることができます。以下のセクションでは、VitePressのテーマをカスタマイズする方法について、それぞれ説明していきます。
カスタムテーマの使用
.vitepress/theme/index.js または .vitepress/theme/index.ts ファイル(「テーマ入力ファイル」)を追加することにより、カスタムテーマを有効にすることができます。
.
├─ docs
│ ├─ .vitepress
│ │ ├─ theme
│ │ │ └─ index.js
│ │ └─ config.js
│ └─ index.md
└─ package.json
VitePressのカスタムテーマは、4つのプロパティを含むオブジェクトで、以下のように定義されています。
interface Theme {
Layout: Component // Vue 3 component
NotFound?: Component
enhanceApp?: (ctx: EnhanceAppContext) => void
setup?: () => void
}
interface EnhanceAppContext {
app: App // Vue 3 app instance
router: Router // VitePress router instance
siteData: Ref<SiteData>
}
テーマエントリーファイルは、テーマをそのデフォルトのエクスポートとしてエクスポートする必要があります。
// .vitepress/theme/index.js
import Layout from './Layout.vue'
export default {
// 各ページを包むルートコンポーネント
Layout,
// これはVue 3の機能コンポーネントです
NotFound: () => 'custom 404',
enhanceApp({ app, router, siteData }) {
// app は `createApp()` によるVue 3アプリのインスタンスです。 router はVitePressのカスタムルーターです。siteData` は、現在のサイトレベルのメタデータの `ref` です。
},
setup() {
// この関数は、VitePressAppのセットアップフックの中で実行されます。
}
}
...ここで、Layoutコンポーネントは、次のようになります。
<!-- .vitepress/theme/Layout.vue -->
<template>
<h1>Custom Layout!</h1>
<!-- this is where markdown content will be rendered -->
<Content />
</template>
デフォルトのエクスポートは、カスタム・テーマのための唯一の契約です。カスタムテーマの内部では、通常のVite + Vue 3アプリケーションと同じように動作します。テーマは、SSRと互換性がある必要があることに注意してください。
テーマを配布するには、パッケージエントリでオブジェクトをエクスポートするだけです。外部テーマを消費するには、カスタムテーマのエントリからインポートして再エクスポートします。
// .vitepress/theme/index.js
import Theme from 'awesome-vitepress-theme'
export default Theme
デフォルトテーマの拡張
デフォルトのテーマを拡張してカスタマイズしたい場合は、vitepress/themeからインポートして、カスタムテーマエントリで補強することができます。以下は、一般的なカスタマイズの例です。
グローバルコンポーネントの登録
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
export default {
...DefaultTheme,
enhanceApp(ctx) {
// デフォルトのテーマのカスタム動作を拡張します。
DefaultTheme.enhanceApp(ctx)
// カスタムグローバルコンポーネントの登録
ctx.app.component('MyGlobalComponent' /* ... */)
}
}
今回はViteを使用しているので、Viteのグロブインポート機能を利用して、コンポーネントのディレクトリを自動登録することもできます。
CSSのカスタマイズ
デフォルトのテーマCSSは、ルートレベルのCSS変数をオーバーライドすることでカスタマイズ可能です。
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import './custom.css'
export default DefaultTheme
/* .vitepress/theme/custom.css */
:root {
--vp-c-brand: #646cff;
--vp-c-brand-light: #747bff;
}
オーバーライド可能なデフォルトのテーマCSS変数を参照してください。
レイアウトスロット
デフォルトテーマの <Layout/>
コンポーネントにはいくつかのスロットがあり、ページの特定の位置にコンテンツを挿入するために使用できます。以下は、before outlineにコンポーネントを注入する例です。
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import MyLayout from './MyLayout.vue'
export default {
...DefaultTheme,
// スロットを注入するラッパーコンポーネントでレイアウトをオーバーライドします。
Layout: MyLayout
}
<!--.vitepress/theme/MyLayout.vue-->
<script setup>
import DefaultTheme from 'vitepress/theme'
const { Layout } = DefaultTheme
</script>
<template>
<Layout>
<template #aside-outline-before>
My custom sidebar top content
</template>
</Layout>
</template>
あるいは、レンダー機能も使える。
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import MyComponent from './MyComponent.vue'
export default {
...DefaultTheme,
Layout() {
return h(DefaultTheme.Layout, null, {
'aside-outline-before': () => h(MyComponent)
})
}
}
デフォルトのテーマレイアウトで利用可能なスロットの全リストです。
- レイアウトの場合: 'doc'(デフォルト)がfrontmatterを介して有効になっている場合。
- doc-footer-before
- doc-before
- doc-after
- sidebar-nav-before
- sidebar-nav-after
- aside-top
- aside-bottom
- aside-outline-before
- aside-outline-after
- aside-ads-before
- aside-ads-after
- レイアウトの場合: 'home' が frontmatter で有効になっている場合。
- home-hero-before
- home-hero-after
- home-features-before
- home-features-after
- いつもの:
- layout-top
- layout-bottom
- nav-bar-title-before
- nav-bar-title-after
- nav-bar-content-before
- nav-bar-content-after
- nav-screen-content-before
- nav-screen-content-after