在同构React Web应用程序中选择性地服务器渲染的最佳方法是什么?

吉尔·伯曼

我想要具有很多内容的网页的最佳性能。特别令人感兴趣的是,在移动设备上,我希望用户尽快查看首屏内容,然后让应用程序尽快启动。

我有一个变量isBrowser,它true在浏览器环境中,但是false在服务器环境中。考虑以下渲染函数:

render() {
  return (
    <div>
      <ContentAboveTheFold />
      { isBrowser && <ContentBelowTheFold /> }
    </div>
  )
}

请注意,通过render()这种方式进行构造,服务器可以呈现的标记更少,通过网络传输的数据更少,并且浏览器在第一次传递时可以呈现的标记也更少。

这个工作正常,但是在控制台上React发出警告

React尝试在容器中使用重用标记,但校验和无效。通常,这意味着您正在使用服务器呈现,并且服务器上生成的标记不是客户端期望的。React注入了新的标记来补偿可以正常工作的标记,但是您已经失去了服务器渲染的许多好处。相反,要弄清为什么生成的标记在客户端或服务器上不同。

在服务器上,React呈现带有校验和的标记,该校验和作为属性嵌入在顶级元素中(例如ex data-react-checksum="941190765")。然后在客户端上,react在第一个渲染后计算校验和,如果它与服务器的校验和不同,它将完全丢弃服务器生成的标记,并将其替换为客户端生成的标记。

作为一种解决方法,我发现在顶层组件的componentDidMount生命周期方法中,可以在下一个动画帧上安排以下操作:

componentDidMount() {
  requestAnimationFrame(() => {
    appIsMounted = true;
    this.forceUpdate();
  });
}

然后,我可以像这样编写我的render方法,并且react不会生成关于校验和的任何警告:

render() {
  return (
    <div>
      <ContentAboveTheFold />
      { appIsMounted && <ContentBelowTheFold /> }
    </div>
  )
}

通过这种方式是否有明显的性能优势?无论哪种情况,首屏上的内容都会显示得一样快,对吗?额外的复杂性是否合理?

旅团

是的,使用requestAnimationFrame / setTimeout更新是正确的方法。

我将其置于状态,而不是使用变量和forceUpdate。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否可以从同构/通用应用程序的服务器端渲染react-toolbox?

同构React应用中的SCSS编译

在Web API中定义同构React路由

在同构React应用中渲染HTML字符串

React + Flux和服务器端渲染?(同构React + Flux)

React / Redux同构/服务器端渲染和媒体查询

构建同构React应用时如何处理SASS的导入?

什么是同构和同构

为什么在服务器上渲染时,同构的Cycle.js应用程序会导致xstream异常?

如何在同构React + React Router应用程序中处理发布请求

在NodeJS服务器的同构react-redux应用程序中设置存储的初始状态(我正在使用react-router)

将React应用程序转换为同构应用程序?

React Redux数据获取:在同构应用中区分浏览器/服务器端方法?

同构服务器端React项目中的路由错误

同构React和JSX-在服务器上将组件呈现为字符串

如何在同构应用程序中将状态从DOM同步到我的React组件?

使用Cloudflare HTTP代理(“橙色云”)进行同构/通用渲染的React 15应用中断

在React JSX中选择性地渲染可选组件属性

从React(同构应用)进行API调用时出现'Access-Control-Allow-Origin'问题

防止 React 应用程序被抓取的最佳方法是什么?

使用asp .net core web api配置react js应用程序的最佳方法是什么

什么是同构应用?

Inferno + TypeScript同构应用

授权从我的react native应用程序到我的节点服务器的API调用的推荐策略是什么?

使用服务器端渲染在React PWA中缓存应用程序外壳

需要建议将React应用程序转换为使用服务器端渲染

为同构JavaScript应用程序定义后备服务

同构React与Gatsby(静态站点)React

带有KOA的React Router的同构React