Skip to content

Site Configuration

Learn how to configure your VitePress site with comprehensive configuration options.

Basic Configuration

Configuration File

Create .vitepress/config.js (or .ts for TypeScript):

javascript
// .vitepress/config.js
export default {
  // Site metadata
  title: 'My Awesome Site',
  description: 'A VitePress site with great content',
  
  // Base URL for deployment
  base: '/',
  
  // Language
  lang: 'en-US',
  
  // Clean URLs (remove .html extension)
  cleanUrls: true
}

TypeScript Configuration

Use TypeScript for better development experience:

typescript
// .vitepress/config.ts
import { defineConfig } from 'vitepress'

export default defineConfig({
  title: 'My Awesome Site',
  description: 'A VitePress site with great content',
  
  // TypeScript provides autocomplete and type checking
  themeConfig: {
    nav: [
      { text: 'Home', link: '/' },
      { text: 'Guide', link: '/guide/' }
    ]
  }
})

Site Metadata

Basic Metadata

Configure essential site information:

javascript
export default {
  title: 'VitePress Documentation',
  titleTemplate: ':title - VitePress',
  description: 'Vite & Vue powered static site generator',
  
  // HTML head configuration
  head: [
    ['meta', { charset: 'utf-8' }],
    ['meta', { name: 'viewport', content: 'width=device-width, initial-scale=1' }],
    ['link', { rel: 'icon', href: '/favicon.ico' }]
  ],
  
  // Language and locale
  lang: 'en-US',
  
  // Appearance
  appearance: true, // Enable dark mode toggle
  
  // Last updated timestamp
  lastUpdated: true
}

Advanced Head Configuration

Add complex head elements:

javascript
export default {
  head: [
    // Favicon
    ['link', { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }],
    ['link', { rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' }],
    ['link', { rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png' }],
    
    // Apple touch icon
    ['link', { rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' }],
    
    // Manifest
    ['link', { rel: 'manifest', href: '/site.webmanifest' }],
    
    // Theme color
    ['meta', { name: 'theme-color', content: '#3eaf7c' }],
    
    // Open Graph
    ['meta', { property: 'og:type', content: 'website' }],
    ['meta', { property: 'og:locale', content: 'en' }],
    ['meta', { property: 'og:site_name', content: 'VitePress' }],
    ['meta', { property: 'og:image', content: 'https://vitepress.dev/vitepress-logo-large.webp' }],
    
    // Twitter
    ['meta', { name: 'twitter:card', content: 'summary_large_image' }],
    ['meta', { name: 'twitter:site', content: '@vuepress' }],
    
    // Preconnect to external domains
    ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }],
    ['link', { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }],
    
    // Google Fonts
    ['link', { href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap', rel: 'stylesheet' }],
    
    // Analytics
    ['script', { async: '', src: 'https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID' }],
    ['script', {}, `
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'GA_MEASUREMENT_ID');
    `]
  ]
}

Build Configuration

Output Directory

Configure build output:

javascript
export default {
  // Output directory (relative to project root)
  outDir: '../dist',
  
  // Assets directory (relative to outDir)
  assetsDir: 'assets',
  
  // Cache directory
  cacheDir: '.vitepress/cache',
  
  // Temporary directory
  tempDir: '.vitepress/temp'
}

Clean URLs

Configure URL structure:

javascript
export default {
  // Remove .html extension from URLs
  cleanUrls: true,
  
  // Custom URL rewrites
  rewrites: {
    'packages/:pkg/(.*)': ':pkg/index.md'
  }
}

Base URL

Configure for deployment to subdirectories:

javascript
export default {
  // For deployment to https://example.com/docs/
  base: '/docs/',
  
  // For deployment to root domain
  base: '/'
}

Multi-language Configuration

Locales Setup

Configure multiple languages:

javascript
export default {
  locales: {
    root: {
      label: 'English',
      lang: 'en',
      title: 'VitePress',
      description: 'Vite & Vue powered static site generator'
    },
    zh: {
      label: '简体中文',
      lang: 'zh-CN',
      title: 'VitePress',
      description: 'Vite & Vue 驱动的静态网站生成器',
      link: '/zh/'
    },
    es: {
      label: 'Español',
      lang: 'es-ES',
      title: 'VitePress',
      description: 'Generador de sitios estáticos con Vite y Vue',
      link: '/es/'
    }
  }
}

Locale-specific Configuration

Different configurations per locale:

javascript
export default {
  locales: {
    root: {
      themeConfig: {
        nav: [
          { text: 'Guide', link: '/guide/' },
          { text: 'API', link: '/api/' }
        ]
      }
    },
    zh: {
      themeConfig: {
        nav: [
          { text: '指南', link: '/zh/guide/' },
          { text: 'API', link: '/zh/api/' }
        ]
      }
    }
  }
}

Advanced Configuration

Custom Markdown Configuration

Extend markdown processing:

javascript
export default {
  markdown: {
    // Line numbers in code blocks
    lineNumbers: true,
    
    // Custom anchor configuration
    anchor: {
      permalink: true,
      permalinkBefore: true,
      permalinkSymbol: '#'
    },
    
    // Table of contents
    toc: {
      includeLevel: [1, 2, 3]
    },
    
    // Custom markdown-it configuration
    config: (md) => {
      // Add custom plugins
      md.use(require('markdown-it-footnote'))
      md.use(require('markdown-it-deflist'))
      
      // Custom renderer rules
      md.renderer.rules.heading_close = (tokens, idx, options, env, renderer) => {
        let htmlResult = renderer.renderToken(tokens, idx, options)
        if (tokens[idx].tag === 'h1') htmlResult += `\n<hr class="custom-hr">`
        return htmlResult
      }
    }
  }
}

Vite Configuration

Integrate with Vite:

javascript
export default {
  vite: {
    // Define global constants
    define: {
      __VUE_OPTIONS_API__: false
    },
    
    // Server configuration
    server: {
      host: true,
      port: 3000,
      open: true
    },
    
    // Build configuration
    build: {
      minify: 'terser',
      chunkSizeWarningLimit: 1000
    },
    
    // CSS configuration
    css: {
      preprocessorOptions: {
        scss: {
          additionalData: `@import "/styles/variables.scss";`
        }
      }
    },
    
    // Plugin configuration
    plugins: [
      // Add Vite plugins
    ]
  }
}

Build Hooks

Add custom build logic:

javascript
export default {
  // Transform page data
  transformPageData(pageData) {
    // Add reading time
    const content = pageData.content || ''
    const wordsPerMinute = 200
    const wordCount = content.split(/\s+/).length
    const readingTime = Math.ceil(wordCount / wordsPerMinute)
    
    pageData.frontmatter.readingTime = readingTime
    
    return pageData
  },
  
  // Transform HTML
  transformHtml: (code, id, context) => {
    // Add custom HTML transformations
    return code.replace(
      /<title>(.*?)<\/title>/,
      `<title>$1 | My Site</title>`
    )
  },
  
  // Build start hook
  buildStart() {
    console.log('Build started!')
  },
  
  // Build end hook
  buildEnd(siteConfig) {
    console.log('Build completed!')
    
    // Generate additional files
    generateSitemap(siteConfig)
    generateRobotsTxt(siteConfig)
  }
}

Environment Configuration

Environment Variables

Use environment variables:

javascript
export default {
  title: process.env.SITE_TITLE || 'Default Title',
  description: process.env.SITE_DESCRIPTION || 'Default description',
  
  head: [
    // Conditional analytics
    ...(process.env.NODE_ENV === 'production' ? [
      ['script', { async: '', src: `https://www.googletagmanager.com/gtag/js?id=${process.env.GA_ID}` }]
    ] : [])
  ],
  
  vite: {
    define: {
      __API_URL__: JSON.stringify(process.env.API_URL || 'http://localhost:3000'),
      __VERSION__: JSON.stringify(process.env.npm_package_version)
    }
  }
}

Development vs Production

Different configurations for different environments:

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

export default {
  title: 'My Site',
  description: 'My awesome site',
  
  // Development-specific configuration
  ...(isDev && {
    vite: {
      server: {
        port: 3000,
        open: true
      }
    }
  }),
  
  // Production-specific configuration
  ...(isProd && {
    cleanUrls: true,
    sitemap: {
      hostname: 'https://mysite.com'
    }
  })
}

Configuration Validation

TypeScript Validation

Use TypeScript for configuration validation:

typescript
import { defineConfig, type UserConfig } from 'vitepress'

const config: UserConfig = {
  title: 'My Site',
  description: 'My description',
  
  themeConfig: {
    nav: [
      { text: 'Home', link: '/' },
      { text: 'Guide', link: '/guide/' }
    ]
  }
}

export default defineConfig(config)

Runtime Validation

Add runtime configuration validation:

javascript
function validateConfig(config) {
  const errors = []
  
  if (!config.title) {
    errors.push('Title is required')
  }
  
  if (!config.description) {
    errors.push('Description is required')
  }
  
  if (config.base && !config.base.startsWith('/')) {
    errors.push('Base must start with /')
  }
  
  if (errors.length > 0) {
    throw new Error(`Configuration errors:\n${errors.join('\n')}`)
  }
  
  return config
}

export default validateConfig({
  title: 'My Site',
  description: 'My description'
})

Best Practices

Organization

  • Use TypeScript for better development experience
  • Separate configuration by environment
  • Use environment variables for sensitive data
  • Document custom configuration options

Performance

  • Optimize head elements
  • Use appropriate build settings
  • Configure proper caching headers
  • Minimize bundle size

SEO

  • Include proper meta tags
  • Configure Open Graph data
  • Set up structured data
  • Generate sitemaps

Maintainability

  • Use consistent naming conventions
  • Add comments for complex configurations
  • Validate configuration at build time
  • Keep configuration DRY (Don't Repeat Yourself)

VitePress Development Guide