Skip to content

生成配置导航的方法

字数: 0 字 时长: 0 分钟

vitepress 会根据文件夹的目录结构自动识别生成路由,侧边的配置导航需要手动填写

目录结构

根据目录结构生成对应的 url 路由地址

生成路由后,我们需要配置左侧的配置导航,可以手动填写,也可以采用脚本,我是采取了脚本的方法。

我新建了一个与.vitepress 平级的scripts 文件夹存放脚本文件gen-sidebar.mjs ,接着修改启动方式脚本,在主题配置config.mjs 里修改配置导航

js
// gen-sidebar.mjs
// 按照自己的目录结构修改参数 此处我的md只放在fronted与notes两个文件夹
import { readdirSync, statSync } from "node:fs";
import { join, extname } from "node:path";
import { writeFileSync } from "node:fs";
import { fileURLToPath } from "node:url";
import { dirname, resolve } from "node:path";

// 当前脚本目录:假设项目结构是 <docs>/.vitepress/make-sidebar.js
const __dirname = dirname(fileURLToPath(import.meta.url));
const DOCS_ROOT = resolve(__dirname, "..");
const SCAN_BASE = join(DOCS_ROOT, "frontend"); // 要扫描的目录
const OUTPUT_FILE = join(DOCS_ROOT, ".vitepress", "fronted.json");

function scan(dir, base = "") {
  const items = [];
  for (const name of readdirSync(dir, { withFileTypes: true })) {
    const fullPath = join(dir, name.name);
    const relPath = join(base, name.name);
    if (name.isDirectory()) {
      items.push({
        text: name.name,
        collapsed: true,
        items: scan(fullPath, relPath),
      });
    } else if (extname(name.name) === ".md" && !name.name.startsWith("@")) {
      // 跳过以 @ 开头的文件
      const link =
        "/frontend/" + relPath.replace(/\\/g, "/").replace(/\.md$/, "");
      items.push({ text: name.name.replace(/\.md$/, ""), link });
    }
  }
  return items.sort((a, b) => {
    // 目录放前面,文件放后面;可按需要自行排序
    return (a.items ? -1 : 1) - (b.items ? -1 : 1);
  });
}

const sidebar = scan(SCAN_BASE);
writeFileSync(OUTPUT_FILE, JSON.stringify(sidebar, null, 2));
console.log("✅ 新路由json 已生成");
json
// package.json
"scripts": {
    "docs:dev": "npm run gen-sidebar && vitepress dev",
    "docs:build": "vitepress build",
    "docs:preview": "vitepress preview",
    "gen-sidebar": "node scripts/gen-sidebar.mjs",
    "commit": "git-cz"
  },
js
// config.mjs
export default defineConfig({
  themeConfig: {
    ......,
    sidebar: {
      '/frontend/': fronted,
      '/notes':notes
    },
  },
});

于是,我每次执行本地启动项目npm run docs:dev就会生成一份新的配置导航到对应的目录文件里,同时更新配置。