我知道 SSR 会在服务器上呈现内容,因此它
允许谷歌抓取页面,但不会排除 api 调用?
我也知道 Gatsby 建立静态网站,但对我来说
不起作用,因为 api 调用是动态的,无法构建
进入静态网站。
我认为你误解了盖茨比的工作原理。
总而言之,Gatsby 从动态数据(API 调用)生成静态页面,因此,当您运行 gatsby develop 或 gatsby build 命令时,Gatsby 从源(在本例中从您的 API)获取数据并生成动态页面(mysite.com/blog/1、mysite.com/blog/2 等)。
此数据是静态的,这意味着这些来源的每次更改都会迫使您重新获取数据以显示更改(在生产中意味着新部署)但是,一旦您的页面是静态构建的,您就可以动态构建您的 SEO 数据。
这是他们曾经在旧网站上使用的旧版 Gatsby 的工作流程,但我觉得它非常不言自明:
在构建时,您的网站是静态生成的,因此您可以使用自定义 SEO 组件或任何您想要的东西来完全自定义您的 SEO 要求。大多数启动器都带有一个可以使用的SEO 组件:
function Seo({ description, lang, meta, title }) {
const { site } = useStaticQuery(
graphql`
query {
site {
siteMetadata {
title
description
author
}
}
}
`
)
const metaDescription = description || site.siteMetadata.description
const defaultTitle = site.siteMetadata?.title
return (
<Helmet
htmlAttributes={{
lang,
}}
title={title}
titleTemplate={defaultTitle ? `%s | ${defaultTitle}` : null}
meta={[
{
name: `description`,
content: metaDescription,
},
{
property: `og:title`,
content: title,
},
{
property: `og:description`,
content: metaDescription,
},
{
property: `og:type`,
content: `website`,
},
{
name: `twitter:card`,
content: `summary`,
},
{
name: `twitter:creator`,
content: site.siteMetadata?.author || ``,
},
{
name: `twitter:title`,
content: title,
},
{
name: `twitter:description`,
content: metaDescription,
},
].concat(meta)}
/>
)
}
由于该组件分别采用description、lang、meta 和title 作为props,您可以将其添加到您的博客模板中以获取将静态构建的动态数据,这意味着,当您的网站被部署时,该数据将已经构建,因此 Google 抓取工具会立即获取它。
const YourBlogPostTemplate = ({ data }) =>{
return <article>
<SEO title={data.allAPIData.frontmatter.title} />
<h1>I'm the title: {data.allAPIData.frontmatter.title}</h1>
</article>
}
注意:我不会完全自定义它以避免扩展答案,但请理解。
SEO 组件将采用 title 和构建时的其余字段。
在构建页面之前获取您的 API 调用,因此,在构建页面时,您的数据已经是静态的。