diff --git a/docs/README.md b/docs/README.md index 7b3c66c0..18d0c978 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,5 @@ --- pageLayout: home -externalLinkIcon: false config: - type: hero diff --git a/docs/notes/theme/guide/介绍.md b/docs/notes/theme/guide/介绍.md index e9b5585b..7e68f774 100644 --- a/docs/notes/theme/guide/介绍.md +++ b/docs/notes/theme/guide/介绍.md @@ -25,41 +25,47 @@ VuePress 是一个 [静态站点生成器](https://en.wikipedia.org/wiki/Static_ 与 vuepress 默认主题相比: -- **更好的用户体验** +### 更好的用户体验 - 大幅度优化了界面、交互,更为美观、简洁,易用。 +大幅度优化了界面、交互,更为美观、简洁,易用。 -- **更多的功能** +### 更多的功能 - 代码分组、提示容器、任务列表、数学公式、代码演示、内容搜索、文章评论、加密、文件树 等。 +- 灵活的,可完全自定义的 ==首页== ; -- **更好的开发体验** +- 可选的 ==博客== 、==文档== 、==知识笔记== ; - 增加编译缓存,缓存 markdown 文件编译、缓存 复杂 代码块 内容解析结果。 +- 内置支持 ==全文搜索== 、==文章评论== 、==内容加密== 、 ==文章水印== 等; -- **更好的配置** +- 可对 ==代码块== 进行 分组、折叠、聚焦、行高亮、差异对比 等,还可以 嵌入 CodePen、JSFiddle、CodeSandbox 等作为 ==代码演示==; - 支持使用单独的主题配置文件,避免修改配置导致频繁重启 VuePress 服务。 +- 内置支持 [iconify](https://icon-sets.iconify.design/) **200k+** ==图标==; - 大幅度简化了配置,更易于使用,同时还保留了丰富灵活的配置项,满足个性化的需求。 +- 支持 ==嵌入 PDF==、==嵌入 Bilibili/Youtube 视频==; + +- 支持 chart.js、Echarts、Mermaid、flowchart 等多种可选的 ==图表== ; + +- 灵活的 markdown 容器语法,支持 ==提示容器==、==文件树==、==示例容器== 等; + +- 支持 ==布局插槽==、==组件覆写== ==自定义样式== 等,你可以灵活地扩展组件,实现 个性化的 布局。 + +更多的功能等待你的发现 ! + +### 更好的开发体验 + +增加编译缓存,缓存 markdown 文件编译、缓存 复杂 代码块 内容解析结果。 + +### 更好的配置 + +支持使用单独的主题配置文件,避免修改配置导致频繁重启 VuePress 服务。 + +大幅度简化了配置,更易于使用,同时还保留了丰富灵活的配置项,满足个性化的需求。 + +### 更多 ==plume 主题== 尽可能的内置你可能需要的功能,以及搭建站点所需要的一般性配置,您无需关注这些细节。 目的是,让您更专注于 内容的创作,更好的表达你的想法,享受 Markdown 增强语法带来的便利。 -## 功能 - -- 💻 响应式布局,适配不同的屏幕尺寸 -- 📖 博客 & 文档 -- 🔗 自动生成文章永久链接 -- ⚖ 支持多语言 -- 🔑 支持 全站加密、部分加密 -- 👀 支持 搜索、文章评论 -- 👨‍💻‍ 支持 浅色/深色 主题 (包括代码高亮) -- 📠 markdown 增强,支持 代码块分组、提示容器、任务列表、数学公式、代码演示、文件树 等 -- 📚 代码演示,支持 CodePen, Replit, JSFiddle, CodeSandbox -- 📊 嵌入图标,支持 chart.js,Echarts,Mermaid,flowchart 等 -- 🎛 资源嵌入,支持 PDF, bilibili视频,youtube视频等 - ::: tip 本主题 基于 [vuepress-next](https://github.com/vuepress/vuepress-next), 目前处于 RC 阶段。 diff --git a/docs/notes/theme/guide/博客.md b/docs/notes/theme/guide/博客.md index 332a5ca3..a6a705b9 100644 --- a/docs/notes/theme/guide/博客.md +++ b/docs/notes/theme/guide/博客.md @@ -17,10 +17,12 @@ import VPBlogProfile from 'vuepress-theme-plume/components/Blog/VPBlogProfile.vu 主题默认启用 博客功能,通常您无需进行额外的配置。 -主题默认会将 `{sourceDir}` 目录下的,除了一些特定的目录(如 `notes` 目录将作为笔记所在目录), +主题默认会将 `{sourceDir}` 目录下的,除了特定的目录(如 `notes` 目录将作为笔记所在目录), 所有 md 文件作为博客文章。 -同时,主题会生成一个 链接地址为 `/blog/` 的 博客文章列表页。 +主题还会根据 md 文件 所在的 文件目录结构,以 **目录名** 作为 博客文章所属的 **分类**。 + +主题默认会生成一个 链接地址为 `/blog/` 的 博客文章列表页。 展示所有的博客文章,以及 博主的相关信息。 ## 国际化支持 @@ -112,8 +114,92 @@ title: 标题 主题除了自动生成 **博客文章列表页** 以外,还会自动生成 **标签页**,**分类页** 和 **归档页**。 -标签页 可以根据 标签 筛选并展示 博客文章。 +标签页 可以根据 标签 筛选并展示 博客文章, 默认地址为 `/blog/tags/` -分类页 可以根据 原始目录结构 分类展示 博客文章。 +分类页 可以根据 原始目录结构 分类展示 博客文章, 默认地址为 `/blog/categories/` -归档页根据文章的创建时间进行归档。 +归档页根据文章的创建时间进行归, 默认地址为 `/blog/archives/` + +## 设置博客为主页 + +默认情况下,主题 将 **首页** 与 **博客页** 分离。 + +但对于 希望只建立一个 博客站点 的用户而言,可能直接将 博客页 作为 **首页** 是个更好的选择。 + +主题提供了两种方式来设置博客为主页,满足不同的需求场景: + +- **方式一:配置 主页的 `pageLayout` 属性为 `blog`** + +::: code-tabs +@tab docs/README.md + +```md +--- +pageLayout: blog +--- +``` + +::: + +此配置会直接将页面应用 博客布局,显示博客文章列表。 + +这是将主页修改为 博客页的 最简单的方式,但缺点是 缺少灵活性。 + +- **方式二:配置 主页的 `pageLayout` 属性为 `home`, 添加 `type: blog` 的首页区域类型** + +::: code-tabs + +@tab docs/README.md + +```md +--- +pageLayout: home +config: + - type: blog +--- +``` + +::: + +使用这种方式,你不仅可以在首页中添加 博客文章列表,还可以灵活的在页面的其他区域添加不同的内容。 + +比如,配置首屏为 `banner`,然后紧跟着 博客文章列表: + +::: code-tabs + +@tab docs/README.md + +```md +--- +pageLayout: home +config: + - type: banner + - type: blog +--- +``` + +::: + +更多自定义配置,请参考 [自定义首页](./自定义首页.md)。 + +当使用以上两种方式 将首页配置为 博客页后,由于主题默认依然会生成 地址为`/blog/` 的博客文章列表页, +这导致存在了重复功能的页面,为此,你需要 [主题配置 > 博客配置](../config/主题配置.md#blog) 中, +**关闭自动生成博客文章列表页**: + +(还可以在重新修改 分类页/标签页/归档页的链接地址) + +```ts +import { plumeTheme } from 'vuepress-theme-plume' +import { defineUserConfig } from 'vuepress' + +export default defineUserConfig({ + theme: plumeTheme({ + blog: { + postList: false, // 禁止生成博客文章列表页 + // tagsLink: '/blog/tags/', + // categoriesLink: '/blog/categories/', + // archiveLink: '/blog/archives/', + } + }) +}) +``` diff --git a/docs/notes/theme/guide/安装与使用.md b/docs/notes/theme/guide/安装与使用.md index 7056aeaf..0cc6f9fe 100644 --- a/docs/notes/theme/guide/安装与使用.md +++ b/docs/notes/theme/guide/安装与使用.md @@ -270,23 +270,26 @@ cd open-source # 进入 D: 分区下的 open-source 目录 - docs \# 文档源目录 - .vuepress - public/ \# 静态资源目录 - - client.ts - - config.ts \# vuepress 配值文件 + - client.ts \# 客户端配置 + - config.ts \# vuepress 配值 - navbar.ts \# 导航栏配置 - notes.ts \# notes 配置 - - plume.config.ts \# 主题配置文件 - - notes + - plume.config.ts \# 主题配置 + - notes \# 系列文档、知识笔记 - demo - foo.md - bar.md - - preview + - preview \# 博客分类 - markdown.md - README.md \# 首页 - package.json -- package-lock.json +- pnpm-lock.yaml - .gitignore - README.md ::: 在 `docs` 目录中, 除 `.vuepress` 目录外,目录中的 所有 markdown 文件都会被识别为文档。 -其中,除 `notes` 目录外的 `markdown` 文件会被识别为 博客文章,而 `notes` 目录下 `markdown` 文件会被识别为 文档笔记。 + +- 除 `notes` 目录外的 `markdown` 文件会被识别为 博客文章,并根据其所在的目录结构,作为 文章分类。 + +- `notes` 目录下 `markdown` 文件会被识别为 文档笔记。 diff --git a/docs/notes/theme/guide/知识笔记.md b/docs/notes/theme/guide/知识笔记.md index 8a68fd73..d0babc5a 100644 --- a/docs/notes/theme/guide/知识笔记.md +++ b/docs/notes/theme/guide/知识笔记.md @@ -11,52 +11,55 @@ tags: ## 概述 -在本主题满足了 Blog 的基本功能后,期望能够 以 note 或者 book 的形式聚合文章,形式上类似于 vuepress 默认主题。 -同时也减少配置的复杂度。 +主题提供了 `笔记` 的功能,它用于聚合 同一个系列的文章、或者作为站点的 **子文档** 。 -它能够让你以更加友好的方式,组织管理你的文档。 +`笔记` 以 文件结构 作为划分依据,默认以 `notes/` 作为根目录, +存放在 `notes` 目录下的 文档不会作为 博客文章,不会出现在 博客文章列表页中。 -## 目录 +## 文件结构与配置 -文档/知识笔记 默认存放在 `{sourceDir}/notes` 目录下。 - -示例: +我们有一个项目中,有以下文件结构: ::: file-tree -- \{sourceDir\} +- docs - notes - - typescript - - foo.md - - rust - - foo.md + - typescript \# typescript 笔记 + - basic.md + - types.md + - rust \# rust 笔记 + - tuple.md + - struct.md + - blog-post.md \# 博客文章 + - README.md \# 站点首页 ::: -其中,`typescript` 和 `rust` 为目录名,各自独立保存与之相关的 markdown 文件。 +在 `docs/notes` 目录下,有两个子目录,分别用于存放 `typescript` 和 `rust` 的系列内容。 -## 配置 +接下来,在配置文件中配置 `notes`: -```js +```js :collapsed-lines=20 import { defineUserConfig } from 'vuepress' import { plumeTheme } from 'vuepress-theme-plume' export default defineUserConfig({ theme: plumeTheme({ notes: { - dir: '/notes/', // 声明所有笔记的目录 - link: '/', // 声明所有笔记默认的链接前缀, 默认为 '/' + // 声明所有笔记的目录,(默认配置,通常您不需要声明它) + dir: '/notes/', + link: '/', // 声明所有笔记默认的链接前缀, 默认为 '/' (默认配置,通常您不需要声明它) notes: [ + // 每个笔记都是 `notes` 数组中的一个对象 { - dir: 'typescript', // 声明笔记的目录,相对于 `notes.dir` - link: '/typescript/', // 声明笔记的链接前缀 - sidebar: [ // 配置侧边栏 - { - text: '简介', - icon: 'mdi:language-typescript', // 侧边栏图标 - items: ['foo'] // 简化写法,主题会自动补全为 `foo.md` - } - ] + // 声明笔记的目录,相对于 `notes.dir`,这里表示 `notes/typescript` 目录 + dir: 'typescript', + // 声明笔记的链接前缀,与 `notes.link` 拼接,这里表示 `/typescript/` + // 笔记内的所有文章会以 `/typescript/` 作为访问链接前缀。 + link: '/typescript/', + // 配置 笔记侧边导航栏,用于导航向笔记内的所有文档 + // 声明为 `auto` 的,将根据目录结构自动生成侧边栏导航 + sidebar: 'auto' }, { dir: 'rust', @@ -71,13 +74,241 @@ export default defineUserConfig({ }) ``` -主题会根据配置,为对应目录中的 md 文件,生成 永久链接,以及侧边栏。 - ::: tip -你应该在创建文件之前,先把笔记的目录和链接前缀等配置好,主题需要根据配置, -为目录中的 md 文件生成永久链接,以及侧边栏。 +你应该在创建文件之前,建议先把笔记的目录和链接前缀等配置好。 +主题默认启用了 [auto-frontmatter](../config/主题配置.md#autofrontmatter), +需要根据配置,为目录中的 md 文件生成永久链接,以及侧边栏。 ::: -完整配置查看 [notes配置](../config/notes配置.md) +### 侧边栏配置 + +以 `typescript` 目录为例,它拥有如下的文件结构: + +::: file-tree + +- typescript + - guide + - intro.md + - getting-start.md + - config + - config-file.md + - configuration.md + - reference + - basic.md + - syntax.md + - modules.md + - built-in + - types + - Required.md + - Omit.md + - README.md + +::: + +#### 自动生成侧边栏 + +一种最简单的配置方式是 `sidebar: 'auto'` , 主题会自动根据 文件结构生成侧边栏,并根据 首个字符的编码 来排序。 + +如果想要修改 自动生成的侧边栏的顺序,可以直接在 目录名 或 文件名之前,添加 `1.` 或 `2.` 等前缀。 + +::: file-tree + +- typescript + - 1.guide + - 1.intro.md + - 2.getting-start.md + - 2.config + - 1.config-file.md + - 2.configuration.md + - … +::: + +主题将根据 这部分的前缀的 数字 进行排序,前缀部分不会显示在侧边栏中。 + +#### 自定义侧边栏 + +有时候自动生成侧边栏 不能完全满足需求,你可以自定义侧边栏。 + +以下是 侧边栏的 类型定义: + +```ts +type Sidebar = (string | SidebarItem)[] + +interface SidebarItem { + /** + * 侧边栏文本 + */ + text?: string + + /** + * 侧边栏链接 + */ + link?: string + + /** + * 侧边栏图标 + */ + icon?: ThemeIcon + + /** + * 当前分组的链接前缀,链接前缀会拼接在 `items` 内的 `link` 之前 + * 当且仅当 `items` 内的 `link` 为 相对路径时,才会拼接 + */ + prefix?: string + /** + * 次级侧边栏分组 + */ + items?: 'auto' | (string | SidebarItem)[] + + /** + * 如果未指定,组不可折叠。 + * 如果为`true`,组可折叠,并默认折叠。 + * 如果为`false`,组可折叠,但默认展开。 + */ + collapsed?: boolean +} +``` + +当 传入类型为 `string` 时,表示 markdown 文件的路径: + +```ts +const sidebar: Sidebar = [ + '/guide/intro.md', + '/guide/getting-start.md', + '/config/config-file.md', + // ... +] +``` + +你也可以省略 `.md` 文件后缀,简写为 `/guide/intro` 。主题会解析 对应的文件,获取 **标题** 和 **页面链接地址** +并将其转换为 `{ text: string, link: string }` 的数据形式。 + +当传入类型为 `SidebarItem` 时: + +```ts +const sidebar: Sidebar = [ + { text: '介绍', link: '/guide/intro' }, + { text: '快速上手', link: '/guide/getting-start' }, + // ... +] +``` + +也可以进行多层嵌套: + +```ts +const sidebar: Sidebar = [ + { + text: '指南', + prefix: '/guide', // 使用 prefix 拼接,可以简写 下面的 items 中的 link 为相对路径 + items: [ + // 可以混用 string 和 SidebarItem + { text: '介绍', link: 'intro' }, + 'getting-start', + ], + }, + { + text: '配置', + prefix: '/config', + items: 'auto', // items 为 'auto',会根据 prefix 的文件结构自动生成侧边栏 + }, +] +``` + +:::warning +不建议 侧边栏的层级过深,超过 3 层的侧边栏 可能会导致 糟糕的 UI 效果。 +::: + +### 侧边栏图标 + +为侧边栏添加 图标 有助于 侧边栏更好的呈现。得益于 [iconify](https://iconify.design/) 这个强大的开源图标库, +你可以使用超过 `200k` 的图标,仅需要添加 `icon` 配置即可。 + +```ts +const sidebar: Sidebar = [ + { + text: '指南', + prefix: '/guide', + icon: 'ep:guide', // iconify icon name // [!code hl] + items: [ + { text: '介绍', link: 'intro', icon: 'ph:info-light' }, // [!code hl] + ], + }, +] +``` + +也可以使用本地图标,或者本地图片: + +```ts +const sidebar: Sidebar = [ + { + text: '指南', + prefix: '/guide', + icon: '/images/guide.png', // iconify icon name // [!code hl] + items: [ + { text: '介绍', link: 'intro', icon: '/images/info.png' }, // [!code hl] + // 也可以是一个远程图片 + { text: '快速上手', link: 'getting-start', icon: 'https://cn.vuejs.org/images/logo.png' }, + ], + }, +] +``` + +**请注意,使用本地图片必须以 `/` 开头,表示为 静态资源路径,它将从 `.vuepress/public/` 目录中加载。** + +::: file-tree + +- docs + - .vuepress + - public \# 在这个位置保存静态资源 + - images + - guide.png + - info.png + - … +::: + +你可能已经注意到,`sidebar: auto` 时,该如何配置 侧边栏图标,事实上很简单,直接在 文件的 `frontmatter` 部分, +添加 一个 `icon` 字段即可。 + +::: code-tabs +@tab typescript/guide/intro.md + +```md +--- +title: 介绍 +icon: ep:guide +--- +``` + +::: + +## 笔记首页 + +你可能注意到,在 `typescript` 目录下,有一个 `README.md` 文件,它会被作为笔记首页显示。 + +::: file-tree + +- typescript + - README.md + - … +- … +::: + +默认情况下,它与 普通的文档页面 没有区别,这是因为 主题 默认对 所有页面 设置了 `pageLayout: docs`。 + +但你可以直接配置 `pageLayout: 'home'`,就像配置 [站点首页](./自定义首页.md) 一样,为 笔记配置一个个性化的首页! + +::: code-tabs +@tab typescript/README.md + +```md +--- +pageLayout: home +config: + - type: hero + - type: features +--- +``` + +::: diff --git a/docs/notes/theme/guide/自定义首页.md b/docs/notes/theme/guide/自定义首页.md index ebe5c42c..0cb4a140 100644 --- a/docs/notes/theme/guide/自定义首页.md +++ b/docs/notes/theme/guide/自定义首页.md @@ -436,6 +436,10 @@ config: text-image ::: +### blog + +将 博客文章列表页 作为一个单独区域,插入到 首页中。 + ### profile - 类型: `PlumeThemeHomeProfile`