Skip to content

Plugins

Discover and learn how to use VitePress plugins to extend functionality and enhance your documentation site.

Overview

VitePress plugins extend the core functionality by adding new features, integrations, and customizations. They can be official plugins maintained by the VitePress team or community-created plugins.

Official Plugins

Search Plugins

Built-in local search functionality that indexes your content.

js
// .vitepress/config.js
export default {
  themeConfig: {
    search: {
      provider: 'local',
      options: {
        translations: {
          button: {
            buttonText: 'Search',
            buttonAriaLabel: 'Search'
          },
          modal: {
            noResultsText: 'No results found',
            resetButtonTitle: 'Reset search',
            footer: {
              selectText: 'to select',
              navigateText: 'to navigate',
              closeText: 'to close'
            }
          }
        }
      }
    }
  }
}

Powerful search integration with Algolia DocSearch.

js
export default {
  themeConfig: {
    search: {
      provider: 'algolia',
      options: {
        appId: 'YOUR_APP_ID',
        apiKey: 'YOUR_API_KEY',
        indexName: 'YOUR_INDEX_NAME',
        locales: {
          zh: {
            placeholder: '搜索文档',
            translations: {
              button: {
                buttonText: '搜索文档',
                buttonAriaLabel: '搜索文档'
              }
            }
          }
        }
      }
    }
  }
}

PWA Plugin

Enable Progressive Web App features for your VitePress site.

js
// .vitepress/config.js
export default {
  pwa: {
    mode: 'development',
    base: '/',
    scope: '/',
    includeAssets: ['favicon.ico'],
    manifest: {
      name: 'VitePress PWA',
      short_name: 'VitePressPWA',
      theme_color: '#ffffff',
      background_color: '#ffffff',
      display: 'standalone',
      icons: [
        {
          src: 'pwa-192x192.png',
          sizes: '192x192',
          type: 'image/png'
        },
        {
          src: 'pwa-512x512.png',
          sizes: '512x512',
          type: 'image/png'
        }
      ]
    },
    workbox: {
      globPatterns: ['**/*.{js,css,html,png,jpg,jpeg,gif,svg,woff2}']
    }
  }
}

Sitemap Plugin

Automatically generate XML sitemaps for better SEO.

js
export default {
  sitemap: {
    hostname: 'https://your-domain.com',
    transformItems: (items) => {
      // Filter out private pages
      return items.filter(item => !item.url.includes('/private/'))
    }
  }
}

Community Plugins

Content Plugins

VitePress Plugin Auto Sidebar

Automatically generate sidebar configuration from your file structure.

bash
npm install vitepress-plugin-auto-sidebar
js
// .vitepress/config.js
import { generateSidebar } from 'vitepress-plugin-auto-sidebar'

export default {
  themeConfig: {
    sidebar: generateSidebar({
      documentRootPath: 'docs',
      scanStartPath: null,
      basePath: null,
      resolvePath: '/guide/',
      useTitleFromFileHeading: true,
      useTitleFromFrontmatter: true,
      collapsed: true,
      collapseDepth: 2,
      excludeFiles: ['first.md', 'secret.md'],
      excludeFolders: ['secret-folder']
    })
  }
}

VitePress Plugin Mermaid

Add Mermaid diagram support to your documentation.

bash
npm install vitepress-plugin-mermaid mermaid
js
// .vitepress/config.js
import { withMermaid } from 'vitepress-plugin-mermaid'

export default withMermaid({
  title: 'My Documentation',
  description: 'Documentation with Mermaid diagrams',
  
  mermaid: {
    theme: 'default'
  }
})

Usage in Markdown:

markdown
```mermaid
graph TD
    A[Start] --> B{Is it working?}
    B -->|Yes| C[Great!]
    B -->|No| D[Debug]
    D --> B

#### VitePress Plugin Code Copy
Add copy-to-clipboard functionality to code blocks.

```bash
npm install vitepress-plugin-code-copy
js
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import { enhanceAppWithTabs } from 'vitepress-plugin-code-copy'

export default {
  extends: DefaultTheme,
  enhanceApp(ctx) {
    enhanceAppWithTabs(ctx)
  }
}

Analytics Plugins

VitePress Plugin Google Analytics

Easy Google Analytics integration.

bash
npm install vitepress-plugin-google-analytics
js
// .vitepress/config.js
import { googleAnalytics } from 'vitepress-plugin-google-analytics'

export default {
  plugins: [
    googleAnalytics({
      id: 'GA_MEASUREMENT_ID'
    })
  ]
}

VitePress Plugin Umami

Privacy-focused analytics with Umami.

bash
npm install vitepress-plugin-umami
js
import { umami } from 'vitepress-plugin-umami'

export default {
  plugins: [
    umami({
      src: 'https://analytics.umami.is/script.js',
      id: 'your-website-id'
    })
  ]
}

UI Enhancement Plugins

VitePress Plugin Tabs

Add tabbed content support.

bash
npm install vitepress-plugin-tabs
js
// .vitepress/theme/index.js
import DefaultTheme from 'vitepress/theme'
import { enhanceAppWithTabs } from 'vitepress-plugin-tabs'

export default {
  extends: DefaultTheme,
  enhanceApp(ctx) {
    enhanceAppWithTabs(ctx)
  }
}

Usage:

markdown
::: tabs

== Tab 1
Content for tab 1

== Tab 2
Content for tab 2

:::

VitePress Plugin Demo Block

Create live code demonstrations.

bash
npm install vitepress-plugin-demoblock
js
// .vitepress/config.js
import { demoblock } from 'vitepress-plugin-demoblock'

export default {
  plugins: [demoblock()]
}

Usage:

markdown
::: demo
```vue
<template>
  <div class="demo-component">
    <button @click="count++">Count: {{ count }}</button>
  </div>
</template>

<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

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

:::


## Creating Custom Plugins

### Plugin Structure

```js
// plugins/my-plugin.js
export function myPlugin(options = {}) {
  return {
    name: 'my-plugin',
    configResolved(config) {
      // Access to final config
    },
    buildStart() {
      // Build start hook
    },
    transform(code, id) {
      // Transform code
      if (id.endsWith('.md')) {
        // Process markdown files
        return transformMarkdown(code, options)
      }
    },
    generateBundle() {
      // Generate additional files
    }
  }
}

function transformMarkdown(code, options) {
  // Custom markdown transformation
  return code.replace(/\[custom\]/g, options.replacement || 'Custom Content')
}

Using Custom Plugins

js
// .vitepress/config.js
import { myPlugin } from './plugins/my-plugin.js'

export default {
  vite: {
    plugins: [
      myPlugin({
        replacement: 'My Custom Replacement'
      })
    ]
  }
}

Advanced Plugin Example

js
// plugins/code-group-plugin.js
export function codeGroupPlugin() {
  return {
    name: 'code-group-plugin',
    transform(code, id) {
      if (!id.endsWith('.md')) return
      
      // Transform custom code group syntax
      return code.replace(
        /:::\s*code-group\s*\n([\s\S]*?)\n:::/g,
        (match, content) => {
          const tabs = content.split(/^```(\w+)\s*\[([^\]]+)\]\s*$/gm)
          let result = '<div class="code-group">\n'
          
          // Generate tab buttons
          result += '<div class="code-group-tabs">\n'
          for (let i = 1; i < tabs.length; i += 3) {
            const lang = tabs[i]
            const title = tabs[i + 1]
            result += `<button class="code-group-tab" data-lang="${lang}">${title}</button>\n`
          }
          result += '</div>\n'
          
          // Generate tab content
          for (let i = 1; i < tabs.length; i += 3) {
            const lang = tabs[i]
            const code = tabs[i + 2].trim()
            result += `<div class="code-group-content" data-lang="${lang}">\n`
            result += `\`\`\`${lang}\n${code}\n\`\`\`\n`
            result += '</div>\n'
          }
          
          result += '</div>'
          return result
        }
      )
    }
  }
}

Plugin Development Best Practices

Error Handling

js
export function safePlugin(options = {}) {
  return {
    name: 'safe-plugin',
    transform(code, id) {
      try {
        return processCode(code, id, options)
      } catch (error) {
        console.error(`Plugin error in ${id}:`, error)
        return code // Return original code on error
      }
    }
  }
}

Configuration Validation

js
import { z } from 'zod'

const optionsSchema = z.object({
  enabled: z.boolean().default(true),
  pattern: z.string().regex(/^\/.*\/$/).optional(),
  replacement: z.string().default('')
})

export function validatedPlugin(userOptions = {}) {
  const options = optionsSchema.parse(userOptions)
  
  return {
    name: 'validated-plugin',
    // Plugin implementation
  }
}

Performance Optimization

js
export function optimizedPlugin() {
  const cache = new Map()
  
  return {
    name: 'optimized-plugin',
    transform(code, id) {
      // Use caching for expensive operations
      if (cache.has(id)) {
        return cache.get(id)
      }
      
      const result = expensiveTransform(code)
      cache.set(id, result)
      return result
    },
    buildEnd() {
      // Clean up cache
      cache.clear()
    }
  }
}

Plugin Testing

Unit Testing

js
// tests/plugin.test.js
import { describe, it, expect } from 'vitest'
import { myPlugin } from '../plugins/my-plugin.js'

describe('myPlugin', () => {
  it('should transform custom syntax', () => {
    const plugin = myPlugin({ replacement: 'Test' })
    const code = 'This is [custom] content'
    const result = plugin.transform(code, 'test.md')
    
    expect(result).toBe('This is Test content')
  })
  
  it('should handle empty options', () => {
    const plugin = myPlugin()
    const code = 'This is [custom] content'
    const result = plugin.transform(code, 'test.md')
    
    expect(result).toBe('This is Custom Content content')
  })
})

Integration Testing

js
// tests/integration.test.js
import { createVitePress } from 'vitepress'
import { myPlugin } from '../plugins/my-plugin.js'

describe('Plugin Integration', () => {
  it('should work with VitePress build', async () => {
    const config = {
      vite: {
        plugins: [myPlugin()]
      }
    }
    
    const vitepress = await createVitePress(config)
    const result = await vitepress.build()
    
    expect(result.success).toBe(true)
  })
})

VitePress Ecosystem

  • @vitepress/plugin-search - Enhanced search functionality
  • @vitepress/plugin-pwa - Progressive Web App features
  • @vitepress/plugin-sitemap - XML sitemap generation

Community Collections

  • vitepress-plugins - Collection of useful plugins
  • awesome-vitepress - Curated list of VitePress resources
  • vitepress-community - Community-maintained plugins

Plugin Configuration Examples

Multi-plugin Setup

js
// .vitepress/config.js
import { defineConfig } from 'vitepress'
import { searchPlugin } from '@vitepress/plugin-search'
import { pwaPlugin } from '@vitepress/plugin-pwa'
import { analyticsPlugin } from 'vitepress-plugin-analytics'

export default defineConfig({
  vite: {
    plugins: [
      searchPlugin({
        previewLength: 62,
        buttonLabel: 'Search',
        placeholder: 'Search docs'
      }),
      pwaPlugin({
        outDir: '.vitepress/dist',
        registerType: 'autoUpdate'
      }),
      analyticsPlugin({
        gtag: 'GA_MEASUREMENT_ID'
      })
    ]
  }
})

Environment-specific Plugins

js
const isDev = process.env.NODE_ENV === 'development'
const isProd = process.env.NODE_ENV === 'production'

export default defineConfig({
  vite: {
    plugins: [
      // Always enabled
      searchPlugin(),
      
      // Development only
      ...(isDev ? [
        debugPlugin(),
        hotReloadPlugin()
      ] : []),
      
      // Production only
      ...(isProd ? [
        analyticsPlugin(),
        compressionPlugin(),
        sitemapPlugin()
      ] : [])
    ]
  }
})

Troubleshooting

Common Issues

Plugin Not Loading

  • Check plugin installation: npm list plugin-name
  • Verify import path and syntax
  • Check for TypeScript compatibility

Build Errors

  • Review plugin configuration
  • Check for conflicting plugins
  • Verify plugin compatibility with VitePress version

Performance Issues

  • Profile plugin execution time
  • Check for memory leaks
  • Optimize expensive operations

Debug Mode

js
export function debugPlugin() {
  return {
    name: 'debug-plugin',
    configResolved(config) {
      console.log('Plugin config:', config)
    },
    buildStart() {
      console.log('Build started')
    },
    transform(code, id) {
      console.log(`Transforming: ${id}`)
      return code
    }
  }
}

Resources

Official Documentation

Community Resources

Tools


The VitePress plugin ecosystem is constantly growing. Contribute your own plugins and help make VitePress even better!

VitePress Development Guide