解析 Markdown

Vitepress自定义主题的入口是 .vitepress/theme 目录的 index 文件。

主题入口

docs/.vitepress/theme/index.ts

1import type { Theme } from "vitepress";
2import DefaultTheme from "vitepress/theme";
3import "./style.css";
4
5export default {
6  extends: DefaultTheme,
7  enhanceApp({ app, router, siteData }) {
8    // ...
9  },
10} satisfies Theme;

注册全局组件

docs/.vitepress/components/demo/index.vue

1<template>
2    注册全局组件
3</template>

docs/.vitepress/themt/index.ts

1import type { Theme } from "vitepress";
2import DefaultTheme from "vitepress/theme";
3import Demo from "../components/demo/index.vue";
4import UI from "../../../packages";
5import "../../../packages/theme/src/index.scss";
6import "./style.css";
7
8export default {
9  extends: DefaultTheme,
10  enhanceApp({ app, router, siteData }) {
11    app.component("Demo", Demo);
12    app.use(UI);
13  },
14} satisfies Theme;

markdown-it-container

markdown-it-container 是 markdown-it 的一个插件,支持用户在 Markdown 中创建自定义容器,这些容器用于封装具有特定类的内容块。

步骤 1:安装插件

1pnpm add markdown-it-container

步骤 2:配置 VitePress

docs/.vitepress/config.mts 文件中,您配置了 VitePress 使用 markdown-it-container 插件,并定义了一个名为 demo 的容器。

1import { defineConfig } from "vitepress";
2import MdContainer from "markdown-it-container"; // [!code ++]
3export default defineConfig({
4  markdown: { // [!code ++]
5    config: (md) => { // [!code ++]
6      md.use(MdContainer, "demo", { // [!code ++]
7        render(tokens: string, idx: string) { // [!code ++]
8          if (tokens[idx].nesting === 1) { // [!code ++]
9            return `<Demo>`; // [!code ++]
10          } else { // [!code ++]
11            return `</Demo>`; // [!code ++]
12          } // [!code ++]
13        }, // [!code ++]
14      }); // [!code ++]
15    }, // [!code ++]
16  }, // [!code ++]
17});

步骤 3:使用自定义容器

docs/components/button.md

1# Button按钮
2## 基础按钮
3::: demo

在 Markdown 文件中,您可以使用 ::: demo 语法来创建一个自定义容器,其中的内容将被包裹在 Demo 组件中。

tokens容器

docs/components/button.md

1# Button按钮
2## 基础按钮
3::: demo 按钮的 `type` 分别为 `default``primary``success``warning``error`
4```html
5button/basis
6```
7:::
1import { defineConfig } from "vitepress";
2import MdContainer from "markdown-it-container";
3export default defineConfig({
4  markdown: {
5    config: (md) => {
6      md.use(MdContainer, "demo", {
7        render(tokens: string, idx: string) {
8          console.log('终端输出-tokens', tokens);
9          console.log('终端输出-自定义容器的索引', idx);
10          if (tokens[idx].nesting === 1) {
11            return `<Demo>`;
12          } else {
13            return `</Demo>`;
14          }
15        },
16      });
17    },
18  },
19});