【问题标题】:gatsby-react-helmet generating empty <title> on SSRgatsby-react-helmet 在 SSR 上生成空 <title>
【发布时间】:2020-04-27 18:11:58
【问题描述】:

我的 Gatsby 网站没有在 SSR 上生成正确的标题标签。当我建立网站时,我在生成的文件上得到的所有文件都是&lt;title data-react-helmet="true"&gt;&lt;/title&gt;。我很感激能帮助您找到问题并解决,因为经过长时间的调试过程后,我不知道可能是哪个问题。

相关文件:

package.json

...
"dependencies": {
  "gatsby": "^2.19.45",
  "gatsby-image": "^2.2.44",
  "gatsby-plugin-manifest": "^2.2.48",
  "gatsby-plugin-react-helmet": "^3.2.2",
  "gatsby-plugin-sharp": "^2.4.13",
  "gatsby-plugin-sitemap": "^2.3.1",
  "gatsby-plugin-typescript": "^2.3.3",
  "gatsby-source-filesystem": "^2.1.56",
  "gatsby-source-graphql": "^2.2.0",
  "react": "^16.12.0",
  "react-dom": "^16.12.0",
  "react-helmet": "^6.0.0",
}
...

gatsby.config.js

  plugins: [
    `gatsby-plugin-react-helmet`,
    ...
  ]

(gatsby-plugin-offline 已禁用)

Seo.tsx

import React from "react"
import { Helmet } from "react-helmet"
import { useStaticQuery, graphql } from "gatsby"

interface Props {
  title: string
  description?: string
  image?: string
}

const SEO = ({ title, description, image }: Props) => {
  const { site } = useStaticQuery(
    graphql`
      query {
        site {
          siteMetadata {
            title
            description
            image
            siteUrl
          }
        }
      }
    `
  )

  const metaDescription = description || site.siteMetadata.description
  const shareImage = image || site.siteMetadata.image
  const url = site.siteMetadata.siteUrl

  return (
    <Helmet defer={false}>
      <title>{title}</title>
      <meta name="description" content={metaDescription} />
      <meta name="image" content={shareImage} />
      <link rel="canonical" href={url} />
      <meta property="og:url" content={url} />
      <meta property="og:type" content="website" />
      <meta property="og:title" content={title} />
      <meta property="og:description" content={metaDescription} />
      <meta property="og:image" content={shareImage} />
      <meta name="twitter:card" content="summary_large_image" />
      <meta name="twitter:title" content={title} />
      <meta name="twitter:description" content={metaDescription} />
      <meta name="twitter:image" content={shareImage} />
    </Helmet>
  )
}

export default SEO

&lt;title&gt;{title}&lt;/title&gt; 更改为&lt;Helmet title={title}&gt; 或删除defer={true} 不会改变结果中的任何内容。

gatsby-ssr.js

import React from "react"
import { Helmet } from "react-helmet"

export const onRenderBody = (
  { setHeadComponents, setHtmlAttributes, setBodyAttributes },
  pluginOptions
) => {
  const helmet = Helmet.renderStatic()
  setHtmlAttributes(helmet.htmlAttributes.toComponent())
  setBodyAttributes(helmet.bodyAttributes.toComponent())
  setHeadComponents([
    helmet.title.toComponent(),
    helmet.link.toComponent(),
    helmet.meta.toComponent(),
    helmet.noscript.toComponent(),
    helmet.script.toComponent(),
    helmet.style.toComponent()
  ])
}

我仍然有一个空的 srr 文件的问题。

在任何给定的页面上,我都会调用 SEO 标签,例如:

<SEO title="Hello World" description="Foo Bar" />

【问题讨论】:

    标签: javascript reactjs gatsby server-side-rendering react-helmet


    【解决方案1】:

    你能试试像 title = {title} 这样的东西,把它作为头盔的道具,而不是像上面那样的标题标签

      <Helmet
          htmlAttributes={{
            lang,
          }}
          title={title}
          titleTemplate={`%s | ${site.siteMetadata.title}`}
          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)}
        />
    

    Gatsby Starter 默认模板有一个很好的 SEO 组件,您也可以参考。

    【讨论】:

    • 我之前实际上是使用它作为 seo 组件,结果相同。 SSR 上相同的空白标题(没有其他标签)。
    【解决方案2】:

    找到了解决办法。 redux-persist-store 的问题导致 SSR 无法工作。

    完整的解决方案可以在这里的另一个问题中找到:Gatsby not generating correct static HTML files

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多