下一个js-在某些页面上禁用服务器端渲染

gig*_*igs 10 reactjs server-side-rendering next.js ssr

是否可以使用Next js在某些页面上禁用ssr?例如,我有一个带有产品说明的页面,在该页面上我使用ssr进行SEO,但我也有一个页面,其中列出了可以过滤的项目或产品,对于该页面,我不想使用ssr,因为页面每次都会动态生成,如何在此页面上禁用ssr?

小智 18

延迟加载组件并禁用SSR。
https://github.com/zeit/next.js#with-no-ssr

import dynamic from 'next/dynamic'

const DynamicComponentWithNoSSR = dynamic(() => import('../components/List'), {
  ssr: false
})

export default () => (
  <div>
    <DynamicComponentWithNoSSR />
  </div>
)
Run Code Online (Sandbox Code Playgroud)

  • 如何在页面级别做到这一点? (3认同)

Sem*_*iev 13

这是一个迟到的答案,但万一有人遇到这个问题:

const isServer = () => typeof window === `undefined`;

const Page = () => isServer() ? null : (

  <> 
      <YourClientSideComponent />
  </>
);
Run Code Online (Sandbox Code Playgroud)

这是在“页面”级别。isServer()防止在服务器端渲染任何内容。如果您愿意,您也可以在组件级别阻止 ssr:

const isServer = () => typeof window === `undefined`;

const Page = () =>(

  <> 
      { !isServer() && <YourClientSideComponent /> }
  </>
);
Run Code Online (Sandbox Code Playgroud)

  • 这将在服务器渲染和客户端渲染之间造成不匹配,这实际上并不会禁用渲染。 (3认同)

Eri*_*fer 8

dynamic()函数也可以在不动态导入的情况下使用:

import dynamic from 'next/dynamic'
import React from 'react'

const NoSsr = props => (
  <React.Fragment>{props.children}</React.Fragment>
)

export default dynamic(() => Promise.resolve(NoSsr), {
  ssr: false
})
Run Code Online (Sandbox Code Playgroud)

包装在该组件中的所有内容在SSR源中都不可见。

Contact me at <NoSsr>email@example.com</NoSsr>
Run Code Online (Sandbox Code Playgroud)

  • 非常棒,因为您也可以将它与“_app”一起使用。 (3认同)
  • 效果很好,可以用来将 &lt;Component /&gt; 包装在 _app.js 中进行调试 (2认同)

Riz*_*han 8

把它放在你的 _app.tsx 上

import type { AppProps } from "next/app";
import dynamic from "next/dynamic";
import React from "react";

const App = ({ Component, pageProps }: AppProps) => {
  return <Component {...pageProps} />;
};

export default dynamic(() => Promise.resolve(App), {
  ssr: false,
});
Run Code Online (Sandbox Code Playgroud)

  • 这会禁用整个项目的 SSR,并且 SSR 的优势(例如 SEO 友好页面)会丢失。(只是为了记住) (9认同)

Sea*_*256 5

完全基于 Erik Hofer 的答案,您可以创建一个 HOC 来包装您的页面或其他组件。

import dynamic from 'next/dynamic';
import React from 'react';

const withNoSSR = (Component: React.FunctionComponent) => dynamic(
    () => Promise.resolve(Component),
    { ssr: false },
);

export default withNoSSR;
Run Code Online (Sandbox Code Playgroud)

然后用作:

import React from 'react';
import withNoSSR from './withNoSSR';

function SomePage() {
    return (
        <div>Only renders in the browser</div>
    );
}

// wrap with HOC on export
export default withNoSSR(SomePage);
Run Code Online (Sandbox Code Playgroud)