【问题标题】:Disable hydration / only partially hydrate a Next.js app禁用水合/仅部分水合 Next.js 应用程序
【发布时间】:2019-08-18 23:11:00
【问题描述】:

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

components/dynamic.jsx

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

pages/index.jsx

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

export default () => (
  <div>
    <h1>Hello World</h1>
    <p>Lorem ipsum</p>
    <Hydrate>
      <DynamicComponent />
    </Hydrate>
  </div>
);

现在假设我们正在渲染pages/index.jsxNext.js,因此它将在服务器上渲染并在客户端完全水合。出于性能原因(缩小捆绑包大小,减少执行时间)并让应用程序在广告中播放得更好(????)我只想在客户端上补充DynamicComponent,充其量只加载@987654329的JavaScript @给客户。

这可能吗

  • 反应?
  • Next.js?

谢谢

【问题讨论】:

标签: reactjs next.js hydration


【解决方案1】:

你可以通过 hack 做到这一点:

<>
  <StaticContent>
    <h1>Hello World</h1>
    <p>Lorem ipsum</p>
  </StaticContent>
  <DynamicComponent />
</>

还有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: '' },
  })
}
``

【讨论】:

  • 这看起来不像黑客。我想有人甚至想把它当作一个包来使用。
  • 随意放在包裹上
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多