Skip to content

VitePress Guide

Comprehensive guide to VitePress - the modern static site generator powered by Vite and Vue.

What is VitePress?

VitePress is a static site generator (SSG) designed to create fast, content-focused websites. Built on top of Vite and Vue.js, it combines the best of both worlds: the speed of Vite's development experience and the power of Vue's component system.

Key Features

  • Lightning Fast: Powered by Vite for instant hot module replacement
  • 📝 Markdown-Centered: Write content in Markdown with Vue component support
  • 🎨 Customizable: Flexible theming system with Vue.js
  • 🔍 Built-in Search: Local search functionality out of the box
  • 📱 Mobile Optimized: Responsive design that works on all devices
  • 🚀 Production Ready: Optimized builds with code splitting

Getting Started

Installation

bash
# Create a new project
mkdir my-vitepress-site
cd my-vitepress-site

# Initialize package.json
npm init -y

# Install VitePress
npm install -D vitepress

# Create your first document
mkdir docs
echo '# Hello VitePress' > docs/index.md

Basic Configuration

Create .vitepress/config.js:

js
export default {
  title: 'My VitePress Site',
  description: 'A VitePress site powered by Vite and Vue',
  
  themeConfig: {
    nav: [
      { text: 'Home', link: '/' },
      { text: 'Guide', link: '/guide/' }
    ],
    
    sidebar: [
      {
        text: 'Getting Started',
        items: [
          { text: 'Introduction', link: '/introduction' },
          { text: 'Installation', link: '/installation' }
        ]
      }
    ]
  }
}

Development Scripts

Add to your package.json:

json
{
  "scripts": {
    "docs:dev": "vitepress dev docs",
    "docs:build": "vitepress build docs",
    "docs:preview": "vitepress preview docs"
  }
}

Start Development Server

bash
npm run docs:dev

Core Concepts

File-Based Routing

VitePress uses file-based routing. Your file structure determines your site's URL structure:

docs/
├── index.md          → /
├── guide/
│   ├── index.md      → /guide/
│   └── advanced.md   → /guide/advanced
└── api/
    └── reference.md  → /api/reference

Frontmatter

Add metadata to your pages using YAML frontmatter:

markdown
---
title: Custom Page Title
description: Page description for SEO
layout: home
hero:
  name: VitePress
  text: Vite & Vue powered static site generator
  actions:
    - theme: brand
      text: Get Started
      link: /guide/
---

# Page Content

Your markdown content goes here.

Markdown Extensions

VitePress extends standard Markdown with powerful features:

Custom Containers

markdown
::: info
This is an info box.
:::

::: tip
This is a tip.
:::

::: warning
This is a warning.
:::

::: danger
This is a dangerous warning.
:::

::: details Click me to view the code
```js
console.log('Hello, VitePress!')

:::


#### Code Groups

```markdown
::: code-group

```js [config.js]
export default {
  title: 'VitePress'
}
ts
import { defineConfig } from 'vitepress'

export default defineConfig({
  title: 'VitePress'
})

:::


#### Line Highlighting

```markdown
```js {2,4-6}
export default {
  title: 'VitePress', // highlighted
  description: 'Vite & Vue powered static site generator',
  themeConfig: { // highlighted
    nav: [...] // highlighted
  } // highlighted
}

## Theme Customization

### Default Theme

VitePress comes with a beautiful default theme that you can customize:

```js
// .vitepress/config.js
export default {
  themeConfig: {
    logo: '/logo.svg',
    
    nav: [
      { text: 'Home', link: '/' },
      { text: 'Guide', link: '/guide/' },
      {
        text: 'Dropdown',
        items: [
          { text: 'Item A', link: '/item-a' },
          { text: 'Item B', link: '/item-b' }
        ]
      }
    ],
    
    sidebar: {
      '/guide/': [
        {
          text: 'Section A',
          collapsed: false,
          items: [
            { text: 'Introduction', link: '/guide/introduction' },
            { text: 'Getting Started', link: '/guide/getting-started' }
          ]
        }
      ]
    },
    
    socialLinks: [
      { icon: 'github', link: 'https://github.com/vuejs/vitepress' },
      { icon: 'twitter', link: 'https://twitter.com/vuejs' }
    ],
    
    footer: {
      message: 'Released under the MIT License.',
      copyright: 'Copyright © 2024 Evan You'
    }
  }
}

Custom CSS

Override default styles with custom CSS:

css
/* .vitepress/theme/custom.css */
:root {
  --vp-c-brand: #646cff;
  --vp-c-brand-light: #747bff;
  --vp-c-brand-dark: #535bf2;
  --vp-c-brand-darker: #454ce1;
}

.custom-block {
  padding: 1rem;
  border-left: 4px solid var(--vp-c-brand);
  background-color: var(--vp-c-bg-soft);
}

Custom Theme

Create a completely custom theme:

js
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import CustomLayout from './CustomLayout.vue'
import './custom.css'

export default {
  extends: DefaultTheme,
  Layout: CustomLayout,
  enhanceApp({ app, router, siteData }) {
    // Register global components
    app.component('CustomComponent', CustomComponent)
  }
}

Advanced Features

Multi-language Support

Configure multiple languages:

js
export default {
  locales: {
    root: {
      label: 'English',
      lang: 'en'
    },
    zh: {
      label: '简体中文',
      lang: 'zh-CN',
      link: '/zh/',
      themeConfig: {
        nav: [
          { text: '首页', link: '/zh/' },
          { text: '指南', link: '/zh/guide/' }
        ]
      }
    }
  }
}

Search Integration

js
export default {
  themeConfig: {
    search: {
      provider: 'local',
      options: {
        translations: {
          button: {
            buttonText: 'Search',
            buttonAriaLabel: 'Search'
          },
          modal: {
            noResultsText: 'No results found',
            resetButtonTitle: 'Reset search'
          }
        }
      }
    }
  }
}
js
export default {
  themeConfig: {
    search: {
      provider: 'algolia',
      options: {
        appId: 'YOUR_APP_ID',
        apiKey: 'YOUR_API_KEY',
        indexName: 'YOUR_INDEX_NAME'
      }
    }
  }
}

PWA Support

Enable Progressive Web App features:

js
export default {
  pwa: {
    mode: 'development',
    base: '/',
    scope: '/',
    includeAssets: ['favicon.ico'],
    manifest: {
      name: 'VitePress PWA',
      short_name: 'VitePressPWA',
      theme_color: '#ffffff',
      icons: [
        {
          src: 'pwa-192x192.png',
          sizes: '192x192',
          type: 'image/png'
        }
      ]
    }
  }
}

Vue Components in Markdown

Use Vue components directly in your Markdown files:

markdown
# My Page

<script setup>
import { ref } from 'vue'

const count = ref(0)
</script>

<div class="demo">
  <button @click="count++">Count: {{ count }}</button>
</div>

<style>
.demo {
  padding: 1rem;
  border: 1px solid #ccc;
  border-radius: 4px;
}
</style>

Regular markdown content continues here.

Global Components

Register components globally:

js
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import Badge from './components/Badge.vue'
import CodeGroup from './components/CodeGroup.vue'

export default {
  extends: DefaultTheme,
  enhanceApp({ app }) {
    app.component('Badge', Badge)
    app.component('CodeGroup', CodeGroup)
  }
}

Then use them in any Markdown file:

markdown
# Features

- Fast <Badge type="tip" text="NEW" />
- Flexible <Badge type="warning" text="BETA" />
- Powerful <Badge type="danger" text="DEPRECATED" />

Build and Deployment

Build for Production

bash
npm run docs:build

This generates static files in docs/.vitepress/dist/.

Deployment Options

GitHub Pages

yaml
# .github/workflows/deploy.yml
name: Deploy VitePress site to Pages

on:
  push:
    branches: [main]

permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 18
          cache: npm
          
      - name: Install dependencies
        run: npm ci
        
      - name: Build with VitePress
        run: npm run docs:build
        
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: docs/.vitepress/dist

  deploy:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        uses: actions/deploy-pages@v4

Netlify

Create netlify.toml:

toml
[build]
  command = "npm run docs:build"
  publish = "docs/.vitepress/dist"

[build.environment]
  NODE_VERSION = "18"

Vercel

Create vercel.json:

json
{
  "buildCommand": "npm run docs:build",
  "outputDirectory": "docs/.vitepress/dist"
}

Performance Optimization

Bundle Analysis

bash
# Analyze bundle size
npx vitepress build docs --analyze

Code Splitting

js
export default {
  vite: {
    build: {
      rollupOptions: {
        output: {
          manualChunks: {
            vendor: ['vue'],
            utils: ['lodash']
          }
        }
      }
    }
  }
}

Asset Optimization

js
export default {
  vite: {
    build: {
      assetsInlineLimit: 4096,
      cssCodeSplit: true
    }
  }
}

Best Practices

Content Organization

  • Use clear, descriptive file names
  • Organize content in logical directories
  • Maintain consistent navigation structure
  • Include comprehensive meta information

Performance

  • Optimize images and assets
  • Use code splitting for large sites
  • Enable compression and caching
  • Monitor bundle size regularly

SEO

  • Include proper meta tags
  • Generate sitemaps automatically
  • Use semantic HTML structure
  • Optimize for Core Web Vitals

Accessibility

  • Provide alt text for images
  • Ensure keyboard navigation works
  • Maintain proper heading hierarchy
  • Test with screen readers

Troubleshooting

Common Issues

Build Errors

  • Check Node.js version (18+)
  • Verify configuration syntax
  • Ensure all dependencies are installed

Routing Issues

  • Verify file structure matches expected routes
  • Check base URL configuration
  • Ensure proper file extensions

Performance Issues

  • Analyze bundle size
  • Optimize images and assets
  • Review third-party dependencies

Debug Mode

bash
# Enable debug logging
DEBUG=vitepress:* npm run docs:dev

# Verbose build output
npm run docs:build -- --debug

Migration Guide

From VuePress

  1. Update dependencies: Replace VuePress with VitePress
  2. Convert config: Update configuration format
  3. Update theme: Adapt custom theme components
  4. Test thoroughly: Verify all functionality works

From Other SSGs

  1. Content conversion: Convert content to Markdown
  2. Structure mapping: Map old structure to VitePress
  3. Feature parity: Implement equivalent features
  4. URL preservation: Set up redirects if needed

Community and Resources

Official Resources

Community

Examples

Next Steps


VitePress is actively developed and maintained by the Vue.js team. Stay updated with the latest features and improvements!

VitePress Development Guide