本页导航
article
vitepress-plugin-link使用
AI摘要
一个为 VitePress 提供永久链接功能的插件,能确保文档访问地址稳定不变。它支持国际化、多语言路径前缀、路由重写和导航栏高亮,安装配置简单,但需注意插件仅在项目启动时生效,新增或修改文档后需重启项目。该插件通过扩展路由功能,方便开发者管理和跳转文档,提升文档站点的用户体验和维护效率。
vitepress-plugin-link
github地址
✨ 特性
- 🚀🚀 支持给 markdown 文档设置唯一的访问 永久链接,不再因为 markdown 文档路径移动而导致访问地址发生变化
- 🚀 读取 markdown 文档
frontmatter
的url
,挂载到themeConfig.urls
- 🚀 提供
useurl
hooks 函数拓展router
方法,支持router.push(href)
跳转到永久链接或实际的文件路径 - 🚀 支持 locales 国际化,自动给 永久链接 添加语言前缀,不同语言的永久链接不会重复
- 🚀 支持 rewrite 路由重写,最终得到的文档路径是 rewrite 路由重写后的路径
- 🚀 永久链接 支持导航栏激活高亮
安装
安装 vitepress-plugin-link
插件
1、添加 vitepress-plugin-link
插件到 .vitepress/config.ts
import url from "vitepress-plugin-link";
export default defineConfig({
vite: {
plugins: [url({
path: "docs",
})],
},
});
2、在theme/layout/MyLayout.vue
开启监听, 插件使用了onBeforeMount等方法,必须在setUp中执行。
<script setup lang="ts">
import DefaultTheme from 'vitepress/theme'
const { Layout } = DefaultTheme
import NotFound from "../components/NotFound.vue"; // 自定义的404组件
import useurl from "vitepress-plugin-link/useurl";
useurl().startWatch();
/**
* vitepress-plugin-link 插件在 onBeforeMount 里根据自定义 URL 寻找对应的文档进行加载,但是 Vitepress 初始化页面在 ``onBeforeMount之前执行,因此需要延迟时间来等待vitepress-plugin-link` 插件执行完成,于是需要404 页面延迟加载时间,单位为毫秒
*/
onMounted(() => {
setTimeout(() => {
isShow.value = true
}, 200) // 可调整延迟时间(单位:毫秒)
})
</script>
<template>
<Layout>
// 插入你的插槽...
<template #not-found>
<ClientOnly>
<NotFound v-if="isShow"/>
</ClientOnly>
</template>
</Layout>
</template>
3、.vitepress/theme/index.ts
引用新的布局
import DefaultTheme from 'vitepress/theme'
import MyLayout from './MyLayout.vue'
export default {
extends: DefaultTheme,
// 使用注入插槽的包装组件覆盖 Layout
Layout: MyLayout
}
说明:该插件仅限项目启动时生效,已改动或新添加的 markdown 需要重启项目才能生效。
插件默认忽略 ["node_modules", "dist", ".vitepress", "public"]
目录下的文件,且只扫描 markdown 文档。
🛠️ Options
name | description | type | default |
---|---|---|---|
ignoreList | 忽略的文件/文件夹列表,支持正则表达式 | string[] |
[] |
path | 指定扫描的根目录 | string |
vitepress 的 srcDir 配置项 |
❗ Warning
插件的 useurl
函数使用了 router.onAfterRouteChange
方法,如果你也需要使用该方法,请按照下面格式进行拓展:
import { useRouter } from "vitepress";
const router = useRouter();
const initRoute = () => {
const selfOnAfterRouteChange = router.onAfterRouteChange;
// 路由切换后的回调
router.onAfterRouteChange = (href: string) => {
// 调用可能已有的函数
selfOnAfterRouteChange?.(href);
// 调用自己的函数
myFunction();
};
};
const myFunction = () => {
/* */
};
假设项目的目录结构如下:
.
├─ docs # 项目根目录
│ ├─ guide
│ │ └─ api.md
api.md
内容如下:
---
url: /guide-api
---
- 访问
/guide/api.html
可以进入文档页面,这是 vitepress 的自带功能。如果文件路径发生改变,访问链接也随着改变 - 访问
/guide-api
可以进入文档页面,这是插件的实现功能。不会随着文件路径变化而改变
永久链接是唯一的,如果出现两个一样的永久链接,则后面的永久链接覆盖前面的,但不影响 vitepress 自带访问路径。
如果永久链接不生效,代表 useurl().startWatch()
并没有被执行,请在注册 vitepress 或者任意主题前加载该函数,如何注册请看 (扩展默认主题 | VitePress)
📘 TypeScript
🛠️ Options
export interface urlOption {
/**
* 忽略的文件/文件夹列表,支持正则表达式
*
* @default []
*/
ignoreList?: Array<RegExp | string>;
/**
* 文章所在的目录,基于 package.json 所在目录,开头不需要有 /
* @default 'vitepress 的 srcDir 配置项'
*/
path?: string;
}
最后更新于 2025-10-02 15:52