Appearance
vitepress-plugin-link
github地址
✨ 特性
- 🚀🚀 支持给 markdown 文档设置唯一的访问 永久链接,不再因为 markdown 文档路径移动而导致访问地址发生变化
- 🚀 读取 markdown 文档
frontmatter
的permalink
,挂载到themeConfig.permalinks
- 🚀 提供
usePermalink
hooks 函数拓展router
方法,支持router.push(href)
跳转到永久链接或实际的文件路径 - 🚀 支持 locales 国际化,自动给 永久链接 添加语言前缀,不同语言的永久链接不会重复
- 🚀 支持 rewrite 路由重写,最终得到的文档路径是 rewrite 路由重写后的路径
- 🚀 永久链接 支持导航栏激活高亮
安装
安装 vitepress-plugin-link
插件
sh
npm install vitepress-plugin-link -D
1
sh
yarn add vitepress-plugin-plink -D
1
sh
pnpm i vitepress-plugin-link -D
1
1、添加 vitepress-plugin-link
插件到 .vitepress/config.ts
typescript
import Permalink from "vitepress-plugin-link";
export default defineConfig({
vite: {
plugins: [Permalink({
path: "docs",
})],
},
});
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
2、在theme/layout/MyLayout.vue
开启监听, 插件使用了onBeforeMount等方法,必须在setUp中执行。
vue
<script setup lang="ts">
import DefaultTheme from 'vitepress/theme'
const { Layout } = DefaultTheme
import NotFound from "../components/NotFound.vue"; // 自定义的404组件
import usePermalink from "vitepress-plugin-link/usePermalink";
usePermalink().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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
3、.vitepress/theme/index.ts
引用新的布局
typescript
import DefaultTheme from 'vitepress/theme'
import MyLayout from './MyLayout.vue'
export default {
extends: DefaultTheme,
// 使用注入插槽的包装组件覆盖 Layout
Layout: MyLayout
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
说明:该插件仅限项目启动时生效,已改动或新添加的 markdown 需要重启项目才能生效。
插件默认忽略 ["node_modules", "dist", ".vitepress", "public"]
目录下的文件,且只扫描 markdown 文档。
🛠️ Options
name | description | type | default |
---|---|---|---|
ignoreList | 忽略的文件/文件夹列表,支持正则表达式 | string[] | [] |
path | 指定扫描的根目录 | string | vitepress 的 srcDir 配置项 |
❗ Warning
插件的 usePermalink
函数使用了 router.onAfterRouteChange
方法,如果你也需要使用该方法,请按照下面格式进行拓展:
typescript
import { useRouter } from "vitepress";
const router = useRouter();
const initRoute = () => {
const selfOnAfterRouteChange = router.onAfterRouteChange;
// 路由切换后的回调
router.onAfterRouteChange = (href: string) => {
// 调用可能已有的函数
selfOnAfterRouteChange?.(href);
// 调用自己的函数
myFunction();
};
};
const myFunction = () => {
/* */
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
假设项目的目录结构如下:
text
.
├─ docs # 项目根目录
│ ├─ guide
│ │ └─ api.md
1
2
3
4
2
3
4
api.md
内容如下:
yaml
---
permalink: /guide-api
---
1
2
3
2
3
- 访问
/guide/api.html
可以进入文档页面,这是 vitepress 的自带功能。如果文件路径发生改变,访问链接也随着改变 - 访问
/guide-api
可以进入文档页面,这是插件的实现功能。不会随着文件路径变化而改变
永久链接是唯一的,如果出现两个一样的永久链接,则后面的永久链接覆盖前面的,但不影响 vitepress 自带访问路径。
如果永久链接不生效,代表 usePermalink().startWatch()
并没有被执行,请在注册 vitepress 或者任意主题前加载该函数,如何注册请看 (扩展默认主题 | VitePress)
📘 TypeScript
🛠️ Options
typescript
export interface PermalinkOption {
/**
* 忽略的文件/文件夹列表,支持正则表达式
*
* @default []
*/
ignoreList?: Array<RegExp | string>;
/**
* 文章所在的目录,基于 package.json 所在目录,开头不需要有 /
* @default 'vitepress 的 srcDir 配置项'
*/
path?: string;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13