diff --git a/docs/reference/node-api.md b/docs/reference/node-api.md index 0f44d9e956..e4d79f8200 100644 --- a/docs/reference/node-api.md +++ b/docs/reference/node-api.md @@ -495,6 +495,7 @@ interface PageData { frontmatter: PageFrontmatter excerpt: string headers: PageHeader[] + meta: Record } ``` diff --git a/docs/reference/plugin-api.md b/docs/reference/plugin-api.md index c4ca49c8b6..7d0b7b84ab 100644 --- a/docs/reference/plugin-api.md +++ b/docs/reference/plugin-api.md @@ -186,7 +186,7 @@ module.exports = { ```js module.exports = { extendsPageData: (page) => { - const meta = 'foobar' + const meta = { foo: 'bar', path: page.pathInferred } return { meta } }, } @@ -196,11 +196,15 @@ In client component: ```js import { usePageData } from '@vuepress/client' +import { useResolveRouteWithRedirect } from '@vuepress/theme-default' export default { setup() { const page = usePageData() - console.log(page.value.meta) // foobar + const route = useResolveRouteWithRedirect('/') + + console.log(page.value.meta.foo) // 'bar' + console.log(route.meta.path) // '/' }, } ``` diff --git a/docs/zh/reference/node-api.md b/docs/zh/reference/node-api.md index 31e61cb533..4444d6947c 100644 --- a/docs/zh/reference/node-api.md +++ b/docs/zh/reference/node-api.md @@ -493,6 +493,7 @@ interface PageData { frontmatter: PageFrontmatter excerpt: string headers: PageHeader[] + meta: Record } ``` diff --git a/docs/zh/reference/plugin-api.md b/docs/zh/reference/plugin-api.md index 5ce0c49963..ead9ffffb8 100644 --- a/docs/zh/reference/plugin-api.md +++ b/docs/zh/reference/plugin-api.md @@ -187,7 +187,7 @@ module.exports = { ```js module.exports = { extendsPageData: (page) => { - const meta = 'foobar' + const meta = { foo: 'bar', path: page.pathInferred } return { meta } }, } @@ -197,11 +197,15 @@ module.exports = { ```js import { usePageData } from '@vuepress/client' +import { useResolveRouteWithRedirect } from '@vuepress/theme-default' export default { setup() { const page = usePageData() - console.log(page.value.meta) // foobar + const route = useResolveRouteWithRedirect('/') + + console.log(page.value.meta.foo) // 'bar' + console.log(route.meta.path) // '/' }, } ``` diff --git a/packages/@vuepress/core/__tests__/page/resolvePageData.spec.ts b/packages/@vuepress/core/__tests__/page/resolvePageData.spec.ts index aaea3317af..314c4073a1 100644 --- a/packages/@vuepress/core/__tests__/page/resolvePageData.spec.ts +++ b/packages/@vuepress/core/__tests__/page/resolvePageData.spec.ts @@ -17,6 +17,7 @@ describe('core > page > resolvePageData', () => { frontmatter: {}, excerpt: '', headers: [], + meta: {}, } as unknown) as Page expect( diff --git a/packages/@vuepress/core/src/app/prepare/preparePagesRoutes.ts b/packages/@vuepress/core/src/app/prepare/preparePagesRoutes.ts index b083eb2648..36c79f154a 100644 --- a/packages/@vuepress/core/src/app/prepare/preparePagesRoutes.ts +++ b/packages/@vuepress/core/src/app/prepare/preparePagesRoutes.ts @@ -4,8 +4,8 @@ import type { App } from '../../types' type RouteItem = [ name: string, path: string, - title: string, - redirects: string[] + redirects: string[], + meta: Record ] /** @@ -17,9 +17,9 @@ import { Vuepress } from '@vuepress/client/lib/components/Vuepress' const routeItems = [\ ${app.pages - .map(({ key, path, pathInferred, filePathRelative, title }) => { + .map(({ key, path, pathInferred, filePathRelative, data: { meta = {} } }) => { const redirects: string[] = [] - const routeItem: RouteItem = [key, path, title, redirects] + const routeItem: RouteItem = [key, path, redirects, meta] // paths that should redirect to this page const redirectsSet = new Set() @@ -60,13 +60,13 @@ ${app.pages ] export const pagesRoutes = routeItems.reduce( - (result, [name, path, title, redirects]) => { + (result, [name, path, redirects, meta]) => { result.push( { name, path, component: Vuepress, - meta: { title }, + meta, }, ...redirects.map((item) => ({ path: item, diff --git a/packages/@vuepress/core/src/page/resolvePageData.ts b/packages/@vuepress/core/src/page/resolvePageData.ts index 6eca9ee54b..9c21fc829c 100644 --- a/packages/@vuepress/core/src/page/resolvePageData.ts +++ b/packages/@vuepress/core/src/page/resolvePageData.ts @@ -19,6 +19,7 @@ export const resolvePageData = async ({ frontmatter, excerpt, headers, + meta: {}, } // plugin hook: extendsPageData @@ -26,7 +27,9 @@ export const resolvePageData = async ({ page, app ) - extendsPageData.forEach((item) => Object.assign(data, item)) + extendsPageData.forEach((item) => + Object.assign(data, { item, meta: { ...data.meta, ...item.meta } }) + ) return data } diff --git a/packages/@vuepress/shared/src/types/page.ts b/packages/@vuepress/shared/src/types/page.ts index 2272729e54..1892e2c220 100644 --- a/packages/@vuepress/shared/src/types/page.ts +++ b/packages/@vuepress/shared/src/types/page.ts @@ -51,6 +51,11 @@ export type PageData< * Headers of the page */ headers: PageHeader[] + + /** + * Route meta data of the page + */ + meta?: Record } /** diff --git a/packages/@vuepress/theme-default/src/node/defaultTheme.ts b/packages/@vuepress/theme-default/src/node/defaultTheme.ts index fa4ec923cb..b06923dee0 100644 --- a/packages/@vuepress/theme-default/src/node/defaultTheme.ts +++ b/packages/@vuepress/theme-default/src/node/defaultTheme.ts @@ -44,7 +44,11 @@ export const defaultTheme: Theme = ({ clientAppSetupFiles: path.resolve(__dirname, '../client/clientAppSetup.js'), // use the relative file path to generate edit link - extendsPageData: ({ filePathRelative }) => ({ filePathRelative }), + // store title to display navbar and sidebar + extendsPageData: ({ filePathRelative, title }) => ({ + filePathRelative, + meta: { title }, + }), plugins: [ [