VitePressで最近よくみるかっこいいドキュメントを作る

この記事は [ここのえ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/99no_exit) Day 16 の記事です。

# 忙しい人向けの要約

`VitePress`を使ってこれを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/4cd34bf2-add6-1e3b-6fa5-a2bcb5255855.png)

# 最近よく見るDocs

最近記事を書く関係でよく公式ドキュメントを掘りに行く機会が多いのですが、 [**Pinia**](https://pinia.vuejs.org/) とか、[**UnoCSS**](https://unocss.dev/) とか、似たデザインだけどかっこよくて洗練されたサイトをよく見かけます。

何だろう？と調べてみたら、`VitePress`を使って作られているようでした。

https://vitepress.dev/

`VitePress`は`VuePress`の精神的後継という位置づけだそうです[^1]。
`Vue2` + `Webpack` という構成だった`VuePress`に対して、`VitePress`はその名の通り`Vue3` + `Vite`構成で高速な開発ができるようになっています。

# 導入

秒でできます。`yarn`を使った例を示しますが、`pnpm`などを使っている場合は読み替えてください。

```bash
# プロジェクトルートでvitepressをinitしてしまうと、
# ルートディレクトリのdevDependenciesに
# vitepressが追加されてしまうので、お勧めしません
mkdir docs
cd docs

yarn add -D vitepress
npx vitepress init

◇  Where should VitePress initialize the config?
│  .   # ドキュメント保存先の指定
│
◇  Site title:
│  Super Library
│
◇  Site description:
│  めちゃくちゃすごいライブラリ
│
◇  Theme:
│  Default Theme
│
◇  Use TypeScript for config and theme files?
│  Yes
│
◇  Add VitePress npm scripts to package.json?
│  Yes
│
└  Done! Now run npm run docs:dev and start writing.
```

一度 `docs:dev` して動作チェックしておきます。

# 基本

VitePressは `Markdown` 記法を使って簡単にページを作成することができます。

トップページも `.md` ファイルになってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/bd5c130d-e8cd-a10d-b5ed-675720d85787.png)

初期状態のMarkdownファイルの中は、こんな感じになってます。

```index.md
---
layout: home

hero:
  name: "Super Library"
  text: "めちゃくちゃすごいライブラリ"
  tagline: My great project tagline
  actions:
    - theme: brand
      text: Markdown Examples
      link: /markdown-examples
    - theme: alt
      text: API Examples
      link: /api-examples
...
---
```
```api-examples.md
---
outline: deep
---

# Runtime API Examples

This page demonstrates usage of some of the runtime APIs provided by VitePress.

...
```

各ファイルの先頭に、`---` で囲まれた見慣れないセクションがあります。
これは **YAML Frontmatter** で、Markdownの先頭に`YAML`形式でページの設定(`layout`, `outline`, etc...) や、表示用のデータを記述することが可能になっています。

例えば `index.md` では `home` レイアウトを使用しており、タイトルやサブタイトル、下の方に出てる `features` のボックスなどの情報を与えるといい感じに表示してくれます。

<br/>
加えて `VitePress` は `Vue3` ベースなので、Markdown内でscriptタグも使えます。

ただ `.md` になっている関係で、補完が効かないのがちょっと微妙です。複雑なロジックはCustom LayoutとYAMLを活用したほうが良い気がします。

```sample.md
<script setup lang="ts">
const text: string = "hello vitepress"
</script>

# {{ text }}
```

# `home` Layout

https://vitepress.dev/reference/default-theme-home-page

上記のリンクからドキュメントに行けば全部書いてありますが、よく使いそうなものを抜粋しました。

## Hero Section

いわゆるヒーロービューのセクションです。
アイコンは適当にAdobe Fireflyに考えてもらいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/95628cb9-911d-36e4-0e01-8cbdd0bb6ebf.png)

```yaml
hero:
  name: "Super Library"
  text: "めちゃくちゃすごいライブラリ"
  tagline: Qiitaの記事用に作った、VitePressのテストページです。
  image:
    src: /logo.png
    alt: logo
  actions:
    - theme: brand
      text: Getting Started
      link: /docs/getting-started
    - theme: alt
      text: API Examples
      link: /references/api-examples
```

`actions`のボタンについては、`brand`と`alt`という2種類のテーマがデフォルトで定義されています[^2]。

## Features Section

見慣れたアレです。ライブラリの特徴について自慢できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/bdaa66e0-23da-ea38-d15d-30341544923e.png)

```yaml
features:
  - icon:
      light: /index/fast-light.svg
      dark: /index/fast-dark.svg
      alt: super-fast
    title: 超高速
    details: 従来のライブラリと比べて5000倍高速化。サラマンダーよりずっと早いです。
    link: /docs/getting-started
  - title: Typescript Friendly
    details: Typescriptの型に対応しています。
  - title: 超軽量
    details: ライブラリのサイズが小さく、ブラウザでも気兼ねなく使えます。最小構成では ~3kbです。
```

`icon` で自由にアイコンを付けられます。
標準でライト・ダークモードでそれぞれアイコンを変更できます。テーマごとに変更する必要がなければ、`src`で指定すればOKです。

# `doc` Layout

`layout` を明示しなかった場合、デフォルトでは `doc` レイアウトが適用されます。

## Prev, Next

```yaml
prev: false
next:
  text: サンプルページ1
  link: /docs/one
```

前ページ、次ページの前後関係を定義できます。
`false` にすることで、前後関係を切ることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/9647c2b2-56f8-ca3b-66ea-503735772e8b.png)

## よく使いそうなMarkdown拡張

基本的にはMarkdownそのままですが、拡張構文がいくつかあります。ドキュメントの作成で頻繁に使いそうな構文をピックアップしてみました。
Qiitaだとレイアウトが崩れるので、gistで貼っておきます。

https://gist.github.com/nonuplet/e940c82b9784387125dc3bd874ebe641

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/4f8a983e-f01a-8144-b709-6756011de4e7.png)

# Navigation, Sidebarの設定 (themeConfig)

NavigationやSideBarの設定は、`.vitepress/config.mts` から行えます。

```ts
export default defineConfig({
  title: "Super Library",
  description: "めちゃくちゃすごいライブラリ",
  themeConfig: {
    // https://vitepress.dev/reference/default-theme-config
    logo: '/logo.png',
    nav: [
      { text: 'Home', link: '/' },
      { text: 'Docs', link: '/docs/getting-started' },
      { text: 'Reference', link: '/references/api-examples' }
    ],

    sidebar: {
      '/docs/': [
        {
          text: 'Docs',
          items: [
            { text: 'Getting Started', link: '/docs/getting-started' },
            { text: 'One', link: '/docs/one' },
            { text: 'Two', link: '/docs/two'}
          ]
        },
      ],
      '/references/': [
        {
          text: 'Reference',
          items: [
            { text: 'API Examples', link: '/references/api-examples' }
          ]
        }
      ]
    },

    socialLinks: [
      { icon: 'github', link: 'https://github.com/vuejs/vitepress' }
    ]
  }
})
```

`logo` を指定することで、ドキュメントページの左上に出てくるサイトタイトルの左側にロゴを表示することができます。

```ts
logo: '/logo.png',
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/f7d96051-a6a0-9f76-b641-cf1641fef3be.png)

`Sidebar` の設定では、ルーティング毎に別のサイドバーを定義することもできます。

今回のサンプルでは、`/docs/` と `/references/` で別のサイドバーが表示されるようにしました。

```ts
sidebar: {
  '/docs/': [ 
    // サイドバーの設定
  ],
  '/references/': [
    // サイドバーの設定
  ]
},
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617021/07f70b33-e545-0d9d-6ff5-e91a791180c4.png)

# まとめ

以上の機能さえ把握していれば、最低限ドキュメントは作れると思います。

ベースが`Vite`を使用しているので、高速なHMRを使えるのがかなりいいですね。Markdownなのでとても書きやすいです。
またドキュメント作成を主目的としていることから、最初からコード表示関係の機能が充実しているのも便利です。

今回触り始めた動機は「よく見るドキュメントどうやって作るんだろ…」という興味本位でしたが、本筋の開発から逸れたドキュメント周りの整備とかに手間暇がかからないのはいいですね。

今後ライブラリ開発する時は積極的に導入していきたいです。

# 参考

https://vitepress.dev/

[^1]:https://vitepress.dev/guide/what-is-vitepress#what-about-vuepress

[^2]:https://vitepress.dev/reference/default-theme-home-page#hero-section