Skip to content

Why Vitepress

BenefitDescription
Unified Ecosystemให้ระบบนิเวศที่รวมเป็นหนึ่งเดียวกับ Vite
Familiar Stackสร้างจาก Vue, Vite และ Markdown - ไม่ต้องเรียนรู้เทคโนโลยีใหม่
Highly Customizable- ปรับแต่งได้ผ่าน config.mts
- ใช้ไฟล์ .vue ใน .md ได้
- ทำงานร่วมกับ plugin Vite ทั้งหมด

Examples

WebsiteDescription
unocss.dev faviconUnoCSSAtomic CSS engine
shiki.style faviconShikiSyntax highlighter
vite-pwa-org.netlify.app faviconVite PWAPWA plugin for Vite
oxc.rs faviconOxcJavaScript tooling
eslint.style faviconESLint StylisticESLint formatting rules
kermanx.com faviconReactive VSCodeVSCode extension development
devtools-next.vuejs.org faviconVue DevToolsVue developer tools
vitest.dev faviconVitestVite-native test framework

Get Started

สร้างโปรเจค Vitepress

bash
npm create vitepress@latest
bash
pnpm create vitepress@latest
bash
yarn create vitepress
bash
bun create vitepress
  1. ตอบคำถามในการติดตั้ง:

    • Project name: ใส่ชื่อโปรเจค
    • Select framework: Vue
    • Add TypeScript: Yes
    • Add Vitepress: Yes
  2. หลังจากติดตั้งเสร็จ:

bash
cd your-project-name

โครงสร้างโฟลเดอร์

โครงสร้างพื้นฐานของโปรเจค Vitepress:

Project
sh
project-root/
├── .vitepress/          # การตั้งค่าหลักของ Vitepress
   ├── config.mts       # ไฟล์ตั้งค่าหลัก
   ├── theme/           # ธีมที่ปรับแต่ง
   ├── index.ts     # ไฟล์ตั้งค่าธีม
   └── style.css    # ไฟล์สไตล์ที่ปรับแต่ง
   └── cache/           # ข้อมูลแคช
├── public/              # ไฟล์สแตติก (รูปภาพ, ฟอนต์)
├── content/             # เนื้อหาในรูปแบบ Markdown
   ├── index.md         # หน้าหลัก
   └── guide/           # โครงสร้างเนื้อหาตัวอย่าง
       └── getting-started.md
├── package.json         # ไฟล์ dependencies
└── vite.config.ts       # ไฟล์ตั้งค่า Vite

การใช้ package.json

ไฟล์ package.json จะมีสคริปต์หลัก 3 ตัว:

package.json
json
{
  "scripts": {
    "dev": "vitepress dev",   
    "build": "vitepress build",  
    "preview": "vitepress preview" 
  }
}

Writing

FeatureDescription
Markdown Extensionsรองรับไวยากรณ์ Markdown ที่ขยายเพิ่มเติม รวมถึงกลุ่มโค้ด ตัวกั้นแบบกำหนดเอง และอื่นๆ
Asset Handlingการจัดการทรัพยากรแบบสแตติกที่มีการสร้างที่ปรับให้เหมาะสมแล้ว
Frontmatterรองรับ YAML frontmatter สำหรับข้อมูลเมตาของหน้า
Using Vue in Markdownสามารถใช้คอมโพเนนต์ Vue โดยตรงในไฟล์ Markdown
Internationalizationรองรับ i18n ในตัวพร้อมการเปลี่ยนภาษา (กำหนดค่าใน config.mts)

Customization

config.mts

สามารถปรับแต่งธีมหลักของ Vitepress ได้โดยการกำหนดค่าในไฟล์ .vitepress/config.mts

.vitepress/config.mts
ts
// .vitepress/config.mts
import markdownItEmoji from "markdown-it-emoji";
import { defineConfig } from "vitepress";

export default defineConfig({
  // Basic settings
  title: "My Website", // Title for SEO and browser tab
  description: "Website description", // For SEO
  base: "/docs/", // Base path for subfolder deployment
  lang: "en-US", // Default language

  // Theme configuration
  themeConfig: {
    logo: "/logo.png", // Website logo
    nav: [ // Navigation menu
      { text: "Home", link: "/" },
      { text: "Guide", link: "/guide/" },
    ],

    sidebar: [ // Sidebar menu
      {
        text: "Guide",
        items: [
          { text: "Getting Started", link: "/guide/getting-started" },
          { text: "Usage", link: "/guide/usage" },
        ],
      },
    ],

    footer: { // Footer section
      copyright: "Copyright 2024",
    },
  },

  // Markdown settings
  markdown: {
    theme: "github-dark", // Syntax highlighting theme
    lineNumbers: true, // Show line numbers
    config: (md) => {
      // Use markdown-it plugin
      md.use(markdownItEmoji);

      // Create custom plugin
      md.use(function myPlugin(md) {
        // Change ~~text~~ to <del>text</del>
        md.renderer.rules.strikethrough = (tokens, idx) => {
          return `<del>${md.utils.escapeHtml(tokens[idx].content)}</del>`;
        };
      });
    },
  },

  // Additional settings
  lastUpdated: true, // Show last updated date
  ignoreDeadLinks: true, // Don't check for dead links
  cleanUrls: true, // Use URLs without .html
});

Layout

สามารถปรับแต่งธีมหลักของ Vitepress ได้โดย:

  1. สร้างไฟล์ theme/index.ts เพื่อ extend ธีมเริ่มต้น
  2. ใช้คอมโพเนนต์ Vue เพื่อสร้าง Layout ที่กำหนดเอง
  3. ลงทะเบียนคอมโพเนนต์ทั่วโลกผ่าน enhanceApp
index.ts
ts
import DefaultTheme from "vitepress/theme";
import CustomLayout from "./MyLayout.vue";

export default {
  extends: DefaultTheme,
  Layout: CustomLayout,
  enhanceApp({ app }) {
    // Register global components here
  },
};
components/CustomLayout.vue
vue
<script setup>
import DefaultTheme from "vitepress/theme";
import CustomFooter from "./CustomFooter.vue";

const { Layout } = DefaultTheme;
</script>

<template>
  <Layout>
    <!-- Add custom header section -->
    <template #top>
      <div class="custom-header">
        <h1>Welcome to My Docs</h1>
      </div>
    </template>

    <!-- Customize footer -->
    <template #footer>
      <CustomFooter />
    </template>
  </Layout>
</template>

<style scoped>
.custom-header {
  padding: 1rem;
  background: var(--vp-c-brand);
  color: white;
  text-align: center;
}
</style>
Layout TypeSlot NameDescription
doc (default)doc-topด้านบนของเนื้อหาเอกสาร
doc-bottomด้านล่างของเนื้อหาเอกสาร
doc-footer-beforeก่อน footer ของเอกสาร
doc-beforeก่อนเริ่มเนื้อหาเอกสาร
doc-afterหลังจากจบเนื้อหาเอกสาร
sidebar-nav-beforeก่อนเมนู sidebar
sidebar-nav-afterหลังเมนู sidebar
aside-topด้านบนของ aside section
aside-bottomด้านล่างของ aside section
homehome-hero-beforeก่อน hero section
home-hero-infoภายในส่วนข้อมูล hero
home-hero-imageภายในส่วนรูปภาพ hero
home-features-beforeก่อน features section
pagepage-topด้านบนของหน้า
page-bottomด้านล่างของหน้า
globallayout-topด้านบนของ layout
nav-bar-title-beforeก่อน title ใน navbar
nav-bar-content-afterหลัง content ใน navbar

Styling

วิธีการปรับแต่งคำอธิบาย
CSS Variablesใช้ตัวแปร CSS เช่น --vp-c-brand, --vp-c-bg-alt
Component ClassesOverride คลาสของ Vitepress โดยตรง เช่น .VPNav, .VPButton
Custom CSSเขียน CSS เพิ่มเติมในไฟล์ style.css
css
:root {
  --vp-c-brand: #646cff;
  --vp-c-brand-light: #747bff;
  --vp-c-brand-dark: #535bf2;
}
css
.VPNav {
  background-color: var(--vp-c-bg-alt);
}

.VPButton {
  border-radius: 6px;
}

Markdown-it Plugins

ติดตั้ง plugin ก่อนใช้งาน:

bash
npm install markdown-it-emoji markdown-it-anchor
bash
pnpm add markdown-it-emoji markdown-it-anchor
bash
yarn add markdown-it-emoji markdown-it-anchor
bash
bun add markdown-it-emoji markdown-it-anchor

สามารถเพิ่ม plugin ให้กับ Markdown ได้ผ่านการกำหนดค่าใน config.mts:

.vitepress/config.mts
ts
import markdownItEmoji from 'markdown-it-emoji'
import markdownItAnchor from 'markdown-it-anchor'

export default defineConfig({
  markdown: {
    config: (md) => {
      // ใช้ plugin ต่างๆ
      md.use(markdownItEmoji)
      md.use(markdownItAnchor, {
        level: [1, 2, 3], // เพิ่ม anchor ให้ heading level 1-3
        permalink: markdownItAnchor.permalink.ariaHidden({
          placement: 'before'
        })
      })

      // สร้าง plugin เอง
      md.use((md) => {
        md.renderer.rules.emoji = (token, idx) => {
          return `<span class="emoji">${token[idx].content}</span>`
        }
      })
    }
  }
})
Pluginคำอธิบาย
www.npmjs.com faviconmarkdown-it-emojiเพิ่มอีโมจิ
www.npmjs.com faviconmarkdown-it-anchorเพิ่ม anchor ให้หัวข้อ
www.npmjs.com faviconmarkdown-it-attrsเพิ่ม attributes ให้ elements
www.npmjs.com faviconmarkdown-it-toc-done-rightสร้างสารบัญอัตโนมัติ
www.npmjs.com faviconmarkdown-it-containerสร้าง container ที่กำหนดเอง

Last updated: