* docs: translate README to English in homepage * feat(docs): update hero-text in README * docs: add readme_en * feat(docs): add language jump in readme * docs: update readme layout * feat(docs): add CONTRIBUTION_EN and jump link * docs: translate theme introduction * docs: upgrade version to 135 , create 2 file * docs: add icon, fix translation errors in intro, translate quick-start * docs: translate quick start - write * docs: fix jump link in write * docs: translate document in quick start * docs: translate international in quick start * docs: translate deployment in quick start * docs: translate optimize-build in quick start --------- Co-authored-by: pengzhanbo <volodymyr@foxmail.com>
629 lines
16 KiB
Markdown
629 lines
16 KiB
Markdown
---
|
|
title: Documents/Notes
|
|
icon: teenyicons:doc-outline
|
|
createTime: 2025/03/04 12:52:47
|
|
permalink: /en/guide/document/
|
|
tags:
|
|
- Guide
|
|
- Quick Start
|
|
---
|
|
|
|
## Overview
|
|
|
|
The theme provides a `notes` feature, which is used to aggregate articles from the same series or serve as the site's **sub-documentation**.
|
|
|
|
"Notes" are organized based on the file structure. By default, the `notes/` directory is used as the root directory. Documents stored under the `notes` directory will not be treated as blog posts and will not appear on the blog post list page.
|
|
|
|
## File Structure and Configuration
|
|
|
|
In one of our projects, we have the following file structure:
|
|
|
|
::: file-tree
|
|
|
|
- docs
|
|
- notes
|
|
- typescript \# Typescript notes
|
|
- basic.md
|
|
- types.md
|
|
- rust \# Rust notes
|
|
- tuple.md
|
|
- struct.md
|
|
- blog-post.md \# Blog post
|
|
- README.md \# Site home page
|
|
|
|
:::
|
|
|
|
Under the `docs/notes` directory, there are two subdirectories for storing the series content of `typescript` and `rust`, respectively.
|
|
|
|
Next, configure `notes` in the configuration file:
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/config.ts
|
|
|
|
```js
|
|
import { defineUserConfig } from 'vuepress'
|
|
import { plumeTheme } from 'vuepress-theme-plume'
|
|
|
|
export default defineUserConfig({
|
|
theme: plumeTheme({
|
|
notes: {
|
|
// Declare the directory for all notes, (default configuration, usually you don't need to declare it)
|
|
dir: '/notes/',
|
|
link: '/', // Declare the default link prefix for all notes, default is '/' (default configuration, usually you don't need to declare it)
|
|
notes: [
|
|
// Each note is an object in the `notes` array
|
|
{
|
|
// Declare the note's directory, relative to `notes.dir`, here it represents the `notes/typescript` directory
|
|
dir: 'typescript',
|
|
// Declare the note's link prefix, concatenated with `notes.link`, here it represents `/typescript/`
|
|
// All articles within the note will use `/typescript/` as the access link prefix.
|
|
link: '/typescript/',
|
|
// Configure the note's sidebar navigation, used to navigate all documents within the note
|
|
// Declared as `auto`, the sidebar navigation will be automatically generated based on the directory structure
|
|
sidebar: 'auto'
|
|
},
|
|
{
|
|
dir: 'rust',
|
|
link: '/rust/',
|
|
sidebar: [
|
|
{ text: 'Introduction', items: ['foo'] }
|
|
]
|
|
}
|
|
]
|
|
}
|
|
})
|
|
})
|
|
```
|
|
|
|
:::
|
|
|
|
::: tip
|
|
|
|
It is recommended to configure the note's directory and link prefix before creating files.
|
|
The theme has enabled [auto-frontmatter](../config/basic.md#autofrontmatter) by default,
|
|
which needs to generate permanent links and sidebars for md files in the directory based on the configuration.
|
|
|
|
:::
|
|
|
|
## Writing Notes Configuration
|
|
|
|
Since writing all `notes` configurations inside `plumeTheme({ })` may cause the code nesting to be too deep, it is more recommended to use the `defineNotesConfig()` and `defineNoteConfig()` provided by the theme to extract the notes configuration to the outside. They can also help you get better type hints, making it more readable and easier to maintain.
|
|
|
|
::: code-tabs
|
|
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig, defineNotesConfig } from 'vuepress-theme-plume'
|
|
|
|
/**
|
|
* Configure a single note
|
|
*/
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
'/guide/intro.md',
|
|
'/guide/getting-start.md',
|
|
'/config/config-file.md',
|
|
]
|
|
})
|
|
|
|
/**
|
|
* Configure notes
|
|
*/
|
|
export default defineNotesConfig({
|
|
// Declare the directory for all notes, (default configuration, usually you don't need to declare it)
|
|
dir: '/notes/',
|
|
link: '/',
|
|
// Add note configurations here
|
|
notes: [typescript] // [!code ++]
|
|
})
|
|
```
|
|
|
|
@tab .vuepress/config.ts
|
|
|
|
```ts
|
|
import { defineUserConfig } from 'vuepress'
|
|
import { plumeTheme } from 'vuepress-theme-plume'
|
|
import notes from './notes' // [!code ++]
|
|
|
|
export default defineUserConfig({
|
|
theme: plumeTheme({
|
|
notes // [!code ++]
|
|
}),
|
|
})
|
|
```
|
|
|
|
:::
|
|
|
|
:::: details How to configure when there are many notes?
|
|
If you have a large number of notes and putting them all in one `notes.ts` file may make the file too large and difficult to maintain,
|
|
you can split the files, using the `.vuepress/notes/` directory as the directory for note configurations.
|
|
::: file-tree
|
|
|
|
- docs
|
|
- .vuepress
|
|
- notes
|
|
- typescript.ts
|
|
- rust.ts
|
|
- index.ts
|
|
- …
|
|
- notes
|
|
- typescript/
|
|
- rust/
|
|
:::
|
|
|
|
The code is as follows:
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/config.ts
|
|
|
|
```ts
|
|
import { defineUserConfig } from 'vuepress'
|
|
import { plumeTheme } from 'vuepress-theme-plume'
|
|
import notes from './notes/index.ts' // [!code ++]
|
|
|
|
export default defineUserConfig({
|
|
theme: plumeTheme({
|
|
notes // [!code ++]
|
|
}),
|
|
})
|
|
```
|
|
|
|
@tab .vuepress/notes/index.ts
|
|
|
|
```ts
|
|
import { defineNotesConfig } from 'vuepress-theme-plume'
|
|
import rust from './rust' // [!code ++]
|
|
import typescript from './typescript' // [!code ++]
|
|
|
|
export default defineNotesConfig({
|
|
// Declare the directory for all notes, (default configuration, usually you don't need to declare it)
|
|
dir: '/notes/',
|
|
link: '/',
|
|
// Add note configurations here
|
|
notes: [ // [!code ++:4]
|
|
typescript,
|
|
rust,
|
|
]
|
|
})
|
|
```
|
|
|
|
@tab .vuepress/notes/typescript.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
export default defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
'/guide/intro.md',
|
|
'/guide/getting-start.md',
|
|
'/config/config-file.md',
|
|
]
|
|
})
|
|
```
|
|
|
|
@tab .vuepress/notes/rust.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
export default defineNoteConfig({
|
|
dir: 'rust',
|
|
link: '/rust/',
|
|
sidebar: [
|
|
'/guide/intro.md',
|
|
'/guide/getting-start.md',
|
|
'/config/config-file.md',
|
|
]
|
|
})
|
|
```
|
|
|
|
:::
|
|
::::
|
|
|
|
### Sidebar Configuration
|
|
|
|
Taking the `typescript` directory as an example, it has the following file structure:
|
|
|
|
::: 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
|
|
|
|
:::
|
|
|
|
#### Automatically Generating Sidebar
|
|
|
|
The simplest configuration method is `sidebar: 'auto'`, the theme will automatically generate the sidebar based on the file structure and sort it according to the encoding of the first character.
|
|
|
|
If you want to modify the order of the automatically generated sidebar, you can add prefixes such as `1.` or `2.` before the directory name or file name.
|
|
|
|
::: file-tree
|
|
|
|
- typescript
|
|
- 1.guide
|
|
- 1.intro.md
|
|
- 2.getting-start.md
|
|
- 2.config
|
|
- 1.config-file.md
|
|
- 2.configuration.md
|
|
- …
|
|
|
|
:::
|
|
|
|
The theme will sort based on the numbers in these prefixes, and the prefix part will not be displayed in the sidebar.
|
|
|
|
#### Customizing the Sidebar
|
|
|
|
Sometimes, automatically generating the sidebar may not fully meet the requirements, and you can customize the sidebar.
|
|
|
|
Here is the type definition for the sidebar:
|
|
|
|
```ts
|
|
type Sidebar = (string | SidebarItem)[]
|
|
|
|
interface SidebarItem {
|
|
/**
|
|
* Sidebar text
|
|
*/
|
|
text?: string
|
|
|
|
/**
|
|
* Sidebar link
|
|
*/
|
|
link?: string
|
|
|
|
/**
|
|
* Sidebar icon
|
|
*/
|
|
icon?: ThemeIcon
|
|
|
|
/**
|
|
* The link prefix for the current group, the link prefix will be concatenated before the `link` in `items`
|
|
* It will only be concatenated when the `link` in `items` is a relative path
|
|
*/
|
|
prefix?: string
|
|
/**
|
|
* Subordinate sidebar groups
|
|
*/
|
|
items?: 'auto' | (string | SidebarItem)[]
|
|
|
|
/**
|
|
* If not specified, the group is not collapsible.
|
|
* If `true`, the group is collapsible and defaults to collapsed.
|
|
* If `false`, the group is collapsible but defaults to expanded.
|
|
*/
|
|
collapsed?: boolean
|
|
}
|
|
```
|
|
|
|
When the type passed in is `string`, it represents the path to a markdown file:
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
'/guide/intro.md',
|
|
'/guide/getting-start.md',
|
|
'/config/config-file.md',
|
|
// …
|
|
]
|
|
})
|
|
|
|
// … other code
|
|
```
|
|
|
|
:::
|
|
|
|
You can also omit the `.md` file suffix and abbreviate it to `/guide/intro`. The theme will parse the corresponding file, obtain the **title** and **page link address**, and convert it into the data format of `{ text: string, link: string }`.
|
|
|
|
When the type passed in is `SidebarItem`:
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
{ text: 'Introduction', link: '/guide/intro' },
|
|
{ text: 'Quick Start', link: '/guide/getting-start' },
|
|
// …
|
|
]
|
|
})
|
|
|
|
// … other code
|
|
```
|
|
|
|
:::
|
|
|
|
You can also nest multiple levels:
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
{
|
|
text: 'Guide',
|
|
prefix: '/guide', // Use prefix to concatenate, you can abbreviate the link in the items below to a relative path
|
|
items: [
|
|
// You can mix string and SidebarItem
|
|
{ text: 'Introduction', link: 'intro' },
|
|
'getting-start',
|
|
],
|
|
},
|
|
{
|
|
text: 'Configuration',
|
|
prefix: '/config',
|
|
items: 'auto', // items is 'auto', the sidebar will be automatically generated based on the file structure of prefix
|
|
},
|
|
]
|
|
})
|
|
|
|
// … other code
|
|
```
|
|
|
|
:::
|
|
|
|
### About `prefix`
|
|
|
|
The purpose of `prefix` is to abbreviate the links in the same level `items` by extracting the common prefix to `prefix`, allowing the theme to complete the full link concatenation for you.
|
|
|
|
It should be noted that only relative path links in `items` will be concatenated with `prefix`, while absolute paths will not be processed.
|
|
|
|
::: code-tabs
|
|
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
{
|
|
prefix: '/guide',
|
|
items: [
|
|
'intro', // Relative path, finally concatenated to /guide/intro
|
|
'/config/config-file', // Absolute path, not concatenated
|
|
{
|
|
text: 'Blog',
|
|
link: 'blog', // Relative path, finally concatenated to /guide/blog
|
|
},
|
|
{
|
|
text: 'Configuration',
|
|
link: '/config', // Absolute path, not concatenated
|
|
}
|
|
]
|
|
}
|
|
]
|
|
})
|
|
```
|
|
|
|
:::
|
|
|
|
At the same time, deep nesting is also supported within `items`, and `prefix` is still supported inside, following the same rules. If `prefix` is a relative path, it will be concatenated with the `prefix` of the upper level, and then with the `link` in the current level `items`. If `prefix` is an absolute path, it will not be concatenated with the `prefix` of the upper level.
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
{
|
|
prefix: '/guide',
|
|
items: [
|
|
'intro', // Relative path, finally concatenated to /guide/intro
|
|
{
|
|
prefix: '/config',
|
|
items: [
|
|
'config-file', // Relative path, finally concatenated to /config/config-file
|
|
'configuration', // Relative path, finally concatenated to /config/configuration
|
|
]
|
|
},
|
|
{
|
|
prefix: 'blog',
|
|
items: [
|
|
'intro', // Relative path, finally concatenated to /guide/blog/intro
|
|
'getting-start', // Relative path, finally concatenated to /guide/blog/getting-start
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
})
|
|
```
|
|
|
|
:::
|
|
|
|
**The criterion for whether it is an absolute path is that if it starts with `/`, it is an absolute path; otherwise, it is a relative path.**
|
|
|
|
:::warning
|
|
It is not recommended to have too many levels in the sidebar. Sidebars with more than 3 levels may lead to poor UI effects.
|
|
:::
|
|
|
|
### Sidebar Icons
|
|
|
|
Adding icons to the sidebar helps to better present the sidebar. Thanks to the powerful open-source icon library [iconify](https://iconify.design/), you can use over `200k` icons by simply adding the `icon` configuration.
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
{
|
|
text: 'Guide',
|
|
prefix: '/guide',
|
|
icon: 'ep:guide', // iconify icon name // [!code hl]
|
|
items: [
|
|
{ text: 'Introduction', link: 'intro', icon: 'ph:info-light' }, // [!code hl]
|
|
],
|
|
},
|
|
]
|
|
})
|
|
```
|
|
|
|
:::
|
|
|
|
You can also use local icons or local images:
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
{
|
|
text: 'Guide',
|
|
prefix: '/guide',
|
|
icon: '/images/guide.png', // iconify icon name // [!code hl]
|
|
items: [
|
|
{ text: 'Introduction', link: 'intro', icon: '/images/info.png' }, // [!code hl]
|
|
// It can also be a remote image
|
|
{ text: 'Quick Start', link: 'getting-start', icon: 'https://cn.vuejs.org/images/logo.png ' },
|
|
],
|
|
},
|
|
]
|
|
})
|
|
```
|
|
|
|
:::
|
|
|
|
**Please note that using local images must start with `/`, indicating a static resource path, which will be loaded from the `.vuepress/public/` directory.**
|
|
|
|
::: file-tree
|
|
|
|
- docs
|
|
- .vuepress
|
|
- public \# Save static resources in this location
|
|
- images
|
|
- guide.png
|
|
- info.png
|
|
- …
|
|
|
|
:::
|
|
|
|
You may have noticed how to configure sidebar icons when `sidebar: auto`. In fact, it's very simple. Just add an `icon` field in the `frontmatter` section of the file.
|
|
|
|
::: code-tabs
|
|
@tab typescript/guide/intro.md
|
|
|
|
```md
|
|
---
|
|
title: Introduction
|
|
icon: ep:guide
|
|
---
|
|
```
|
|
|
|
:::
|
|
|
|
### Sidebar Group Internal Separation
|
|
|
|
Separating items within a group is a relatively niche requirement. It may be more applicable when there are many items in a group, but it is not suitable to split them into multiple groups, or when it is not suitable to split the group into multiple subgroups. It provides a way to use auxiliary text color to display a separator item name at the same level, for simple separation of items.
|
|
|
|
::: code-tabs
|
|
@tab .vuepress/notes.ts
|
|
|
|
```ts
|
|
import { defineNoteConfig } from 'vuepress-theme-plume'
|
|
|
|
const typescript = defineNoteConfig({
|
|
dir: 'typescript',
|
|
link: '/typescript/',
|
|
sidebar: [
|
|
{
|
|
text: 'Guide',
|
|
items: [
|
|
'Project 1',
|
|
'Project 2',
|
|
'Project 3',
|
|
{ text: 'Separator', link: '---' }, // [!code ++]
|
|
'Project 4',
|
|
'Project 5',
|
|
// …
|
|
],
|
|
},
|
|
]
|
|
})
|
|
```
|
|
|
|
:::
|
|
|
|
It is very simple to complete the separation within a group. You just need to insert a `{ text: 'xxxx', link: '---' }` at the appropriate position. The key is to set the `link` to consecutive `---`, at least three `-`. You can define the text arbitrarily and also add icons.
|
|
|
|
## Note Home Page
|
|
|
|
You may have noticed that there is a `README.md` file in the `typescript` directory, which will be displayed as the note home page.
|
|
|
|
::: file-tree
|
|
|
|
- typescript
|
|
- README.md
|
|
- …
|
|
- …
|
|
|
|
:::
|
|
|
|
By default, it is no different from ordinary documentation pages because the theme sets `pageLayout: docs` for all pages by default.
|
|
|
|
But you can directly configure `pageLayout: 'home'`, just like configuring the [site home page](./custom-home.md), to customize a home page for the note!
|
|
|
|
::: code-tabs
|
|
@tab typescript/README.md
|
|
|
|
```md
|
|
---
|
|
pageLayout: home
|
|
config:
|
|
- type: hero
|
|
- type: features
|
|
---
|
|
```
|