Vuepress2自定义主题详细指南
创建项目
首先,创建项目,vuepress-starter
代表你的项目名,
1 | npm init vuepress vuepress-starter |
页面目录结构如下图所示,
然后启动项目,
1 | npm run docs:dev |
自定义首页
首先在.vuepress/layouts/LayoutHome.vue
中定义首页如何布局,然后在/vuepress/clients.js
中注册该布局,最后在README.md
中声明首页使用此布局。
1 | // /vuepress/clients.js |
1 | --- |
首页具体代码不展示。其他页面的自定义布局与首页不同,会在后面讲到。
自定义组件
组件都放在.vuepress/components
下,一共有3种组件。
第一种,非全局组件,使用时需要引入,如下所示,
1 | <script setup> |
第二种,全局组件需要注册,不需要引入,使用时才会被添加到页面中,如下所示,
1 | // .vuepress/theme/client.js |
第三种,rootComponents指定的组件会被直接放在根节点中,全局弹窗之类的组件可以用这种方法,
1 | import { defineClientConfig } from 'vuepress/client' |
自定义布局
在文件.vuepress/layouts/LayoutDefault.vue
中定义页面内容。
1 | <!--.vuepress/layouts/LayoutDefault.vue--> |
然后,在.vuepress/client.js
中注册该布局,
1 | // .vuepress/client.js |
最后在使用该布局的页面中,引入并将内容填充进slot。
1 | <script setup> |
修改默认页面
默认的页面有文章列表页、标签页、类别页、时间轴页。有2种方案:替换默认插槽、替换整个布局页。
每个页面都有固定的文件名,如下所示:
- 文章列表页:layouts/Article.vue
- 文章内容页:layouts/Layout.vue
- 标签页:layouts/Tag.vue
- 类别页:layouts/Category.vue
- 时间轴页:layouts/Timeline.vue
下面以文章内容页为例,必须要在.vuepress/layouts/Layout.vue
文件中定义文章内容页的内容。
方案一:替换默认插槽,
1 | <!-- .vuepress/layouts/Layout.vue --> |
方案二:替换整个布局页,
1 | <!-- .vuepress/layouts/Layout.vue --> |
<Content/>
就是.md
文件里的内容,不需要引入。
添加新页面
比如,想添加一个友链页。
需要先在.vuepress/layouts/Friends.vue
中定义页面内容,然后在.vuepress/client.js
中注册该布局。然后在.vuepress/config.js
中添加新页面。
1 | // .vuepress/config.js |
如何覆盖默认样式
在.vuepress/styles/index.scss
(一定是这个名字)中定义样式,不需要引入。
1 | // .vuepress/styles/index.scss |
可能用到的api
useClientData
1 | <script setup lang="ts"> |
useClientData()
的返回值如下所示:useClientData()
返回全部客户端ref对象,另外还可以通过以下组合式api获取单独数据,
- usePageData 获取当前页面数据;
- usePageFrontmatter 获取当前页面的frontmatter配置;
- usePageHead 获取当前页面head信息,如meta、title等;
- usePageHeadTitle 获取当前页面的title,页面title+站点title;
- usePageLang 获取当前页面语言;
useRoutes
该api返回所有路由,
useSiteData
该api返回站点信息,
defineClientConfig
defineClientConfig
需要定义在.vuepress/client.js
中。如果是在自定义主题中使用,需要声明该文件的位置,
1 | // config.js |
defineClientConfig
的具体使用如下所示,
1 | import { defineClientConfig } from 'vuepress/client' |
resolveRoute
useRoutes()
获取全部路由,是一个对象,key是path,值是路由信息;resolveRoutePath(url)
根据传入的url获取path;resolveRoute(link)
返回路由信息;withBase(path)
拼接上base值;
在自定义主题时,可以通过withBase
获取资源正确路径,
1 | <script setup> |
已定义的常量
- VUEPRESS_VERSION vuepress核心包的版本;
- VUEPRESS_BASE config.js中base配置;
- VUEPRESS_DEV 是否是dev环境;
- VUEPRESS_SSR 是否是ssr环境;
这些常量可以在js
代码中直接使用,1
2
3<script setup>
console.log(__VUEPRESS_VERSION__)
</script>
resolvers
覆盖一些默认的计算方法,实验性功能,修改时需充分了解原来的目的。
1 | import { defineClientConfig, resolvers } from 'vuepress/client' |
添加进阶功能
评论模块
首先,安装依赖,
1 | npm i -D @vuepress/plugin-comment@next |
然后,配置插件,申请评论服务,评论服务推荐Giscus
,
https://ecosystem.vuejs.press/zh/plugins/blog/comment/giscus/
1 | // .vuepress/config.js |
@vuepress/helper辅助函数
https://ecosystem.vuejs.press/zh/tools/helper/
添加显示访问量功能;
https://ecosystem.vuejs.press/zh/plugins/analytics/umami-analytics.html
设置sitemap
开启ssr
seo插件;https://ecosystem.vuejs.press/zh/plugins/seo/seo/
代码复制功能
https://ecosystem.vuejs.press/zh/plugins/features/copy-code.html
搜索功能
https://ecosystem.vuejs.press/zh/plugins/search/search.html#hotkeys
内置全局组件
https://vuepress.github.io/zh/reference/components.html#autolink
默认插槽
https://ecosystem.vuejs.press/zh/themes/default/extending.html#%E5%B8%83%E5%B1%80%E6%8F%92%E6%A7%BD
替换非全局组件
https://ecosystem.vuejs.press/zh/themes/default/extending.html#%E7%BB%84%E4%BB%B6%E6%9B%BF%E6%8D%A2
非全局组件列表
https://github.com/vuepress/ecosystem/tree/main/themes/theme-default/src/client/components
图片缩放功能
https://ecosystem.vuejs.press/zh/plugins/features/medium-zoom.html
覆盖主题css变量
https://ecosystem.vuejs.press/zh/themes/default/styles.html#style-%E6%96%87%E4%BB%B6
最后
烂尾了,不一定补充。