mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-24 22:46:57 +02:00
refactor(theme): use JSON-LD instead of microdata for blog structured data (#9669)
Co-authored-by: Joshua Chen <sidachen2003@gmail.com> Co-authored-by: sebastien <lorber.sebastien@gmail.com>
This commit is contained in:
parent
8abd1899a6
commit
60d9346965
23 changed files with 348 additions and 68 deletions
20
packages/docusaurus-plugin-content-blog/src/client/index.ts
Normal file
20
packages/docusaurus-plugin-content-blog/src/client/index.ts
Normal file
|
@ -0,0 +1,20 @@
|
|||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
import useRouteContext from '@docusaurus/useRouteContext';
|
||||
import type {BlogMetadata} from '@docusaurus/plugin-content-blog';
|
||||
|
||||
export function useBlogMetadata(): BlogMetadata {
|
||||
const routeContext = useRouteContext();
|
||||
const blogMetadata = routeContext?.data?.blogMetadata;
|
||||
if (!blogMetadata) {
|
||||
throw new Error(
|
||||
"useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context",
|
||||
);
|
||||
}
|
||||
return blogMetadata as BlogMetadata;
|
||||
}
|
|
@ -42,6 +42,7 @@ import type {
|
|||
BlogTags,
|
||||
BlogContent,
|
||||
BlogPaginated,
|
||||
BlogMetadata,
|
||||
} from '@docusaurus/plugin-content-blog';
|
||||
|
||||
export default async function pluginContentBlog(
|
||||
|
@ -182,6 +183,7 @@ export default async function pluginContentBlog(
|
|||
blogArchiveComponent,
|
||||
routeBasePath,
|
||||
archiveBasePath,
|
||||
blogTitle,
|
||||
} = options;
|
||||
|
||||
const {addRoute, createData} = actions;
|
||||
|
@ -257,6 +259,15 @@ export default async function pluginContentBlog(
|
|||
),
|
||||
);
|
||||
|
||||
const blogMetadata: BlogMetadata = {
|
||||
blogBasePath: normalizeUrl([baseUrl, routeBasePath]),
|
||||
blogTitle,
|
||||
};
|
||||
const blogMetadataPath = await createData(
|
||||
`blogMetadata-${pluginId}.json`,
|
||||
JSON.stringify(blogMetadata, null, 2),
|
||||
);
|
||||
|
||||
// Create routes for blog entries.
|
||||
await Promise.all(
|
||||
blogPosts.map(async (blogPost) => {
|
||||
|
@ -276,6 +287,9 @@ export default async function pluginContentBlog(
|
|||
sidebar: aliasedSource(sidebarProp),
|
||||
content: metadata.source,
|
||||
},
|
||||
context: {
|
||||
blogMetadata: aliasedSource(blogMetadataPath),
|
||||
},
|
||||
});
|
||||
|
||||
blogItemsToMetadata[id] = metadata;
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
/// <reference types="@docusaurus/module-type-aliases" />
|
||||
|
||||
declare module '@docusaurus/plugin-content-blog' {
|
||||
import type {LoadedMDXContent} from '@docusaurus/mdx-loader';
|
||||
import type {MDXOptions} from '@docusaurus/mdx-loader';
|
||||
|
@ -466,6 +468,13 @@ yarn workspace v1.22.19image` is a collocated image path, this entry will be the
|
|||
blogTagsListPath: string;
|
||||
};
|
||||
|
||||
export type BlogMetadata = {
|
||||
/** the path to the base of the blog */
|
||||
blogBasePath: string;
|
||||
/** title of the overall blog */
|
||||
blogTitle: string;
|
||||
};
|
||||
|
||||
export type BlogTags = {
|
||||
[permalink: string]: BlogTag;
|
||||
};
|
||||
|
@ -537,6 +546,7 @@ declare module '@theme/BlogPostPage' {
|
|||
BlogPostFrontMatter,
|
||||
BlogSidebar,
|
||||
PropBlogPostContent,
|
||||
BlogMetadata,
|
||||
} from '@docusaurus/plugin-content-blog';
|
||||
|
||||
export type FrontMatter = BlogPostFrontMatter;
|
||||
|
@ -548,6 +558,8 @@ declare module '@theme/BlogPostPage' {
|
|||
readonly sidebar: BlogSidebar;
|
||||
/** Content of this post as an MDX component, with useful metadata. */
|
||||
readonly content: Content;
|
||||
/** Metadata about the blog. */
|
||||
readonly blogMetadata: BlogMetadata;
|
||||
}
|
||||
|
||||
export default function BlogPostPage(props: Props): JSX.Element;
|
||||
|
@ -557,6 +569,10 @@ declare module '@theme/BlogPostPage/Metadata' {
|
|||
export default function BlogPostPageMetadata(): JSX.Element;
|
||||
}
|
||||
|
||||
declare module '@theme/BlogPostPage/StructuredData' {
|
||||
export default function BlogPostStructuredData(): JSX.Element;
|
||||
}
|
||||
|
||||
declare module '@theme/BlogListPage' {
|
||||
import type {Content} from '@theme/BlogPostPage';
|
||||
import type {
|
||||
|
@ -579,6 +595,28 @@ declare module '@theme/BlogListPage' {
|
|||
export default function BlogListPage(props: Props): JSX.Element;
|
||||
}
|
||||
|
||||
declare module '@theme/BlogListPage/StructuredData' {
|
||||
import type {Content} from '@theme/BlogPostPage';
|
||||
import type {
|
||||
BlogSidebar,
|
||||
BlogPaginatedMetadata,
|
||||
} from '@docusaurus/plugin-content-blog';
|
||||
|
||||
export interface Props {
|
||||
/** Blog sidebar. */
|
||||
readonly sidebar: BlogSidebar;
|
||||
/** Metadata of the current listing page. */
|
||||
readonly metadata: BlogPaginatedMetadata;
|
||||
/**
|
||||
* Array of blog posts included on this page. Every post's metadata is also
|
||||
* available.
|
||||
*/
|
||||
readonly items: readonly {readonly content: Content}[];
|
||||
}
|
||||
|
||||
export default function BlogListPageStructuredData(props: Props): JSX.Element;
|
||||
}
|
||||
|
||||
declare module '@theme/BlogTagsListPage' {
|
||||
import type {BlogSidebar} from '@docusaurus/plugin-content-blog';
|
||||
import type {TagsListItem} from '@docusaurus/utils';
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue