禁用水化/仅部分水化 Next.js 应用程序

Luk*_*kas 9 reactjs hydration next.js

是否可以在 Next.js 中强制使用SSR-only模式并且仅部分地对页面进行水合?假设我有这个应用程序:

组件/dynamic.jsx

export default () => (
  <button onClick={() => console.log("I have been clicked")}>Click me</button>
)
Run Code Online (Sandbox Code Playgroud)

页面/index.jsx

import DynamicComponent from "../components/dynamic.jsx";

export default () => (
  <div>
    <h1>Hello World</h1>
    <p>Lorem ipsum</p>
    <Hydrate>
      <DynamicComponent />
    </Hydrate>
  </div>
);
Run Code Online (Sandbox Code Playgroud)

现在假设我们正在渲染pages/index.jsxNext.js因此它将在服务器上渲染并在客户端上完全水合。出于性能原因(缩小包大小,减少执行时间)并让应用程序更好地播放广告 () 我只想DynamicComponent在客户端上水合,最多只为客户端加载 JavaScript DynamicComponent

这可能与

  • 反应?
  • 下一个.js?

谢谢

Ara*_*oca 8

你可以用一个黑客来做到这一点:

<>
  <StaticContent>
    <h1>Hello World</h1>
    <p>Lorem ipsum</p>
  </StaticContent>
  <DynamicComponent />
</>
Run Code Online (Sandbox Code Playgroud)

StaticContent组件:

import { createElement, useRef, useState, useEffect } from 'react'

function useStaticContent() {
  const ref = useRef(null)
  const [render, setRender] = useState(typeof window === 'undefined')

  useEffect(() => {
    // check if the innerHTML is empty as client side navigation
    // need to render the component without server-side backup
    const isEmpty = ref.current.innerHTML === ''
    if (isEmpty) {
      setRender(true)
    }
  }, [])

  return [render, ref]
}

export default function StaticContent({ children, element = 'div', ...props }) {
  const [render, ref] = useStaticContent()

  // if we're in the server or a spa navigation, just render it
  if (render) {
    return createElement(element, {
      ...props,
      children,
    })
  }

  // avoid re-render on the client
  return createElement(element, {
    ...props,
    ref,
    suppressHydrationWarning: true,
    dangerouslySetInnerHTML: { __html: '' },
  })
}
``
Run Code Online (Sandbox Code Playgroud)

  • 这看起来不像是黑客行为。我认为有人甚至想将它作为一个包使用。 (4认同)
  • 做了一些测试,虽然它确实停止了水合作用,但显然 nextjs 仍然加载该块 - 您仍然可以在网络中看到它。也许这个解决方案可以提供帮助,但我还没有测试它:https://scriptedalchemy.medium.com/next-js-and-lazy-Hydration-keep-the-html-but-drop-the-javascript-846feb2da1f (2认同)