Next 带有静态页面、s-s-r 页面和客户端渲染的 JS Seo

Posted

技术标签:

【中文标题】Next 带有静态页面、s-s-r 页面和客户端渲染的 JS Seo【英文标题】:Next JS Seo with static pages, s-s-r Pages and Client Side rendering 【发布时间】:2021-11-03 00:36:14 【问题描述】:

我正在将 Apollo GraphQL 与 Next JS 一起使用,我可以通过三种方式查询我的数据并呈现它。一种是使用静态渲染,使用 getStaticProps() 看起来像这样。

export async function getStaticProps() 
    const  data  = await client.query(
      query: gql`
        query Countries 
          countries 
            code
            name
            emoji
          
        
      `,
    );

    return 
      props: 
        countries: data.countries.slice(0, 4),
      ,
   ;

这很好,但我也可以像这样使用getServerSideProps

export async function getServerSideProps() 
  const  data  = await client.query(
    query: gql`
      query Countries 
        countries 
          code
          name
          emoji
        
      
    `,
  );

  return 
    props: 
      countries: data.countries.slice(0, 4),
    ,
  ;

最后我可以使用客户端渲染

function MyApp( Component, pageProps ) 
  return (
    <ApolloProvider client=client>
      <Component ...pageProps />
    </ApolloProvider>
  );


// components/ClientOnly.js

import  useEffect, useState  from "react";

export default function ClientOnly( children, ...delegated ) 
  const [hasMounted, setHasMounted] = useState(false);

  useEffect(() => 
    setHasMounted(true);
  , []);

  if (!hasMounted) 
    return null;
  

  return <div ...delegated>children</div>;


// components/Countries.js

import  useQuery, gql  from "@apollo/client";
import styles from "../styles/Home.module.css";

const QUERY = gql`
  query Countries 
    countries 
      code
      name
      emoji
    
  
`;

export default function Countries() 
  const  data, loading, error  = useQuery(QUERY);

  if (loading) 
    return ...
  

  if (error) 
    console.error(error);
    return null;
  

  const countries = data.countries.slice(0, 4);

  return (
    <div className=styles.grid>
      countries.map((country) => (
        ...
          <p>
            country.code - country.emoji
          </p>
        </div>
      ))
    </div>
  );

当我想提高性能时,问题就出现了,假设我的主页有一些不会更新太多的静态内容,所以我可以使用getStaticProps(),但它也需要一些数据需要getServerSideProps(),因为数据会经常变化。

接下来,您不能在同一页面上将它们相互结合使用,所以我的想法是我可以将它们与客户端呈现的组件一起使用,例如 &lt;ClientOnly&gt;&lt;Countries&gt;&lt;/ClientOnly&gt;,但我一直在阅读完成的代码客户端呈现不会'不会被 SEO 阅读。

我想我只是担心通过getServerSiderProps() 做所有事情,因为我认为可能会有很多请求,所以我会尝试设计代码以使用静态和动态,但我仍然希望 SEO 工作适当地。这个问题在 NEXT JS github 中有部分概述 https://github.com/vercel/next.js/discussions/11424

任何想法都将不胜感激。

我应该只通过getServerSideProps() 获取我的所有查询吗?

【问题讨论】:

【参考方案1】:

如果您的网站可以在构建新版本时显示缓存内容,您应该使用带有 revalidate 属性的 getStaticProps()。这将触发称为 ISR(增量静态再生)的功能。

如果 SEO 对您的网站很重要,请尽量避免使用 getServerSideProps()。

阅读更多:https://vercel.com/docs/next.js/incremental-static-regeneration

【讨论】:

以上是关于Next 带有静态页面、s-s-r 页面和客户端渲染的 JS Seo的主要内容,如果未能解决你的问题,请参考以下文章

Next Js API:使用 s-s-r 反应页面的响应

React-tooltip 和 Next.js s-s-r 问题

Next.js 与 FortAwesome 和 s-s-r

使用 next.js 与传统 s-s-r 进行服务器端渲染

Apollo Client GraphQL 在 Next.js getStaticProps 上创建静态页面

带有 Firebase 身份验证的 Nuxt s-s-r 身份验证防护