docs: format

pull/5113/head
Divyansh Singh 7 months ago
parent 5b7ccbccdd
commit 5e12ef7f13

@ -179,7 +179,7 @@ export default defineConfig({
async _render(src, env, md) { async _render(src, env, md) {
const html = await md.renderAsync(src, env) const html = await md.renderAsync(src, env)
if (env.frontmatter?.title) if (env.frontmatter?.title)
return await md.renderAsync(`# ${env.frontmatter.title}`) + html return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html
return html return html
} }
} }

@ -49,7 +49,7 @@ interface PageData {
titleTemplate?: string | boolean titleTemplate?: string | boolean
description: string description: string
relativePath: string relativePath: string
filePath: string, filePath: string
headers: Header[] headers: Header[]
frontmatter: Record<string, any> frontmatter: Record<string, any>
params?: Record<string, any> params?: Record<string, any>

@ -174,7 +174,7 @@ export default defineConfig({
async _render(src, env, md) { async _render(src, env, md) {
const html = await md.renderAsync(src, env) const html = await md.renderAsync(src, env)
if (env.frontmatter?.title) if (env.frontmatter?.title)
return await md.renderAsync(`# ${env.frontmatter.title}`) + html return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html
return html return html
} }
} }

@ -45,7 +45,7 @@ interface PageData {
titleTemplate?: string | boolean titleTemplate?: string | boolean
description: string description: string
relativePath: string relativePath: string
filePath: string, filePath: string
headers: Header[] headers: Header[]
frontmatter: Record<string, any> frontmatter: Record<string, any>
params?: Record<string, any> params?: Record<string, any>

@ -174,7 +174,7 @@ export default defineConfig({
async _render(src, env, md) { async _render(src, env, md) {
const html = await md.renderAsync(src, env) const html = await md.renderAsync(src, env)
if (env.frontmatter?.title) if (env.frontmatter?.title)
return await md.renderAsync(`# ${env.frontmatter.title}`) + html return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html
return html return html
} }
} }

@ -49,7 +49,7 @@ interface PageData {
titleTemplate?: string | boolean titleTemplate?: string | boolean
description: string description: string
relativePath: string relativePath: string
filePath: string, filePath: string
headers: Header[] headers: Header[]
frontmatter: Record<string, any> frontmatter: Record<string, any>
params?: Record<string, any> params?: Record<string, any>

@ -12,44 +12,44 @@ CMS ごとに動作が異なるため、ここでは各自の環境に合わせ
1. CMS が認証を必要とする場合は、API トークンを格納するための `.env` を作成し、次のように読み込みます。 1. CMS が認証を必要とする場合は、API トークンを格納するための `.env` を作成し、次のように読み込みます。
```js ```js
// posts/[id].paths.js // posts/[id].paths.js
import { loadEnv } from 'vitepress' import { loadEnv } from 'vitepress'
const env = loadEnv('', process.cwd()) const env = loadEnv('', process.cwd())
``` ```
2. CMS から必要なデータを取得し、適切なパスデータの形式に整形します。 2. CMS から必要なデータを取得し、適切なパスデータの形式に整形します。
```js ```js
export default { export default {
async paths() { async paths() {
// 必要に応じて各 CMS のクライアントライブラリを使用 // 必要に応じて各 CMS のクライアントライブラリを使用
const data = await (await fetch('https://my-cms-api', { const data = await (await fetch('https://my-cms-api', {
headers: { headers: {
// 必要ならトークン // 必要ならトークン
} }
})).json() })).json()
return data.map(entry => { return data.map((entry) => {
return { return {
params: { id: entry.id, /* title, authors, date など */ }, params: { id: entry.id, /* title, authors, date など */ },
content: entry.content content: entry.content
} }
}) })
} }
} }
``` ```
3. ページ内でコンテンツをレンダリングします。 3. ページ内でコンテンツをレンダリングします。
```md ```md
# {{ $params.title }} # {{ $params.title }}
- {{ $params.date }} に {{ $params.author }} が作成 - {{ $params.date }} に {{ $params.author }} が作成
<!-- @content --> <!-- @content -->
``` ```
## 連携ガイドの募集 {#integration-guides} ## 連携ガイドの募集 {#integration-guides}

@ -23,43 +23,42 @@ VitePress のカスタムテーマは次のインターフェースを持つオ
```ts ```ts
interface Theme { interface Theme {
/** /**
* すべてのページに適用されるルートレイアウトコンポーネント * すべてのページに適用されるルートレイアウトコンポーネント
* @required * @required
*/ */
Layout: Component Layout: Component
/** /**
* Vue アプリインスタンスを拡張 * Vue アプリインスタンスを拡張
* @optional * @optional
*/ */
enhanceApp?: (ctx: EnhanceAppContext) => Awaitable<void> enhanceApp?: (ctx: EnhanceAppContext) => Awaitable<void>
/** /**
* 別のテーマを拡張し、そのテーマの `enhanceApp` を先に実行 * 別のテーマを拡張し、そのテーマの `enhanceApp` を先に実行
* @optional * @optional
*/ */
extends?: Theme extends?: Theme
} }
interface EnhanceAppContext { interface EnhanceAppContext {
app: App // Vue アプリインスタンス app: App // Vue アプリインスタンス
router: Router // VitePress のルーターインスタンス router: Router // VitePress のルーターインスタンス
siteData: Ref<SiteData> // サイト全体のメタデータ siteData: Ref<SiteData> // サイト全体のメタデータ
} }
``` ```
テーマエントリファイルでは、このテーマをデフォルトエクスポートとして公開します。 テーマエントリファイルでは、このテーマをデフォルトエクスポートとして公開します。
```js [.vitepress/theme/index.js] ```js [.vitepress/theme/index.js]
// テーマエントリでは Vue ファイルを直接インポートできます // テーマエントリでは Vue ファイルを直接インポートできます
// VitePress は @vitejs/plugin-vue をあらかじめ設定済みです // VitePress は @vitejs/plugin-vue をあらかじめ設定済みです
import Layout from './Layout.vue' import Layout from './Layout.vue'
export default { export default {
Layout, Layout,
enhanceApp({ app, router, siteData }) { enhanceApp({ app, router, siteData }) {
// ... // ...
} }
} }
``` ```
@ -73,10 +72,10 @@ enhanceApp({ app, router, siteData }) {
```vue [.vitepress/theme/Layout.vue] ```vue [.vitepress/theme/Layout.vue]
<template> <template>
<h1>Custom Layout!</h1> <h1>Custom Layout!</h1>
<!-- この部分に markdown コンテンツが描画されます --> <!-- この部分に markdown コンテンツが描画されます -->
<Content /> <Content />
</template> </template>
``` ```
@ -100,11 +99,11 @@ const { page } = useData()
[`useData()`](../reference/runtime-api#usedata) ヘルパーを使うと、条件によってレイアウトを切り替えるために必要なすべてのランタイムデータを取得できます。アクセスできるデータのひとつにフロントマターがあります。これを利用すると、ページごとにレイアウトを制御できます。例えば、ユーザーが特別なホームページレイアウトを使いたい場合は以下のように記述します。 [`useData()`](../reference/runtime-api#usedata) ヘルパーを使うと、条件によってレイアウトを切り替えるために必要なすべてのランタイムデータを取得できます。アクセスできるデータのひとつにフロントマターがあります。これを利用すると、ページごとにレイアウトを制御できます。例えば、ユーザーが特別なホームページレイアウトを使いたい場合は以下のように記述します。
```md ```md
--- ---
layout: home layout: home
--- ---
``` ```
テーマ側を次のように調整します。 テーマ側を次のように調整します。
@ -164,7 +163,6 @@ npm パッケージとして配布する場合は、次の手順を踏みます
## カスタムテーマの利用 {#consuming-a-custom-theme} ## カスタムテーマの利用 {#consuming-a-custom-theme}
外部テーマを利用するには、カスタムテーマエントリからインポートして再エクスポートします。 外部テーマを利用するには、カスタムテーマエントリからインポートして再エクスポートします。
```js [.vitepress/theme/index.js] ```js [.vitepress/theme/index.js]
@ -179,10 +177,10 @@ export default Theme
import Theme from 'awesome-vitepress-theme' import Theme from 'awesome-vitepress-theme'
export default { export default {
extends: Theme, extends: Theme,
enhanceApp(ctx) { enhanceApp(ctx) {
// ... // ...
} }
} }
``` ```
@ -192,8 +190,8 @@ enhanceApp(ctx) {
import baseConfig from 'awesome-vitepress-theme/config' import baseConfig from 'awesome-vitepress-theme/config'
export default { export default {
// 必要に応じてテーマの基本設定を拡張 // 必要に応じてテーマの基本設定を拡張
extends: baseConfig extends: baseConfig
} }
``` ```
@ -205,9 +203,9 @@ import { defineConfigWithTheme } from 'vitepress'
import type { ThemeConfig } from 'awesome-vitepress-theme' import type { ThemeConfig } from 'awesome-vitepress-theme'
export default defineConfigWithTheme<ThemeConfig>({ export default defineConfigWithTheme<ThemeConfig>({
extends: baseConfig, extends: baseConfig,
themeConfig: { themeConfig: {
// 型は `ThemeConfig` // 型は `ThemeConfig`
} }
}) })
``` ```

@ -10,12 +10,12 @@ VitePress には **データローダー (data loaders)** という機能があ
```js [example.data.js] ```js [example.data.js]
export default { export default {
load() { load() {
return { return {
hello: 'world' hello: 'world'
}
} }
} }
}
``` ```
ローダーモジュールは Node.js 上でのみ評価されるため、Node API や npm 依存関係を自由に利用できます。 ローダーモジュールは Node.js 上でのみ評価されるため、Node API や npm 依存関係を自由に利用できます。
@ -179,7 +179,6 @@ interface ContentOptions<T = ContentData[]> {
## 型付きデータローダー {#typed-data-loaders} ## 型付きデータローダー {#typed-data-loaders}
TypeScript を使用する場合は、ローダーと `data` エクスポートを型付けできます。 TypeScript を使用する場合は、ローダーと `data` エクスポートを型付けできます。
```ts ```ts
@ -202,7 +201,6 @@ export default defineLoader({
## 設定情報の取得 {#configuration} ## 設定情報の取得 {#configuration}
ローダー内で設定情報を取得するには次のようにします。 ローダー内で設定情報を取得するには次のようにします。
```ts ```ts

@ -4,7 +4,6 @@ outline: deep
# VitePress サイトをデプロイする {#deploy-your-vitepress-site} # VitePress サイトをデプロイする {#deploy-your-vitepress-site}
以下のガイドは、次の前提に基づいています。 以下のガイドは、次の前提に基づいています。
- VitePress のサイトはプロジェクトの `docs` ディレクトリ内にある。 - VitePress のサイトはプロジェクトの `docs` ディレクトリ内にある。
@ -12,17 +11,16 @@ outline: deep
- VitePress はプロジェクトのローカル依存としてインストールされており、`package.json` に次のスクリプトが設定されている。 - VitePress はプロジェクトのローカル依存としてインストールされており、`package.json` に次のスクリプトが設定されている。
```json [package.json] ```json [package.json]
{ {
"scripts": { "scripts": {
"docs:build": "vitepress build docs", "docs:build": "vitepress build docs",
"docs:preview": "vitepress preview docs" "docs:preview": "vitepress preview docs"
} }
} }
``` ```
## ローカルでビルドしてテストする {#build-and-test-locally} ## ローカルでビルドしてテストする {#build-and-test-locally}
1. 次のコマンドでドキュメントをビルドします。 1. 次のコマンドでドキュメントをビルドします。
```sh ```sh
@ -35,30 +33,28 @@ outline: deep
$ npm run docs:preview $ npm run docs:preview
``` ```
`preview` コマンドはローカルの静的 Web サーバーを起動し、出力ディレクトリ `.vitepress/dist``http://localhost:4173` で配信します。プロダクションへプッシュする前に見た目を確認できます。 `preview` コマンドはローカルの静的 Web サーバーを起動し、出力ディレクトリ `.vitepress/dist``http://localhost:4173` で配信します。プロダクションへプッシュする前に見た目を確認できます。
3. `--port` 引数でサーバーのポートを設定できます。 3. `--port` 引数でサーバーのポートを設定できます。
```json ```json
{ {
"scripts": { "scripts": {
"docs:preview": "vitepress preview docs --port 8080" "docs:preview": "vitepress preview docs --port 8080"
} }
} }
``` ```
これで `docs:preview``http://localhost:8080` でサーバーを起動します。 これで `docs:preview``http://localhost:8080` でサーバーを起動します。
## 公開ベースパスの設定 {#setting-a-public-base-path} ## 公開ベースパスの設定 {#setting-a-public-base-path}
デフォルトでは、サイトはドメインのルートパス(`/`)にデプロイされることを想定しています。サイトをサブパス、例:`https://mywebsite.com/blog/` で配信する場合は、VitePress の設定で [`base`](../reference/site-config#base) オプションを `'/blog/'` に設定してください。 デフォルトでは、サイトはドメインのルートパス(`/`)にデプロイされることを想定しています。サイトをサブパス、例:`https://mywebsite.com/blog/` で配信する場合は、VitePress の設定で [`base`](../reference/site-config#base) オプションを `'/blog/'` に設定してください。
**例:** GitHubまたは GitLabPages に `user.github.io/repo/` としてデプロイするなら、`base` を `/repo/` に設定します。 **例:** GitHubまたは GitLabPages に `user.github.io/repo/` としてデプロイするなら、`base` を `/repo/` に設定します。
## HTTP キャッシュヘッダー {#http-cache-headers} ## HTTP キャッシュヘッダー {#http-cache-headers}
本番サーバーの HTTP ヘッダーを制御できる場合は、`cache-control` ヘッダーを設定して、再訪時のパフォーマンスを向上させましょう。 本番サーバーの HTTP ヘッダーを制御できる場合は、`cache-control` ヘッダーを設定して、再訪時のパフォーマンスを向上させましょう。
本番ビルドでは静的アセットJavaScript、CSS、`public` 以外のインポートアセット)にハッシュ付きファイル名が使用されます。ブラウザの開発者ツールのネットワークタブで本番プレビューを確認すると、`app.4f283b18.js` のようなファイルが見られます。 本番ビルドでは静的アセットJavaScript、CSS、`public` 以外のインポートアセット)にハッシュ付きファイル名が使用されます。ブラウザの開発者ツールのネットワークタブで本番プレビューを確認すると、`app.4f283b18.js` のようなファイルが見られます。
@ -86,19 +82,19 @@ Cache-Control: max-age=31536000,immutable
::: details `vercel.json` による Vercel 設定例 ::: details `vercel.json` による Vercel 設定例
```json ```json
{ {
"headers": [ "headers": [
{ {
"source": "/assets/(.*)", "source": "/assets/(.*)",
"headers": [ "headers": [
{ {
"key": "Cache-Control", "key": "Cache-Control",
"value": "max-age=31536000, immutable" "value": "max-age=31536000, immutable"
} }
] ]
} }
] ]
} }
``` ```
注:`vercel.json` は **リポジトリのルート** に配置してください。 注:`vercel.json` は **リポジトリのルート** に配置してください。
@ -109,7 +105,6 @@ Cache-Control: max-age=31536000,immutable
## プラットフォーム別ガイド {#platform-guides} ## プラットフォーム別ガイド {#platform-guides}
### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#netlify-vercel-cloudflare-pages-aws-amplify-render} ### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#netlify-vercel-cloudflare-pages-aws-amplify-render}
新しいプロジェクトを作成し、ダッシュボードで次の設定に変更します。 新しいプロジェクトを作成し、ダッシュボードで次の設定に変更します。
@ -127,77 +122,77 @@ HTML の _Auto Minify_ のようなオプションを有効にしないでくだ
1. プロジェクトの `.github/workflows` ディレクトリに `deploy.yml` を作成し、以下の内容を記述します。 1. プロジェクトの `.github/workflows` ディレクトリに `deploy.yml` を作成し、以下の内容を記述します。
```yaml [.github/workflows/deploy.yml] ```yaml [.github/workflows/deploy.yml]
# Sample workflow for building and deploying a VitePress site to GitHub Pages # Sample workflow for building and deploying a VitePress site to GitHub Pages
# #
name: Deploy VitePress site to Pages name: Deploy VitePress site to Pages
on: on:
# Runs on pushes targeting the `main` branch. Change this to `master` if you're # Runs on pushes targeting the `main` branch. Change this to `master` if you're
# using the `master` branch as the default branch. # using the `master` branch as the default branch.
push: push:
branches: [main] branches: [main]
# Allows you to run this workflow manually from the Actions tab # Allows you to run this workflow manually from the Actions tab
workflow_dispatch: workflow_dispatch:
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions: permissions:
contents: read contents: read
pages: write pages: write
id-token: write id-token: write
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency: concurrency:
group: pages group: pages
cancel-in-progress: false cancel-in-progress: false
jobs: jobs:
# Build job # Build job
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v5
with: with:
fetch-depth: 0 # Not needed if lastUpdated is not enabled fetch-depth: 0 # Not needed if lastUpdated is not enabled
# - uses: pnpm/action-setup@v4 # Uncomment this block if you're using pnpm # - uses: pnpm/action-setup@v4 # Uncomment this block if you're using pnpm
# with: # with:
# version: 9 # Not needed if you've set "packageManager" in package.json # version: 9 # Not needed if you've set "packageManager" in package.json
# - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun
- name: Setup Node - name: Setup Node
uses: actions/setup-node@v6 uses: actions/setup-node@v6
with: with:
node-version: 24 node-version: 24
cache: npm # or pnpm / yarn cache: npm # or pnpm / yarn
- name: Setup Pages - name: Setup Pages
uses: actions/configure-pages@v4 uses: actions/configure-pages@v4
- name: Install dependencies - name: Install dependencies
run: npm ci # or pnpm install / yarn install / bun install run: npm ci # or pnpm install / yarn install / bun install
- name: Build with VitePress - name: Build with VitePress
run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build
- name: Upload artifact - name: Upload artifact
uses: actions/upload-pages-artifact@v3 uses: actions/upload-pages-artifact@v3
with: with:
path: docs/.vitepress/dist path: docs/.vitepress/dist
# Deployment job # Deployment job
deploy: deploy:
environment: environment:
name: github-pages name: github-pages
url: ${{ steps.deployment.outputs.page_url }} url: ${{ steps.deployment.outputs.page_url }}
needs: build needs: build
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Deploy name: Deploy
steps: steps:
- name: Deploy to GitHub Pages - name: Deploy to GitHub Pages
id: deployment id: deployment
uses: actions/deploy-pages@v4 uses: actions/deploy-pages@v4
``` ```
::: warning ::: warning
VitePress の `base` オプションが正しく設定されていることを確認してください。詳細は [公開ベースパスの設定](#公開ベースパスの設定) を参照してください。 VitePress の `base` オプションが正しく設定されていることを確認してください。詳細は [公開ベースパスの設定](#公開ベースパスの設定) を参照してください。
::: :::
2. リポジトリ設定の「Pages」メニューで、「Build and deployment > Source」を「GitHub Actions」に設定します。 2. リポジトリ設定の「Pages」メニューで、「Build and deployment > Source」を「GitHub Actions」に設定します。
@ -210,20 +205,20 @@ HTML の _Auto Minify_ のようなオプションを有効にしないでくだ
2. プロジェクトのルートに `.gitlab-ci.yml` を作成して、以下を追加します。これにより、コンテンツを更新するたびにサイトがビルド・デプロイされます。 2. プロジェクトのルートに `.gitlab-ci.yml` を作成して、以下を追加します。これにより、コンテンツを更新するたびにサイトがビルド・デプロイされます。
```yaml [.gitlab-ci.yml] ```yaml [.gitlab-ci.yml]
image: node:18 image: node:18
pages: pages:
cache: cache:
paths: paths:
- node_modules/ - node_modules/
script: script:
# - apk add git # Uncomment this if you're using small docker images like alpine and have lastUpdated enabled # - apk add git # Uncomment this if you're using small docker images like alpine and have lastUpdated enabled
- npm install - npm install
- npm run docs:build - npm run docs:build
artifacts: artifacts:
paths: paths:
- public - public
only: only:
- main - main
``` ```
### Azure Static Web Apps {#azure-static-web-apps} ### Azure Static Web Apps {#azure-static-web-apps}
@ -231,7 +226,6 @@ HTML の _Auto Minify_ のようなオプションを有効にしないでくだ
1. [公式ドキュメント](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration) に従います。 1. [公式ドキュメント](https://docs.microsoft.com/en-us/azure/static-web-apps/build-configuration) に従います。
2. 設定ファイルで次の値を指定します(`api_location` のように不要なものは削除)。 2. 設定ファイルで次の値を指定します(`api_location` のように不要なものは削除)。
- **`app_location`**: `/` - **`app_location`**: `/`
- **`output_location`**: `docs/.vitepress/dist` - **`output_location`**: `docs/.vitepress/dist`
- **`app_build_command`**: `npm run docs:build` - **`app_build_command`**: `npm run docs:build`
@ -243,22 +237,22 @@ HTML の _Auto Minify_ のようなオプションを有効にしないでくだ
`firebase.json`: `firebase.json`:
```json [firebase.json] ```json [firebase.json]
{ {
"hosting": { "hosting": {
"public": "docs/.vitepress/dist", "public": "docs/.vitepress/dist",
"ignore": [] "ignore": []
} }
} }
``` ```
`.firebaserc`: `.firebaserc`:
```json [.firebaserc] ```json [.firebaserc]
{ {
"projects": { "projects": {
"default": "<YOUR_FIREBASE_ID>" "default": "<YOUR_FIREBASE_ID>"
} }
} }
``` ```
2. `npm run docs:build` の後、次のコマンドでデプロイします。 2. `npm run docs:build` の後、次のコマンドでデプロイします。
@ -282,9 +276,9 @@ HTML の _Auto Minify_ のようなオプションを有効にしないでくだ
2. プロジェクトのルートに `static.json` を作成し、以下を記述します。 2. プロジェクトのルートに `static.json` を作成し、以下を記述します。
```json [static.json] ```json [static.json]
{ {
"root": "docs/.vitepress/dist" "root": "docs/.vitepress/dist"
} }
``` ```
### Edgio {#edgio} ### Edgio {#edgio}

@ -70,7 +70,9 @@ export default DefaultTheme
export default { export default {
transformHead({ assets }) { transformHead({ assets }) {
// 使うフォントに合わせて正規表現を調整 // 使うフォントに合わせて正規表現を調整
const myFontFile = assets.find(file => /font-name\.[\w-]+\.woff2/.test(file)) const myFontFile = assets.find((file) =>
/font-name\.[\w-]+\.woff2/.test(file)
)
if (myFontFile) { if (myFontFile) {
return [ return [
[ [

@ -5,10 +5,10 @@
VitePress はすべての Markdown ファイルで YAML フロントマターをサポートしており、[gray-matter](https://github.com/jonschlinkert/gray-matter) で解析します。フロントマターは Markdown ファイルの先頭(`<script>` タグを含むあらゆる要素より前)に配置し、三本のハイフンで囲まれた **有効な YAML** 形式で記述します。例: VitePress はすべての Markdown ファイルで YAML フロントマターをサポートしており、[gray-matter](https://github.com/jonschlinkert/gray-matter) で解析します。フロントマターは Markdown ファイルの先頭(`<script>` タグを含むあらゆる要素より前)に配置し、三本のハイフンで囲まれた **有効な YAML** 形式で記述します。例:
```md ```md
--- ---
title: Docs with VitePress title: Docs with VitePress
editLink: true editLink: true
--- ---
``` ```
サイトやデフォルトテーマの多くの設定オプションには、フロントマター上で対応するオプションがあります。フロントマターを使うことで、**そのページに限って** 特定の振る舞いを上書きできます。詳細は [Frontmatter Config Reference](../reference/frontmatter-config) を参照してください。 サイトやデフォルトテーマの多くの設定オプションには、フロントマター上で対応するオプションがあります。フロントマターを使うことで、**そのページに限って** 特定の振る舞いを上書きできます。詳細は [Frontmatter Config Reference](../reference/frontmatter-config) を参照してください。
@ -22,14 +22,14 @@ VitePress はすべての Markdown ファイルで YAML フロントマターを
Markdown ファイル内での使用例: Markdown ファイル内での使用例:
```md ```md
--- ---
title: Docs with VitePress title: Docs with VitePress
editLink: true editLink: true
--- ---
# {{ $frontmatter.title }} # {{ $frontmatter.title }}
Guide content Guide content
``` ```
[`useData()`](../reference/runtime-api#usedata) ヘルパーを使えば、`<script setup>` 内からも現在のページのフロントマターデータにアクセスできます。 [`useData()`](../reference/runtime-api#usedata) ヘルパーを使えば、`<script setup>` 内からも現在のページのフロントマターデータにアクセスできます。
@ -38,11 +38,11 @@ Markdown ファイル内での使用例:
VitePress は JSON フロントマター構文もサポートしています。中括弧で開始・終了する形式です。 VitePress は JSON フロントマター構文もサポートしています。中括弧で開始・終了する形式です。
```json ```md
--- ---
{ {
"title": "Blogging Like a Hacker", "title": "Blogging Like a Hacker",
"editLink": true "editLink": true
} }
--- ---
``` ```

@ -10,7 +10,7 @@
- [Node.js](https://nodejs.org/) バージョン 18 以上 - [Node.js](https://nodejs.org/) バージョン 18 以上
- VitePress をコマンドラインインターフェース (CLI) で操作するためのターミナル - VitePress をコマンドラインインターフェース (CLI) で操作するためのターミナル
- [Markdown](https://en.wikipedia.org/wiki/Markdown) 構文に対応したテキストエディタ - [Markdown](https://en.wikipedia.org/wiki/Markdown) 構文に対応したテキストエディタ
- 推奨: [VSCode](https://code.visualstudio.com/) と [公式 Vue 拡張](https://marketplace.visualstudio.com/items?itemName=Vue.volar) - 推奨: [VSCode](https://code.visualstudio.com/) と [公式 Vue 拡張](https://marketplace.visualstudio.com/items?itemName=Vue.volar)
VitePress は単独でも利用できますし、既存プロジェクトに組み込むことも可能です。いずれの場合も以下でインストールできます。 VitePress は単独でも利用できますし、既存プロジェクトに組み込むことも可能です。いずれの場合も以下でインストールできます。

File diff suppressed because it is too large Load Diff

@ -8,15 +8,15 @@ MPA モードでは、既定で **あらゆるページが JavaScript を含ま
また、「既定で JS なし」ということは、実質的に Vue をサーバーサイドのテンプレート言語としてのみ使うことを意味します。ブラウザ側ではイベントハンドラがアタッチされないため、インタラクティブ性はありません。クライアントサイドの JavaScript を読み込むには、特別な `<script client>` タグを使用します: また、「既定で JS なし」ということは、実質的に Vue をサーバーサイドのテンプレート言語としてのみ使うことを意味します。ブラウザ側ではイベントハンドラがアタッチされないため、インタラクティブ性はありません。クライアントサイドの JavaScript を読み込むには、特別な `<script client>` タグを使用します:
```html ```md
<script client> <script client>
document.querySelector('h1').addEventListener('click', () => { document.querySelector('h1').addEventListener('click', () => {
console.log('client side JavaScript!') console.log('client side JavaScript!')
}) })
</script> </script>
# Hello # Hello
``` ```
`<script client>` は VitePress 固有の機能であり、Vue の機能ではありません。`.md` と `.vue` の両方で動作しますが、**MPA モード時のみ** 有効です。テーマコンポーネント内のクライアントスクリプトはひとつにバンドルされ、特定ページ専用のクライアントスクリプトはそのページごとに分割されます。 `<script client>` は VitePress 固有の機能であり、Vue の機能ではありません。`.md` と `.vue` の両方で動作しますが、**MPA モード時のみ** 有効です。テーマコンポーネント内のクライアントスクリプトはひとつにバンドルされ、特定ページ専用のクライアントスクリプトはそのページごとに分割されます。

@ -8,23 +8,23 @@ outline: deep
VitePress はファイルベースのルーティングを採用しており、生成される HTML はソースの Markdown ファイルのディレクトリ構造に対応します。例えば、次のディレクトリ構造があるとします: VitePress はファイルベースのルーティングを採用しており、生成される HTML はソースの Markdown ファイルのディレクトリ構造に対応します。例えば、次のディレクトリ構造があるとします:
``` ```
. .
├─ guide ├─ guide
│ ├─ getting-started.md │ ├─ getting-started.md
│ └─ index.md │ └─ index.md
├─ index.md ├─ index.md
└─ prologue.md └─ prologue.md
``` ```
生成される HTML は次のとおりです: 生成される HTML は次のとおりです:
``` ```
index.md --> /index.html / でアクセス可能) index.md --> /index.html / でアクセス可能)
prologue.md --> /prologue.html prologue.md --> /prologue.html
guide/index.md --> /guide/index.html /guide/ でアクセス可能) guide/index.md --> /guide/index.html /guide/ でアクセス可能)
guide/getting-started.md --> /guide/getting-started.html guide/getting-started.md --> /guide/getting-started.html
``` ```
生成された HTML は、静的ファイルを配信できる任意の Web サーバーでホストできます。 生成された HTML は、静的ファイルを配信できる任意の Web サーバーでホストできます。
@ -38,25 +38,25 @@ VitePress プロジェクトのファイル構成には重要な概念が 2 つ
コマンドラインから `vitepress dev``vitepress build` を実行すると、VitePress は現在の作業ディレクトリをプロジェクトルートとして使用します。サブディレクトリをルートとして指定したい場合は、コマンドに相対パスを渡します。例えば、VitePress プロジェクトが `./docs` にある場合、`vitepress dev docs` を実行します: コマンドラインから `vitepress dev``vitepress build` を実行すると、VitePress は現在の作業ディレクトリをプロジェクトルートとして使用します。サブディレクトリをルートとして指定したい場合は、コマンドに相対パスを渡します。例えば、VitePress プロジェクトが `./docs` にある場合、`vitepress dev docs` を実行します:
``` ```
. .
├─ docs # プロジェクトルート ├─ docs # プロジェクトルート
│ ├─ .vitepress # 設定ディレクトリ │ ├─ .vitepress # 設定ディレクトリ
│ ├─ getting-started.md │ ├─ getting-started.md
│ └─ index.md │ └─ index.md
└─ ... └─ ...
``` ```
```sh ```sh
vitepress dev docs vitepress dev docs
``` ```
これにより、ソースから HTML へのマッピングは次のようになります: これにより、ソースから HTML へのマッピングは次のようになります:
``` ```
docs/index.md --> /index.html / でアクセス可能) docs/index.md --> /index.html / でアクセス可能)
docs/getting-started.md --> /getting-started.html docs/getting-started.md --> /getting-started.html
``` ```
### ソースディレクトリ {#source-directory} ### ソースディレクトリ {#source-directory}
@ -64,34 +64,34 @@ VitePress プロジェクトのファイル構成には重要な概念が 2 つ
`srcDir` はプロジェクトルートからの相対パスで解決されます。例えば `srcDir: 'src'` の場合、ファイル構成は次のようになります: `srcDir` はプロジェクトルートからの相対パスで解決されます。例えば `srcDir: 'src'` の場合、ファイル構成は次のようになります:
``` ```
. # プロジェクトルート . # プロジェクトルート
├─ .vitepress # 設定ディレクトリ ├─ .vitepress # 設定ディレクトリ
└─ src # ソースディレクトリ └─ src # ソースディレクトリ
├─ getting-started.md ├─ getting-started.md
└─ index.md └─ index.md
``` ```
ソースから HTML へのマッピングは次のとおりです: ソースから HTML へのマッピングは次のとおりです:
``` ```
src/index.md --> /index.html / でアクセス可能) src/index.md --> /index.html / でアクセス可能)
src/getting-started.md --> /getting-started.html src/getting-started.md --> /getting-started.html
``` ```
## ページ間リンク {#linking-between-pages} ## ページ間リンク {#linking-between-pages}
ページ間のリンクには、絶対パスと相対パスのどちらも使用できます。`.md` と `.html` の拡張子はどちらも機能しますが、最終的な URL を設定に応じて VitePress が生成できるよう、**拡張子は省略する** のがベストプラクティスです。 ページ間のリンクには、絶対パスと相対パスのどちらも使用できます。`.md` と `.html` の拡張子はどちらも機能しますが、最終的な URL を設定に応じて VitePress が生成できるよう、**拡張子は省略する** のがベストプラクティスです。
```md ```md
<!-- 良い例 --> <!-- 良い例 -->
[はじめに](./getting-started) [はじめに](./getting-started)
[はじめに](../guide/getting-started) [はじめに](../guide/getting-started)
<!-- 悪い例 --> <!-- 悪い例 -->
[はじめに](./getting-started.md) [はじめに](./getting-started.md)
[はじめに](./getting-started.html) [はじめに](./getting-started.html)
``` ```
画像などのアセットへのリンクについては、[アセットの取り扱い](./asset-handling) を参照してください。 画像などのアセットへのリンクについては、[アセットの取り扱い](./asset-handling) を参照してください。
@ -101,13 +101,13 @@ VitePress プロジェクトのファイル構成には重要な概念が 2 つ
**入力** **入力**
```md ```md
[pure.html へのリンク](/pure.html){target="_self"} [pure.html へのリンク](/pure.html){target="_self"}
``` ```
**出力** **出力**
[pure.html へのリンク](/pure.html){target="_self"} [pure.html へのリンク](/pure.html){target="_self"}
::: tip 注意 ::: tip 注意
@ -115,9 +115,9 @@ Markdown のリンクでは、`base` が自動的に URL の先頭に付与さ
あるいは、アンカータグの構文を直接使うこともできます: あるいは、アンカータグの構文を直接使うこともできます:
```md ```md
<a href="/pure.html" target="_self">pure.html へのリンク</a> <a href="/pure.html" target="_self">pure.html へのリンク</a>
``` ```
::: :::
## クリーン URL の生成 {#generating-clean-urls} ## クリーン URL の生成 {#generating-clean-urls}
@ -140,83 +140,83 @@ VitePress でクリーン URL を提供するには、サーバー側のサポ
もしサーバーをそのように設定できない場合は、次のようなディレクトリ構造に手動でする必要があります: もしサーバーをそのように設定できない場合は、次のようなディレクトリ構造に手動でする必要があります:
``` ```
. .
├─ getting-started ├─ getting-started
│ └─ index.md │ └─ index.md
├─ installation ├─ installation
│ └─ index.md │ └─ index.md
└─ index.md └─ index.md
``` ```
## ルートのリライト {#route-rewrites} ## ルートのリライト {#route-rewrites}
ソースディレクトリ構造と生成ページのマッピングをカスタマイズできます。これは複雑なプロジェクト構成で有用です。例えば、複数パッケージを持つモノレポで、ソースファイルと並べてドキュメントを配置したい場合: ソースディレクトリ構造と生成ページのマッピングをカスタマイズできます。これは複雑なプロジェクト構成で有用です。例えば、複数パッケージを持つモノレポで、ソースファイルと並べてドキュメントを配置したい場合:
``` ```
. .
└─ packages └─ packages
├─ pkg-a ├─ pkg-a
│ └─ src │ └─ src
│ ├─ foo.md │ ├─ foo.md
│ └─ index.md │ └─ index.md
└─ pkg-b └─ pkg-b
└─ src └─ src
├─ bar.md ├─ bar.md
└─ index.md └─ index.md
``` ```
生成したいページが次のような場合: 生成したいページが次のような場合:
``` ```
packages/pkg-a/src/index.md --> /pkg-a/index.html packages/pkg-a/src/index.md --> /pkg-a/index.html
packages/pkg-a/src/foo.md --> /pkg-a/foo.html packages/pkg-a/src/foo.md --> /pkg-a/foo.html
packages/pkg-b/src/index.md --> /pkg-b/index.html packages/pkg-b/src/index.md --> /pkg-b/index.html
packages/pkg-b/src/bar.md --> /pkg-b/bar.html packages/pkg-b/src/bar.md --> /pkg-b/bar.html
``` ```
[`rewrites`](../reference/site-config#rewrites) オプションを次のように設定します: [`rewrites`](../reference/site-config#rewrites) オプションを次のように設定します:
```ts [.vitepress/config.js] ```ts [.vitepress/config.js]
export default { export default {
rewrites: { rewrites: {
'packages/pkg-a/src/index.md': 'pkg-a/index.md', 'packages/pkg-a/src/index.md': 'pkg-a/index.md',
'packages/pkg-a/src/foo.md': 'pkg-a/foo.md', 'packages/pkg-a/src/foo.md': 'pkg-a/foo.md',
'packages/pkg-b/src/index.md': 'pkg-b/index.md', 'packages/pkg-b/src/index.md': 'pkg-b/index.md',
'packages/pkg-b/src/bar.md': 'pkg-b/bar.md' 'packages/pkg-b/src/bar.md': 'pkg-b/bar.md'
} }
} }
``` ```
`rewrites` は動的なルートパラメータにも対応しています。上記の例で多くのパッケージがある場合、同じ構造なら次のように簡略化できます: `rewrites` は動的なルートパラメータにも対応しています。上記の例で多くのパッケージがある場合、同じ構造なら次のように簡略化できます:
```ts ```ts
export default { export default {
rewrites: { rewrites: {
'packages/:pkg/src/:slug*': ':pkg/:slug*' 'packages/:pkg/src/:slug*': ':pkg/:slug*'
} }
} }
``` ```
リライトのパスは `path-to-regexp` パッケージでコンパイルされます。高度な構文は[ドキュメント](https://github.com/pillarjs/path-to-regexp/tree/6.x#parameters)を参照してください。 リライトのパスは `path-to-regexp` パッケージでコンパイルされます。高度な構文は[ドキュメント](https://github.com/pillarjs/path-to-regexp/tree/6.x#parameters)を参照してください。
`rewrites` は、元のパスを受け取って新しいパスを返す **関数** として定義することもできます: `rewrites` は、元のパスを受け取って新しいパスを返す **関数** として定義することもできます:
```ts ```ts
export default { export default {
rewrites(id) { rewrites(id) {
return id.replace(/^packages\/([^/]+)\/src\//, '$1/') return id.replace(/^packages\/([^/]+)\/src\//, '$1/')
} }
} }
``` ```
::: warning リライト時の相対リンク ::: warning リライト時の相対リンク
リライトを有効にした場合、**相対リンクはリライト後のパスに基づいて** 記述してください。例えば、`packages/pkg-a/src/pkg-a-code.md` から `packages/pkg-b/src/pkg-b-code.md` への相対リンクを作るには、次のように書きます: リライトを有効にした場合、**相対リンクはリライト後のパスに基づいて** 記述してください。例えば、`packages/pkg-a/src/pkg-a-code.md` から `packages/pkg-b/src/pkg-b-code.md` への相対リンクを作るには、次のように書きます:
```md ```md
[PKG B へのリンク](../pkg-b/pkg-b-code) [PKG B へのリンク](../pkg-b/pkg-b-code)
``` ```
::: :::
## 動的ルート {#dynamic-routes} ## 動的ルート {#dynamic-routes}
@ -227,37 +227,37 @@ VitePress でクリーン URL を提供するには、サーバー側のサポ
VitePress は静的サイトジェネレーターなので、生成可能なページパスはビルド時に確定している必要があります。したがって、動的ルートページには **パスローダーファイル** が **必須** です。`packages/[pkg].md` に対しては `packages/[pkg].paths.js``.ts` も可)が必要です: VitePress は静的サイトジェネレーターなので、生成可能なページパスはビルド時に確定している必要があります。したがって、動的ルートページには **パスローダーファイル** が **必須** です。`packages/[pkg].md` に対しては `packages/[pkg].paths.js``.ts` も可)が必要です:
``` ```
. .
└─ packages └─ packages
├─ [pkg].md # ルートテンプレート ├─ [pkg].md # ルートテンプレート
└─ [pkg].paths.js # ルートのパスローダー └─ [pkg].paths.js # ルートのパスローダー
``` ```
パスローダーは、`paths` メソッドを持つオブジェクトをデフォルトエクスポートします。`paths` は `params` プロパティを持つオブジェクトの配列を返します。各オブジェクトが 1 ページに対応します。 パスローダーは、`paths` メソッドを持つオブジェクトをデフォルトエクスポートします。`paths` は `params` プロパティを持つオブジェクトの配列を返します。各オブジェクトが 1 ページに対応します。
例えば次の `paths` 配列を返すと: 例えば次の `paths` 配列を返すと:
```js ```js
// packages/[pkg].paths.js // packages/[pkg].paths.js
export default { export default {
paths() { paths() {
return [ return [
{ params: { pkg: 'foo' }}, { params: { pkg: 'foo' } },
{ params: { pkg: 'bar' }} { params: { pkg: 'bar' } }
] ]
} }
} }
``` ```
生成される HTML は次のようになります: 生成される HTML は次のようになります:
``` ```
. .
└─ packages └─ packages
├─ foo.html ├─ foo.html
└─ bar.html └─ bar.html
``` ```
### 複数パラメータ {#multiple-params} ### 複数パラメータ {#multiple-params}
@ -265,36 +265,36 @@ VitePress は静的サイトジェネレーターなので、生成可能なペ
**ファイル構成** **ファイル構成**
``` ```
. .
└─ packages └─ packages
├─ [pkg]-[version].md ├─ [pkg]-[version].md
└─ [pkg]-[version].paths.js └─ [pkg]-[version].paths.js
``` ```
**パスローダー** **パスローダー**
```js ```js
export default { export default {
paths: () => [ paths: () => [
{ params: { pkg: 'foo', version: '1.0.0' }}, { params: { pkg: 'foo', version: '1.0.0' } },
{ params: { pkg: 'foo', version: '2.0.0' }}, { params: { pkg: 'foo', version: '2.0.0' } },
{ params: { pkg: 'bar', version: '1.0.0' }}, { params: { pkg: 'bar', version: '1.0.0' } },
{ params: { pkg: 'bar', version: '2.0.0' }} { params: { pkg: 'bar', version: '2.0.0' } }
] ]
} }
``` ```
**出力** **出力**
``` ```
. .
└─ packages └─ packages
├─ foo-1.0.0.html ├─ foo-1.0.0.html
├─ foo-2.0.0.html ├─ foo-2.0.0.html
├─ bar-1.0.0.html ├─ bar-1.0.0.html
└─ bar-2.0.0.html └─ bar-2.0.0.html
``` ```
### パスを動的に生成する {#dynamically-generating-paths} ### パスを動的に生成する {#dynamically-generating-paths}
@ -302,60 +302,60 @@ VitePress は静的サイトジェネレーターなので、生成可能なペ
ローカルファイルから生成する例: ローカルファイルから生成する例:
```js ```js
import fs from 'fs' import fs from 'fs'
export default { export default {
paths() { paths() {
return fs return fs
.readdirSync('packages') .readdirSync('packages')
.map((pkg) => { .map((pkg) => {
return { params: { pkg } } return { params: { pkg } }
}) })
} }
} }
``` ```
リモートデータから生成する例: リモートデータから生成する例:
```js ```js
export default { export default {
async paths() { async paths() {
const pkgs = await (await fetch('https://my-api.com/packages')).json() const pkgs = await (await fetch('https://my-api.com/packages')).json()
return pkgs.map((pkg) => { return pkgs.map((pkg) => {
return { return {
params: { params: {
pkg: pkg.name, pkg: pkg.name,
version: pkg.version version: pkg.version
} }
} }
}) })
} }
} }
``` ```
### ページ内でパラメータにアクセスする {#accessing-params-in-page} ### ページ内でパラメータにアクセスする {#accessing-params-in-page}
各ページへ追加データを渡すために、パラメータを利用できます。Markdown のルートファイルでは、Vue 式内で `$params` グローバルプロパティから現在ページのパラメータにアクセスできます: 各ページへ追加データを渡すために、パラメータを利用できます。Markdown のルートファイルでは、Vue 式内で `$params` グローバルプロパティから現在ページのパラメータにアクセスできます:
```md ```md
- パッケージ名: {{ $params.pkg }} - パッケージ名: {{ $params.pkg }}
- バージョン: {{ $params.version }} - バージョン: {{ $params.version }}
``` ```
[`useData`](../reference/runtime-api#usedata) ランタイム API からも、現在ページのパラメータにアクセスできますMarkdown と Vue コンポーネントの両方で利用可能): [`useData`](../reference/runtime-api#usedata) ランタイム API からも、現在ページのパラメータにアクセスできますMarkdown と Vue コンポーネントの両方で利用可能):
```vue ```vue
<script setup> <script setup>
import { useData } from 'vitepress' import { useData } from 'vitepress'
// params は Vue の ref // params は Vue の ref
const { params } = useData() const { params } = useData()
console.log(params.value) console.log(params.value)
</script> </script>
``` ```
### 生コンテンツのレンダリング {#rendering-raw-content} ### 生コンテンツのレンダリング {#rendering-raw-content}
@ -363,23 +363,23 @@ VitePress は静的サイトジェネレーターなので、生成可能なペ
代わりに、各パスオブジェクトの `content` プロパティでコンテンツを渡せます: 代わりに、各パスオブジェクトの `content` プロパティでコンテンツを渡せます:
```js ```js
export default { export default {
async paths() { async paths() {
const posts = await (await fetch('https://my-cms.com/blog-posts')).json() const posts = await (await fetch('https://my-cms.com/blog-posts')).json()
return posts.map((post) => { return posts.map((post) => {
return { return {
params: { id: post.id }, params: { id: post.id },
content: post.content // 生の Markdown または HTML content: post.content // 生の Markdown または HTML
} }
}) })
} }
} }
``` ```
そのうえで、Markdown ファイル内で次の特別な構文を使って、そのコンテンツを埋め込みます: そのうえで、Markdown ファイル内で次の特別な構文を使って、そのコンテンツを埋め込みます:
```md ```md
<!-- @content --> <!-- @content -->
``` ```

@ -2,13 +2,13 @@
VitePress には、サイト用の `sitemap.xml` を生成する機能が標準で用意されています。有効化するには、`.vitepress/config.js` に次を追加します。 VitePress には、サイト用の `sitemap.xml` を生成する機能が標準で用意されています。有効化するには、`.vitepress/config.js` に次を追加します。
```ts ```ts
export default { export default {
sitemap: { sitemap: {
hostname: 'https://example.com' hostname: 'https://example.com'
} }
} }
``` ```
`siteamp.xml``<lastmod>` タグを含めるには、[`lastUpdated`](../reference/default-theme-last-updated) オプションを有効にします。 `siteamp.xml``<lastmod>` タグを含めるには、[`lastUpdated`](../reference/default-theme-last-updated) オプションを有効にします。
@ -16,43 +16,43 @@ VitePress には、サイト用の `sitemap.xml` を生成する機能が標準
サイトマップ生成は [`sitemap`](https://www.npmjs.com/package/sitemap) モジュールで行われます。設定ファイルの `sitemap` に、このモジュールがサポートする任意のオプションを渡せます。指定した値はそのまま `SitemapStream` コンストラクタに渡されます。詳しくは [`sitemap` のドキュメント](https://www.npmjs.com/package/sitemap#options-you-can-pass) を参照してください。例: サイトマップ生成は [`sitemap`](https://www.npmjs.com/package/sitemap) モジュールで行われます。設定ファイルの `sitemap` に、このモジュールがサポートする任意のオプションを渡せます。指定した値はそのまま `SitemapStream` コンストラクタに渡されます。詳しくは [`sitemap` のドキュメント](https://www.npmjs.com/package/sitemap#options-you-can-pass) を参照してください。例:
```ts ```ts
export default { export default {
sitemap: { sitemap: {
hostname: 'https://example.com', hostname: 'https://example.com',
lastmodDateOnly: false lastmodDateOnly: false
} }
} }
``` ```
設定で `base` を使っている場合は、`hostname` にもそれを付与してください: 設定で `base` を使っている場合は、`hostname` にもそれを付与してください:
```ts ```ts
export default { export default {
base: '/my-site/', base: '/my-site/',
sitemap: { sitemap: {
hostname: 'https://example.com/my-site/' hostname: 'https://example.com/my-site/'
} }
} }
``` ```
## `transformItems` フック {#transformitems-hook} ## `transformItems` フック {#transformitems-hook}
`siteamp.xml` に書き出す直前にサイトマップ項目を加工するには、`sitemap.transformItems` フックを使います。このフックはサイトマップ項目の配列を受け取り、配列を返す必要があります。例: `siteamp.xml` に書き出す直前にサイトマップ項目を加工するには、`sitemap.transformItems` フックを使います。このフックはサイトマップ項目の配列を受け取り、配列を返す必要があります。例:
```ts ```ts
export default { export default {
sitemap: { sitemap: {
hostname: 'https://example.com', hostname: 'https://example.com',
transformItems: (items) => { transformItems: (items) => {
// 既存項目の追加・変更・フィルタリングが可能 // 既存項目の追加・変更・フィルタリングが可能
items.push({ items.push({
url: '/extra-page', url: '/extra-page',
changefreq: 'monthly', changefreq: 'monthly',
priority: 0.8 priority: 0.8
}) })
return items return items
} }
} }
} }
``` ```

@ -12,11 +12,11 @@ VitePress は本番ビルド時に、Node.js 上で Vue のサーバーサイド
SSR に適さないコンポーネント(例:カスタムディレクティブを含むなど)を使用・デモする場合は、組み込みの `<ClientOnly>` コンポーネントでラップできます。 SSR に適さないコンポーネント(例:カスタムディレクティブを含むなど)を使用・デモする場合は、組み込みの `<ClientOnly>` コンポーネントでラップできます。
```md ```md
<ClientOnly> <ClientOnly>
<NonSSRFriendlyComponent /> <NonSSRFriendlyComponent />
</ClientOnly> </ClientOnly>
``` ```
## インポート時に Browser API にアクセスするライブラリ {#libraries-that-access-browser-api-on-import} ## インポート時に Browser API にアクセスするライブラリ {#libraries-that-access-browser-api-on-import}
@ -24,112 +24,112 @@ SSR に適さないコンポーネント(例:カスタムディレクティ
### mounted フック内でのインポート {#importing-in-mounted-hook} ### mounted フック内でのインポート {#importing-in-mounted-hook}
```vue ```vue
<script setup> <script setup>
import { onMounted } from 'vue' import { onMounted } from 'vue'
onMounted(() => { onMounted(() => {
import('./lib-that-access-window-on-import').then((module) => { import('./lib-that-access-window-on-import').then((module) => {
// ここでコードを利用 // ここでコードを利用
}) })
}) })
</script> </script>
``` ```
### 条件付きインポート {#conditional-import} ### 条件付きインポート {#conditional-import}
[`import.meta.env.SSR`](https://vitejs.dev/guide/env-and-mode.html#env-variables) フラグVite の環境変数の一部)を使って、依存関係を条件付きでインポートすることもできます。 [`import.meta.env.SSR`](https://vitejs.dev/guide/env-and-mode.html#env-variables) フラグVite の環境変数の一部)を使って、依存関係を条件付きでインポートすることもできます。
```js ```js
if (!import.meta.env.SSR) { if (!import.meta.env.SSR) {
import('./lib-that-access-window-on-import').then((module) => { import('./lib-that-access-window-on-import').then((module) => {
// ここでコードを利用 // ここでコードを利用
}) })
} }
``` ```
[`Theme.enhanceApp`](./custom-theme#theme-interface) は非同期にできるため、**インポート時に Browser API に触れる Vue プラグイン** を条件付きでインポート・登録できます。 [`Theme.enhanceApp`](./custom-theme#theme-interface) は非同期にできるため、**インポート時に Browser API に触れる Vue プラグイン** を条件付きでインポート・登録できます。
```js [.vitepress/theme/index.js] ```js [.vitepress/theme/index.js]
/** @type {import('vitepress').Theme} */ /** @type {import('vitepress').Theme} */
export default { export default {
// ... // ...
async enhanceApp({ app }) { async enhanceApp({ app }) {
if (!import.meta.env.SSR) { if (!import.meta.env.SSR) {
const plugin = await import('plugin-that-access-window-on-import') const plugin = await import('plugin-that-access-window-on-import')
app.use(plugin.default) app.use(plugin.default)
} }
} }
} }
``` ```
TypeScript を使う場合: TypeScript を使う場合:
```ts [.vitepress/theme/index.ts] ```ts [.vitepress/theme/index.ts]
import type { Theme } from 'vitepress' import type { Theme } from 'vitepress'
export default { export default {
// ... // ...
async enhanceApp({ app }) { async enhanceApp({ app }) {
if (!import.meta.env.SSR) { if (!import.meta.env.SSR) {
const plugin = await import('plugin-that-access-window-on-import') const plugin = await import('plugin-that-access-window-on-import')
app.use(plugin.default) app.use(plugin.default)
} }
} }
} satisfies Theme } satisfies Theme
``` ```
### `defineClientComponent` ### `defineClientComponent`
VitePress は、**インポート時に Browser API にアクセスする Vue コンポーネント** を読み込むためのユーティリティを提供します。 VitePress は、**インポート時に Browser API にアクセスする Vue コンポーネント** を読み込むためのユーティリティを提供します。
```vue ```vue
<script setup> <script setup>
import { defineClientComponent } from 'vitepress' import { defineClientComponent } from 'vitepress'
const ClientComp = defineClientComponent(() => { const ClientComp = defineClientComponent(() => {
return import('component-that-access-window-on-import') return import('component-that-access-window-on-import')
}) })
</script> </script>
<template> <template>
<ClientComp /> <ClientComp />
</template> </template>
``` ```
ターゲットコンポーネントに props / children / slots を渡すこともできます。 ターゲットコンポーネントに props / children / slots を渡すこともできます。
```vue ```vue
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
import { defineClientComponent } from 'vitepress' import { defineClientComponent } from 'vitepress'
const clientCompRef = ref(null) const clientCompRef = ref(null)
const ClientComp = defineClientComponent( const ClientComp = defineClientComponent(
() => import('component-that-access-window-on-import'), () => import('component-that-access-window-on-import'),
// 引数は h() に渡されます - https://vuejs.org/api/render-function.html#h // 引数は h() に渡されます - https://vuejs.org/api/render-function.html#h
[ [
{ {
ref: clientCompRef ref: clientCompRef
}, },
{ {
default: () => 'default slot', default: () => 'default slot',
foo: () => h('div', 'foo'), foo: () => h('div', 'foo'),
bar: () => [h('span', 'one'), h('span', 'two')] bar: () => [h('span', 'one'), h('span', 'two')]
} }
], ],
// コンポーネント読み込み後のコールバック(非同期可) // コンポーネント読み込み後のコールバック(非同期可)
() => { () => {
console.log(clientCompRef.value) console.log(clientCompRef.value)
} }
) )
</script> </script>
<template> <template>
<ClientComp /> <ClientComp />
</template> </template>
``` ```
ターゲットコンポーネントは、ラッパーコンポーネントの mounted フックで初めてインポートされます。 ターゲットコンポーネントは、ラッパーコンポーネントの mounted フックで初めてインポートされます。

@ -16,9 +16,9 @@ Vue の使用は SSR 互換である必要があります。詳細と一般的
**入力** **入力**
```md ```md
{{ 1 + 1 }} {{ 1 + 1 }}
``` ```
**出力** **出力**
@ -30,9 +30,9 @@ Vue の使用は SSR 互換である必要があります。詳細と一般的
**入力** **入力**
```html ```html
<span v-for="i in 3">{{ i }}</span> <span v-for="i in 3">{{ i }}</span>
``` ```
**出力** **出力**
@ -42,30 +42,30 @@ Vue の使用は SSR 互換である必要があります。詳細と一般的
Markdown ファイルのルート直下に置く `<script>``<style>` タグは、Vue の SFC と同様に動作します(`<script setup>` や `<style module>` などを含む)。大きな違いは `<template>` タグが無い点で、その他のルート直下のコンテンツは Markdown になることです。すべてのタグはフロントマターの**後**に配置してください。 Markdown ファイルのルート直下に置く `<script>``<style>` タグは、Vue の SFC と同様に動作します(`<script setup>` や `<style module>` などを含む)。大きな違いは `<template>` タグが無い点で、その他のルート直下のコンテンツは Markdown になることです。すべてのタグはフロントマターの**後**に配置してください。
```html ```md
--- ---
hello: world hello: world
--- ---
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
const count = ref(0) const count = ref(0)
</script> </script>
## Markdown コンテンツ ## Markdown コンテンツ
現在の値: {{ count }} 現在の値: {{ count }}
<button :class="$style.button" @click="count++">Increment</button> <button :class="$style.button" @click="count++">Increment</button>
<style module> <style module>
.button { .button {
color: red; color: red;
font-weight: bold; font-weight: bold;
} }
</style> </style>
``` ```
::: warning Markdown での `<style scoped>` は避ける ::: warning Markdown での `<style scoped>` は避ける
Markdown で `<style scoped>` を使うと、そのページ内のすべての要素に特殊な属性を付与する必要があり、ページサイズが大きく膨らみます。ページ単位でローカルスコープが必要な場合は `<style module>` を推奨します。 Markdown で `<style scoped>` を使うと、そのページ内のすべての要素に特殊な属性を付与する必要があり、ページサイズが大きく膨らみます。ページ単位でローカルスコープが必要な場合は `<style module>` を推奨します。
@ -75,26 +75,26 @@ VitePress のランタイム API現在ページのメタデータにア
**入力** **入力**
```html ```md
<script setup> <script setup>
import { useData } from 'vitepress' import { useData } from 'vitepress'
const { page } = useData() const { page } = useData()
</script> </script>
<pre>{{ page }}</pre> <pre>{{ page }}</pre>
``` ```
**出力** **出力**
```json ```json
{ {
"path": "/using-vue.html", "path": "/using-vue.html",
"title": "Using Vue in Markdown", "title": "Using Vue in Markdown",
"frontmatter": {}, "frontmatter": {},
... ...
} }
``` ```
## コンポーネントの利用 {#using-components} ## コンポーネントの利用 {#using-components}
@ -104,21 +104,21 @@ Markdown ファイルで、Vue コンポーネントを直接インポートし
特定のページでしか使わないコンポーネントは、そのページで明示的にインポートするのがおすすめです。これにより適切にコード分割され、該当ページでのみ読み込まれます。 特定のページでしか使わないコンポーネントは、そのページで明示的にインポートするのがおすすめです。これにより適切にコード分割され、該当ページでのみ読み込まれます。
```md ```md
<script setup> <script setup>
import CustomComponent from '../components/CustomComponent.vue' import CustomComponent from '../components/CustomComponent.vue'
</script> </script>
# ドキュメント # ドキュメント
これはカスタムコンポーネントを使う .md です これはカスタムコンポーネントを使う .md です
<CustomComponent /> <CustomComponent />
## 続き ## 続き
... ...
``` ```
### グローバル登録 {#registering-components-globally} ### グローバル登録 {#registering-components-globally}
@ -132,10 +132,10 @@ Markdown ファイルで、Vue コンポーネントを直接インポートし
見出し内で Vue コンポーネントを使うこともできますが、次の書き方の違いに注意してください。 見出し内で Vue コンポーネントを使うこともできますが、次の書き方の違いに注意してください。
| Markdown | 出力 HTML | 解析される見出し | | Markdown | 出力 HTML | 解析される見出し |
| ------------------------------------------------------- | ------------------------------------------- | --------------- | | ------------------------------------------------------- | ----------------------------------------- | ---------------- |
| <pre v-pre><code> # text &lt;Tag/&gt; </code></pre> | `<h1>text <Tag/></h1>` | `text` | | <pre v-pre><code> # text &lt;Tag/&gt; </code></pre> | `<h1>text <Tag/></h1>` | `text` |
| <pre v-pre><code> # text \`&lt;Tag/&gt;\` </code></pre> | `<h1>text <code>&lt;Tag/&gt;</code></h1>` | `text <Tag/>` | | <pre v-pre><code> # text \`&lt;Tag/&gt;\` </code></pre> | `<h1>text <code>&lt;Tag/&gt;</code></h1>` | `text <Tag/>` |
`<code>` に包まれた HTML はそのまま表示されます。包まれて**いない** HTML だけが Vue によってパースされます。 `<code>` に包まれた HTML はそのまま表示されます。包まれて**いない** HTML だけが Vue によってパースされます。
@ -149,9 +149,9 @@ Markdown ファイルで、Vue コンポーネントを直接インポートし
**入力** **入力**
```md ```md
This <span v-pre>{{ will be displayed as-is }}</span> This <span v-pre>{{ will be displayed as-is }}</span>
``` ```
**出力** **出力**
@ -161,19 +161,19 @@ Markdown ファイルで、Vue コンポーネントを直接インポートし
段落全体を `v-pre` のカスタムコンテナで囲む方法もあります。 段落全体を `v-pre` のカスタムコンテナで囲む方法もあります。
```md ```md
::: v-pre ::: v-pre
{{ This will be displayed as-is }} {{ This will be displayed as-is }}
::: :::
``` ```
**出力** **出力**
<div class="escape-demo"> <div class="escape-demo">
::: v-pre ::: v-pre
{{ This will be displayed as-is }} {{ This will be displayed as-is }}
::: :::
</div> </div>
@ -183,17 +183,17 @@ Markdown ファイルで、Vue コンポーネントを直接インポートし
**入力** **入力**
````md ````md
```js-vue ```js-vue
Hello {{ 1 + 1 }} Hello {{ 1 + 1 }}
``` ```
```` ````
**出力** **出力**
```js-vue ```js-vue
Hello {{ 1 + 1 }} Hello {{ 1 + 1 }}
``` ```
この方法では、一部のトークンが正しくシンタックスハイライトされない場合があります。 この方法では、一部のトークンが正しくシンタックスハイライトされない場合があります。
@ -201,25 +201,25 @@ Markdown ファイルで、Vue コンポーネントを直接インポートし
VitePress は CSS プリプロセッサ(`.scss`、`.sass`、`.less`、`.styl`、`.stylus`)を[標準サポート](https://vitejs.dev/guide/features.html#css-pre-processors)しています。Vite 固有のプラグインは不要ですが、各プリプロセッサ本体のインストールは必要です。 VitePress は CSS プリプロセッサ(`.scss`、`.sass`、`.less`、`.styl`、`.stylus`)を[標準サポート](https://vitejs.dev/guide/features.html#css-pre-processors)しています。Vite 固有のプラグインは不要ですが、各プリプロセッサ本体のインストールは必要です。
``` ```
# .scss / .sass # .scss / .sass
npm install -D sass npm install -D sass
# .less # .less
npm install -D less npm install -D less
# .styl / .stylus # .styl / .stylus
npm install -D stylus npm install -D stylus
``` ```
その後、Markdown やテーマコンポーネントで次のように使えます。 その後、Markdown やテーマコンポーネントで次のように使えます。
```vue ```vue
<style lang="sass"> <style lang="sass">
.title .title
font-size: 20px font-size: 20px
</style> </style>
``` ```
## Teleport の利用 {#using-teleports} ## Teleport の利用 {#using-teleports}
@ -231,15 +231,15 @@ VitePress は CSS プリプロセッサ(`.scss`、`.sass`、`.less`、`.styl`
<<< @/components/ModalDemo.vue <<< @/components/ModalDemo.vue
::: :::
```md ```md
<ClientOnly> <ClientOnly>
<Teleport to="#modal"> <Teleport to="#modal">
<div> <div>
// ... // ...
</div> </div>
</Teleport> </Teleport>
</ClientOnly> </ClientOnly>
``` ```
<script setup> <script setup>
import ModalDemo from '../../components/ModalDemo.vue' import ModalDemo from '../../components/ModalDemo.vue'
@ -262,27 +262,27 @@ Vue は [Vue - Official VS Code plugin](https://marketplace.visualstudio.com/ite
1. tsconfig/jsconfig の `include``vueCompilerOptions.vitePressExtensions``.md` パターンを追加します。 1. tsconfig/jsconfig の `include``vueCompilerOptions.vitePressExtensions``.md` パターンを追加します。
::: code-group ::: code-group
```json [tsconfig.json] ```json [tsconfig.json]
{ {
"include": [ "include": [
"docs/**/*.ts", "docs/**/*.ts",
"docs/**/*.vue", "docs/**/*.vue",
"docs/**/*.md", "docs/**/*.md"
], ],
"vueCompilerOptions": { "vueCompilerOptions": {
"vitePressExtensions": [".md"], "vitePressExtensions": [".md"]
}, }
} }
``` ```
::: :::
2. VS Code の設定で、`vue.server.includeLanguages` に `markdown` を追加します。 2. VS Code の設定で、`vue.server.includeLanguages` に `markdown` を追加します。
::: code-group ::: code-group
```json [.vscode/settings.json] ```json [.vscode/settings.json]
{ {
"vue.server.includeLanguages": ["vue", "markdown"] "vue.server.includeLanguages": ["vue", "markdown"]
} }
``` ```
::: :::

@ -6,24 +6,24 @@
### 使い方 {#usage} ### 使い方 {#usage}
```sh ```sh
# カレントディレクトリで起動(`dev` を省略) # カレントディレクトリで起動(`dev` を省略)
vitepress vitepress
# サブディレクトリで起動 # サブディレクトリで起動
vitepress dev [root] vitepress dev [root]
``` ```
### オプション {#options} ### オプション {#options}
| オプション | 説明 | | オプション | 説明 |
| ------------------ | -------------------------------------------------------------------- | | --------------- | ----------------------------------------------------- |
| `--open [path]` | 起動時にブラウザを開く(`boolean \| string` | | `--open [path]` | 起動時にブラウザを開く(`boolean \| string` |
| `--port <port>` | ポート番号を指定(`number` | | `--port <port>` | ポート番号を指定(`number` |
| `--base <path>` | 公開時のベースパス(既定: `/``string` | | `--base <path>` | 公開時のベースパス(既定: `/``string` |
| `--cors` | CORS を有効化 | | `--cors` | CORS を有効化 |
| `--strictPort` | 指定ポートが使用中なら終了(`boolean` | | `--strictPort` | 指定ポートが使用中なら終了(`boolean` |
| `--force` | 最適化時にキャッシュを無視して再バンドル(`boolean` | | `--force` | 最適化時にキャッシュを無視して再バンドル(`boolean` |
## `vitepress build` ## `vitepress build`
@ -31,19 +31,19 @@
### 使い方 {#usage-1} ### 使い方 {#usage-1}
```sh ```sh
vitepress build [root] vitepress build [root]
``` ```
### オプション {#options-1} ### オプション {#options-1}
| オプション | 説明 | | オプション | 説明 |
| ----------------------------- | -------------------------------------------------------------------------------------------------- | | ------------------------------ | ------------------------------------------------------------------------------------------ |
| `--mpa`(実験的) | クライアント側ハイドレーションなしの [MPA モード](../guide/mpa-mode) でビルド(`boolean` | | `--mpa`(実験的) | クライアント側ハイドレーションなしの [MPA モード](../guide/mpa-mode) でビルド(`boolean` |
| `--base <path>` | 公開時のベースパス(既定: `/``string` | | `--base <path>` | 公開時のベースパス(既定: `/``string` |
| `--target <target>` | トランスパイルターゲット(既定: `"modules"``string` | | `--target <target>` | トランスパイルターゲット(既定: `"modules"``string` |
| `--outDir <dir>` | 出力先ディレクトリ(**cwd** からの相対)(既定: `<root>/.vitepress/dist``string` | | `--outDir <dir>` | 出力先ディレクトリ(**cwd** からの相対)(既定: `<root>/.vitepress/dist``string` |
| `--assetsInlineLimit <number>`| 静的アセットを base64 インライン化する閾値(バイト)(既定: `4096``number` | | `--assetsInlineLimit <number>` | 静的アセットを base64 インライン化する閾値(バイト)(既定: `4096``number` |
## `vitepress preview` ## `vitepress preview`
@ -51,16 +51,16 @@
### 使い方 {#usage-2} ### 使い方 {#usage-2}
```sh ```sh
vitepress preview [root] vitepress preview [root]
``` ```
### オプション {#options-2} ### オプション {#options-2}
| オプション | 説明 | | オプション | 説明 |
| ------------------ | ----------------------------------------- | | --------------- | ------------------------------------------- |
| `--base <path>` | 公開時のベースパス(既定: `/``string` | | `--base <path>` | 公開時のベースパス(既定: `/``string` |
| `--port <port>` | ポート番号を指定(`number` | | `--port <port>` | ポート番号を指定(`number` |
## `vitepress init` ## `vitepress init`
@ -68,6 +68,6 @@
### 使い方 {#usage-3} ### 使い方 {#usage-3}
```sh ```sh
vitepress init vitepress init
``` ```

@ -6,12 +6,12 @@
グローバルに利用可能な `Badge` コンポーネントを使用します。 グローバルに利用可能な `Badge` コンポーネントを使用します。
```html ```md
### Title <Badge type="info" text="default" /> ### Title <Badge type="info" text="default" />
### Title <Badge type="tip" text="^1.9.0" /> ### Title <Badge type="tip" text="^1.9.0" />
### Title <Badge type="warning" text="beta" /> ### Title <Badge type="warning" text="beta" />
### Title <Badge type="danger" text="caution" /> ### Title <Badge type="danger" text="caution" />
``` ```
上記のコードは次のように表示されます: 上記のコードは次のように表示されます:
@ -24,9 +24,9 @@
`<Badge>` は子要素(`children`)を受け取り、バッジ内に表示できます。 `<Badge>` は子要素(`children`)を受け取り、バッジ内に表示できます。
```html ```md
### Title <Badge type="info">custom element</Badge> ### Title <Badge type="info">custom element</Badge>
``` ```
### Title <Badge type="info">custom element</Badge> ### Title <Badge type="info">custom element</Badge>
@ -34,36 +34,36 @@
CSS 変数を上書きすることで、バッジのスタイルをカスタマイズできます。以下はデフォルト値です: CSS 変数を上書きすることで、バッジのスタイルをカスタマイズできます。以下はデフォルト値です:
```css ```css
:root { :root {
--vp-badge-info-border: transparent; --vp-badge-info-border: transparent;
--vp-badge-info-text: var(--vp-c-text-2); --vp-badge-info-text: var(--vp-c-text-2);
--vp-badge-info-bg: var(--vp-c-default-soft); --vp-badge-info-bg: var(--vp-c-default-soft);
--vp-badge-tip-border: transparent; --vp-badge-tip-border: transparent;
--vp-badge-tip-text: var(--vp-c-brand-1); --vp-badge-tip-text: var(--vp-c-brand-1);
--vp-badge-tip-bg: var(--vp-c-brand-soft); --vp-badge-tip-bg: var(--vp-c-brand-soft);
--vp-badge-warning-border: transparent; --vp-badge-warning-border: transparent;
--vp-badge-warning-text: var(--vp-c-warning-1); --vp-badge-warning-text: var(--vp-c-warning-1);
--vp-badge-warning-bg: var(--vp-c-warning-soft); --vp-badge-warning-bg: var(--vp-c-warning-soft);
--vp-badge-danger-border: transparent; --vp-badge-danger-border: transparent;
--vp-badge-danger-text: var(--vp-c-danger-1); --vp-badge-danger-text: var(--vp-c-danger-1);
--vp-badge-danger-bg: var(--vp-c-danger-soft); --vp-badge-danger-bg: var(--vp-c-danger-soft);
} }
``` ```
## `<Badge>` ## `<Badge>`
`<Badge>` コンポーネントは次の props を受け取ります。 `<Badge>` コンポーネントは次の props を受け取ります。
```ts ```ts
interface Props { interface Props {
// `<slot>` が渡された場合、この値は無視されます。 // `<slot>` が渡された場合、この値は無視されます。
text?: string text?: string
// 既定値は `tip` // 既定値は `tip`
type?: 'info' | 'tip' | 'warning' | 'danger' type?: 'info' | 'tip' | 'warning' | 'danger'
} }
``` ```

@ -2,21 +2,21 @@
VitePress は [Carbon Ads](https://www.carbonads.net/) をネイティブにサポートしています。設定で Carbon Ads の認証情報を定義すると、ページ上に広告が表示されます。 VitePress は [Carbon Ads](https://www.carbonads.net/) をネイティブにサポートしています。設定で Carbon Ads の認証情報を定義すると、ページ上に広告が表示されます。
```js ```js
export default { export default {
themeConfig: { themeConfig: {
carbonAds: { carbonAds: {
code: 'your-carbon-code', code: 'your-carbon-code',
placement: 'your-carbon-placement' placement: 'your-carbon-placement'
} }
} }
} }
``` ```
これらの値は、次のように Carbon の CDN スクリプトを呼び出すために使用されます。 これらの値は、次のように Carbon の CDN スクリプトを呼び出すために使用されます。
```js ```js
`//cdn.carbonads.com/carbon.js?serve=${code}&placement=${placement}` `//cdn.carbonads.com/carbon.js?serve=${code}&placement=${placement}`
``` ```
Carbon Ads の設定について詳しくは、[Carbon Ads のウェブサイト](https://www.carbonads.net/)を参照してください。 Carbon Ads の設定について詳しくは、[Carbon Ads のウェブサイト](https://www.carbonads.net/)を参照してください。

@ -2,20 +2,20 @@
テーマ設定では、テーマのカスタマイズができます。設定ファイルの `themeConfig` オプションで定義します。 テーマ設定では、テーマのカスタマイズができます。設定ファイルの `themeConfig` オプションで定義します。
```ts ```ts
export default { export default {
lang: 'en-US', lang: 'en-US',
title: 'VitePress', title: 'VitePress',
description: 'Vite & Vue powered static site generator.', description: 'Vite & Vue powered static site generator.',
// テーマ関連の設定 // テーマ関連の設定
themeConfig: { themeConfig: {
logo: '/logo.svg', logo: '/logo.svg',
nav: [...], nav: [...],
sidebar: { ... } sidebar: { ... }
} }
} }
``` ```
**このページで説明するオプションは、デフォルトテーマにのみ適用されます。** テーマによって期待する設定は異なります。カスタムテーマを使用する場合、ここで定義したテーマ設定オブジェクトはテーマへ渡され、テーマ側がそれに基づいて条件付きの挙動を定義できます。 **このページで説明するオプションは、デフォルトテーマにのみ適用されます。** テーマによって期待する設定は異なります。カスタムテーマを使用する場合、ここで定義したテーマ設定オブジェクトはテーマへ渡され、テーマ側がそれに基づいて条件付きの挙動を定義できます。
@ -31,20 +31,20 @@
サイトタイトルの直前に、ナビゲーションバーに表示されるロゴ。パス文字列、またはライト/ダークモードで異なるロゴを設定するオブジェクトを受け取ります。 サイトタイトルの直前に、ナビゲーションバーに表示されるロゴ。パス文字列、またはライト/ダークモードで異なるロゴを設定するオブジェクトを受け取ります。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
logo: '/logo.svg' logo: '/logo.svg'
} }
} }
``` ```
```ts ```ts
type ThemeableImage = type ThemeableImage =
| string | string
| { src: string; alt?: string } | { src: string; alt?: string }
| { light: string; dark: string; alt?: string } | { light: string; dark: string; alt?: string }
``` ```
## siteTitle ## siteTitle
@ -52,13 +52,13 @@
ナビゲーション内の既定サイトタイトル(アプリ設定の `title`)を置き換えます。`false` の場合、ナビのタイトルを非表示にします。ロゴ自体にサイト名が含まれている場合に便利です。 ナビゲーション内の既定サイトタイトル(アプリ設定の `title`)を置き換えます。`false` の場合、ナビのタイトルを非表示にします。ロゴ自体にサイト名が含まれている場合に便利です。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
siteTitle: 'Hello World' siteTitle: 'Hello World'
} }
} }
``` ```
## nav ## nav
@ -66,47 +66,47 @@
ナビゲーションメニューの設定。[デフォルトテーマ: ナビ](./default-theme-nav#navigation-links) を参照してください。 ナビゲーションメニューの設定。[デフォルトテーマ: ナビ](./default-theme-nav#navigation-links) を参照してください。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
nav: [ nav: [
{ text: 'Guide', link: '/guide' }, { text: 'Guide', link: '/guide' },
{ {
text: 'Dropdown Menu', text: 'Dropdown Menu',
items: [ items: [
{ text: 'Item A', link: '/item-1' }, { text: 'Item A', link: '/item-1' },
{ text: 'Item B', link: '/item-2' }, { text: 'Item B', link: '/item-2' },
{ text: 'Item C', link: '/item-3' } { text: 'Item C', link: '/item-3' }
] ]
} }
] ]
} }
} }
``` ```
```ts ```ts
type NavItem = NavItemWithLink | NavItemWithChildren type NavItem = NavItemWithLink | NavItemWithChildren
interface NavItemWithLink { interface NavItemWithLink {
text: string text: string
link: string | ((payload: PageData) => string) link: string | ((payload: PageData) => string)
activeMatch?: string activeMatch?: string
target?: string target?: string
rel?: string rel?: string
noIcon?: boolean noIcon?: boolean
} }
interface NavItemChildren { interface NavItemChildren {
text?: string text?: string
items: NavItemWithLink[] items: NavItemWithLink[]
} }
interface NavItemWithChildren { interface NavItemWithChildren {
text?: string text?: string
items: (NavItemChildren | NavItemWithLink)[] items: (NavItemChildren | NavItemWithLink)[]
activeMatch?: string activeMatch?: string
} }
``` ```
## sidebar ## sidebar
@ -114,69 +114,69 @@
サイドバーメニューの設定。[デフォルトテーマ: サイドバー](./default-theme-sidebar) を参照してください。 サイドバーメニューの設定。[デフォルトテーマ: サイドバー](./default-theme-sidebar) を参照してください。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
sidebar: [ sidebar: [
{ {
text: 'Guide', text: 'Guide',
items: [ items: [
{ text: 'Introduction', link: '/introduction' }, { text: 'Introduction', link: '/introduction' },
{ text: 'Getting Started', link: '/getting-started' }, { text: 'Getting Started', link: '/getting-started' },
... ...
] ]
} }
] ]
} }
} }
``` ```
```ts ```ts
export type Sidebar = SidebarItem[] | SidebarMulti export type Sidebar = SidebarItem[] | SidebarMulti
export interface SidebarMulti { export interface SidebarMulti {
[path: string]: SidebarItem[] | { items: SidebarItem[]; base: string } [path: string]: SidebarItem[] | { items: SidebarItem[]; base: string }
} }
export type SidebarItem = { export type SidebarItem = {
/** /**
* 項目のテキストラベル * 項目のテキストラベル
*/ */
text?: string text?: string
/** /**
* 項目のリンク * 項目のリンク
*/ */
link?: string link?: string
/** /**
* 子項目 * 子項目
*/ */
items?: SidebarItem[] items?: SidebarItem[]
/** /**
* 指定しない場合、グループは折りたたみ不可。 * 指定しない場合、グループは折りたたみ不可。
* *
* `true` なら折りたたみ可能でデフォルト折りたたみ * `true` なら折りたたみ可能でデフォルト折りたたみ
* *
* `false` なら折りたたみ可能だがデフォルト展開 * `false` なら折りたたみ可能だがデフォルト展開
*/ */
collapsed?: boolean collapsed?: boolean
/** /**
* 子項目のベースパス * 子項目のベースパス
*/ */
base?: string base?: string
/** /**
* 前/次リンクのフッターに表示するテキストをカスタマイズ * 前/次リンクのフッターに表示するテキストをカスタマイズ
*/ */
docFooterText?: string docFooterText?: string
rel?: string rel?: string
target?: string target?: string
} }
``` ```
## aside ## aside
@ -197,26 +197,26 @@
`false` でアウトラインコンテナの描画を無効化。詳細は以下を参照: `false` でアウトラインコンテナの描画を無効化。詳細は以下を参照:
```ts ```ts
interface Outline { interface Outline {
/** /**
* アウトラインに表示する見出しレベル * アウトラインに表示する見出しレベル
* 単一の数値なら、そのレベルのみ表示 * 単一の数値なら、そのレベルのみ表示
* タプルなら最小レベルと最大レベル * タプルなら最小レベルと最大レベル
* `'deep'``[2, 6]` と同じ(`<h2>` 〜 `<h6>` を表示) * `'deep'``[2, 6]` と同じ(`<h2>` 〜 `<h6>` を表示)
* *
* @default 2 * @default 2
*/ */
level?: number | [number, number] | 'deep' level?: number | [number, number] | 'deep'
/** /**
* アウトラインに表示するタイトル * アウトラインに表示するタイトル
* *
* @default 'On this page' * @default 'On this page'
*/ */
label?: string label?: string
} }
``` ```
## socialLinks ## socialLinks
@ -224,34 +224,34 @@
ナビゲーションにアイコン付きのソーシャルリンクを表示します。 ナビゲーションにアイコン付きのソーシャルリンクを表示します。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
socialLinks: [ socialLinks: [
// simple-icons (https://simpleicons.org/) の任意のアイコンを指定可能 // simple-icons (https://simpleicons.org/) の任意のアイコンを指定可能
{ icon: 'github', link: 'https://github.com/vuejs/vitepress' }, { icon: 'github', link: 'https://github.com/vuejs/vitepress' },
{ icon: 'twitter', link: '...' }, { icon: 'twitter', link: '...' },
// SVG 文字列を渡してカスタムアイコンも可 // SVG 文字列を渡してカスタムアイコンも可
{ {
icon: { icon: {
svg: '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Dribbble</title><path d="M12...6.38z"/></svg>' svg: '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Dribbble</title><path d="M12...6.38z"/></svg>'
}, },
link: '...', link: '...',
// アクセシビリティ向けにカスタムラベルも指定可(推奨) // アクセシビリティ向けにカスタムラベルも指定可(推奨)
ariaLabel: 'cool link' ariaLabel: 'cool link'
} }
] ]
} }
} }
``` ```
```ts ```ts
interface SocialLink { interface SocialLink {
icon: string | { svg: string } icon: string | { svg: string }
link: string link: string
ariaLabel?: string ariaLabel?: string
} }
``` ```
## footer ## footer
@ -260,23 +260,23 @@
フッター設定。メッセージや著作権表示を追加できますが、ページにサイドバーがある場合はデザイン上表示されません。 フッター設定。メッセージや著作権表示を追加できますが、ページにサイドバーがある場合はデザイン上表示されません。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
footer: { footer: {
message: 'Released under the MIT License.', message: 'Released under the MIT License.',
copyright: 'Copyright © 2019-present Evan You' copyright: 'Copyright © 2019-present Evan You'
} }
} }
} }
``` ```
```ts ```ts
export interface Footer { export interface Footer {
message?: string message?: string
copyright?: string copyright?: string
} }
``` ```
## editLink ## editLink
@ -285,23 +285,23 @@
「このページを編集」リンクを表示しますGitHub/GitLab など)。詳細は [デフォルトテーマ: 編集リンク](./default-theme-edit-link) を参照。 「このページを編集」リンクを表示しますGitHub/GitLab など)。詳細は [デフォルトテーマ: 編集リンク](./default-theme-edit-link) を参照。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
editLink: { editLink: {
pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path',
text: 'Edit this page on GitHub' text: 'Edit this page on GitHub'
} }
} }
} }
``` ```
```ts ```ts
export interface EditLink { export interface EditLink {
pattern: string pattern: string
text?: string text?: string
} }
``` ```
## lastUpdated ## lastUpdated
@ -309,34 +309,34 @@
最終更新の文言と日付フォーマットをカスタマイズします。 最終更新の文言と日付フォーマットをカスタマイズします。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
lastUpdated: { lastUpdated: {
text: 'Updated at', text: 'Updated at',
formatOptions: { formatOptions: {
dateStyle: 'full', dateStyle: 'full',
timeStyle: 'medium' timeStyle: 'medium'
} }
} }
} }
} }
``` ```
```ts ```ts
export interface LastUpdatedOptions { export interface LastUpdatedOptions {
/** /**
* @default 'Last updated' * @default 'Last updated'
*/ */
text?: string text?: string
/** /**
* @default * @default
* { dateStyle: 'short', timeStyle: 'short' } * { dateStyle: 'short', timeStyle: 'short' }
*/ */
formatOptions?: Intl.DateTimeFormatOptions & { forceLocale?: boolean } formatOptions?: Intl.DateTimeFormatOptions & { forceLocale?: boolean }
} }
``` ```
## algolia ## algolia
@ -344,11 +344,11 @@
[Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch) によるサイト内検索の設定。[デフォルトテーマ: 検索](./default-theme-search) を参照。 [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch) によるサイト内検索の設定。[デフォルトテーマ: 検索](./default-theme-search) を参照。
```ts ```ts
export interface AlgoliaSearchOptions extends DocSearchProps { export interface AlgoliaSearchOptions extends DocSearchProps {
locales?: Record<string, Partial<DocSearchProps>> locales?: Record<string, Partial<DocSearchProps>>
} }
``` ```
完全なオプションは[こちら](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts)。 完全なオプションは[こちら](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts)。
@ -358,23 +358,23 @@
[Carbon Ads](https://www.carbonads.net/) を表示します。 [Carbon Ads](https://www.carbonads.net/) を表示します。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
carbonAds: { carbonAds: {
code: 'your-carbon-code', code: 'your-carbon-code',
placement: 'your-carbon-placement' placement: 'your-carbon-placement'
} }
} }
} }
``` ```
```ts ```ts
export interface CarbonAdsOptions { export interface CarbonAdsOptions {
code: string code: string
placement: string placement: string
} }
``` ```
詳細は [デフォルトテーマ: Carbon Ads](./default-theme-carbon-ads) を参照。 詳細は [デフォルトテーマ: Carbon Ads](./default-theme-carbon-ads) を参照。
@ -384,23 +384,23 @@
前/次リンクの上に表示される文言をカスタマイズします。英語以外のドキュメントで便利。前/次リンク自体をグローバルに無効化することも可能。ページごとに切り替えたい場合は [frontmatter](./default-theme-prev-next-links) を使用します。 前/次リンクの上に表示される文言をカスタマイズします。英語以外のドキュメントで便利。前/次リンク自体をグローバルに無効化することも可能。ページごとに切り替えたい場合は [frontmatter](./default-theme-prev-next-links) を使用します。
```ts ```ts
export default { export default {
themeConfig: { themeConfig: {
docFooter: { docFooter: {
prev: 'Pagina prior', prev: 'Pagina prior',
next: 'Proxima pagina' next: 'Proxima pagina'
} }
} }
} }
``` ```
```ts ```ts
export interface DocFooter { export interface DocFooter {
prev?: string | false prev?: string | false
next?: string | false next?: string | false
} }
``` ```
## darkModeSwitchLabel ## darkModeSwitchLabel
@ -462,33 +462,33 @@ Markdown 内の外部リンクの横に外部リンクアイコンを表示す
レイアウト関連のデータを返します。返り値の型は次のとおりです。 レイアウト関連のデータを返します。返り値の型は次のとおりです。
```ts ```ts
interface { interface {
isHome: ComputedRef<boolean> isHome: ComputedRef<boolean>
sidebar: Readonly<ShallowRef<DefaultTheme.SidebarItem[]>> sidebar: Readonly<ShallowRef<DefaultTheme.SidebarItem[]>>
sidebarGroups: ComputedRef<DefaultTheme.SidebarItem[]> sidebarGroups: ComputedRef<DefaultTheme.SidebarItem[]>
hasSidebar: ComputedRef<boolean> hasSidebar: ComputedRef<boolean>
isSidebarEnabled: ComputedRef<boolean> isSidebarEnabled: ComputedRef<boolean>
hasAside: ComputedRef<boolean> hasAside: ComputedRef<boolean>
leftAside: ComputedRef<boolean> leftAside: ComputedRef<boolean>
headers: Readonly<ShallowRef<DefaultTheme.OutlineItem[]>> headers: Readonly<ShallowRef<DefaultTheme.OutlineItem[]>>
hasLocalNav: ComputedRef<boolean> hasLocalNav: ComputedRef<boolean>
} }
``` ```
**例:** **例:**
```vue ```vue
<script setup> <script setup>
import { useLayout } from 'vitepress/theme' import { useLayout } from 'vitepress/theme'
const { hasSidebar } = useLayout() const { hasSidebar } = useLayout()
</script> </script>
<template> <template>
<div v-if="hasSidebar">サイドバーがあるときだけ表示</div> <div v-if="hasSidebar">サイドバーがあるときだけ表示</div>
</template> </template>
``` ```

@ -4,57 +4,57 @@
編集リンクは、GitHub や GitLab などの Git 管理サービスでそのページを編集できるリンクを表示します。有効化するには、設定に `themeConfig.editLink` オプションを追加します。 編集リンクは、GitHub や GitLab などの Git 管理サービスでそのページを編集できるリンクを表示します。有効化するには、設定に `themeConfig.editLink` オプションを追加します。
```js ```js
export default { export default {
themeConfig: { themeConfig: {
editLink: { editLink: {
pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path' pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path'
} }
} }
} }
``` ```
`pattern` オプションはリンクの URL 構造を定義します。`:path` はページパスに置き換えられます。 `pattern` オプションはリンクの URL 構造を定義します。`:path` はページパスに置き換えられます。
また、引数に [`PageData`](./runtime-api#usedata) を受け取り、URL 文字列を返す純粋関数を指定することもできます。 また、引数に [`PageData`](./runtime-api#usedata) を受け取り、URL 文字列を返す純粋関数を指定することもできます。
```js ```js
export default { export default {
themeConfig: { themeConfig: {
editLink: { editLink: {
pattern: ({ filePath }) => { pattern: ({ filePath }) => {
if (filePath.startsWith('packages/')) { if (filePath.startsWith('packages/')) {
return `https://github.com/acme/monorepo/edit/main/${filePath}` return `https://github.com/acme/monorepo/edit/main/${filePath}`
} else { } else {
return `https://github.com/acme/monorepo/edit/main/docs/${filePath}` return `https://github.com/acme/monorepo/edit/main/docs/${filePath}`
} }
} }
} }
} }
} }
``` ```
この関数はブラウザでシリアライズされ実行されるため、副作用を持たず、スコープ外のものへアクセスしないでください。 この関数はブラウザでシリアライズされ実行されるため、副作用を持たず、スコープ外のものへアクセスしないでください。
既定では、ドキュメント下部に「Edit this page」というリンクテキストが表示されます。`text` オプションでこの文言をカスタマイズできます。 既定では、ドキュメント下部に「Edit this page」というリンクテキストが表示されます。`text` オプションでこの文言をカスタマイズできます。
```js ```js
export default { export default {
themeConfig: { themeConfig: {
editLink: { editLink: {
pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path',
text: 'GitHub でこのページを編集' text: 'GitHub でこのページを編集'
} }
} }
} }
``` ```
## フロントマターでの設定 {#frontmatter-config} ## フロントマターでの設定 {#frontmatter-config}
ページごとに無効化するには、フロントマターで `editLink` オプションを使用します。 ページごとに無効化するには、フロントマターで `editLink` オプションを使用します。
```yaml ```yaml
--- ---
editLink: false editLink: false
--- ---
``` ```

@ -186,3 +186,4 @@ hero:
npm init npm init
npx vitepress init npx vitepress init
``` ```
````

@ -179,7 +179,7 @@ export default defineConfig({
async _render(src, env, md) { async _render(src, env, md) {
const html = await md.renderAsync(src, env) const html = await md.renderAsync(src, env)
if (env.frontmatter?.title) if (env.frontmatter?.title)
return await md.renderAsync(`# ${env.frontmatter.title}`) + html return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html
return html return html
} }
} }

@ -49,7 +49,7 @@ interface PageData {
titleTemplate?: string | boolean titleTemplate?: string | boolean
description: string description: string
relativePath: string relativePath: string
filePath: string, filePath: string
headers: Header[] headers: Header[]
frontmatter: Record<string, any> frontmatter: Record<string, any>
params?: Record<string, any> params?: Record<string, any>

@ -174,7 +174,7 @@ export default defineConfig({
async _render(src, env, md) { async _render(src, env, md) {
const html = await md.renderAsync(src, env) const html = await md.renderAsync(src, env)
if (env.frontmatter?.title) if (env.frontmatter?.title)
return await md.renderAsync(`# ${env.frontmatter.title}`) + html return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html
return html return html
} }
} }

@ -49,7 +49,7 @@ interface PageData {
titleTemplate?: string | boolean titleTemplate?: string | boolean
description: string description: string
relativePath: string relativePath: string
filePath: string, filePath: string
headers: Header[] headers: Header[]
frontmatter: Record<string, any> frontmatter: Record<string, any>
params?: Record<string, any> params?: Record<string, any>

@ -174,7 +174,7 @@ export default defineConfig({
async _render(src, env, md) { async _render(src, env, md) {
const html = await md.renderAsync(src, env) const html = await md.renderAsync(src, env)
if (env.frontmatter?.title) if (env.frontmatter?.title)
return await md.renderAsync(`# ${env.frontmatter.title}`) + html return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html
return html return html
} }
} }

@ -45,7 +45,7 @@ interface PageData {
titleTemplate?: string | boolean titleTemplate?: string | boolean
description: string description: string
relativePath: string relativePath: string
filePath: string, filePath: string
headers: Header[] headers: Header[]
frontmatter: Record<string, any> frontmatter: Record<string, any>
params?: Record<string, any> params?: Record<string, any>

@ -179,7 +179,7 @@ export default defineConfig({
async _render(src, env, md) { async _render(src, env, md) {
const html = await md.renderAsync(src, env) const html = await md.renderAsync(src, env)
if (env.frontmatter?.title) if (env.frontmatter?.title)
return await md.renderAsync(`# ${env.frontmatter.title}`) + html return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html
return html return html
} }
} }

@ -174,7 +174,7 @@ export default defineConfig({
async _render(src, env, md) { async _render(src, env, md) {
const html = await md.renderAsync(src, env) const html = await md.renderAsync(src, env)
if (env.frontmatter?.title) if (env.frontmatter?.title)
return await md.renderAsync(`# ${env.frontmatter.title}`) + html return (await md.renderAsync(`# ${env.frontmatter.title}`)) + html
return html return html
} }
} }

Loading…
Cancel
Save