webpack-4 - SSR : dynamic import in react app how to deal with html miss match when component is loading on the client

标签 webpack-4 server-side-rendering code-splitting dynamic-import react-16

由于 webpack 4 和 react-loadable,我刚刚开始使用代码拆分和动态导入在服务器端渲染一个 react 16 应用程序。

我的问题可能听起来很愚蠢,但有些东西我不太明白。

在服务器端,我正在等待 webpack 已加载所有模块,然后再将 html 吐出给客户端。

在客户端,在渲染加载的组件之前,我渲染了一种加载组件。

所以基本上服务器渲染加载的组件:

<div>loaded component</div>

客户端水合加载组件:
<div>loading...</div>

显然,问题在于 React 在 hydrate() 之后提示,因为服务器和客户端之间存在匹配错误。

在几秒钟内,客户端首先呈现
<div>loading...</div>

而服务器已经渲染并发送给客户端,加载组件的 html。

有人可以启发我吗?它是如何工作的?
加载组件时如何防止在第一次渲染时出现不匹配?

最佳答案

看起来像 你没有预加载客户的同意。

Loadable.preloadReady().then(() => {
  ReactDOM.hydrate(<App/>, document.getElementById('app'));
});

这也是 avoid 的必需步骤。 hydration mismatch .

原因:

此问题是在您的客户端上引起的,因为初始请求,您的 chunks没有加载,所以 html output对于那些组件将是 loading...而不是 component content本身。
只有在获取并加载 block 后,此初始状态 loading...将替换为所需的内容。

所以,Loadable.preloadReady方法创建一个 Promise那将是 resolved一旦应用程序 block 被预加载,以这种方式,拥有初始阶段所需的所有 Assets ,ReactDOM.hydrate将生成与您的服务器相同的输出。

提示

另外我建议你看看React Loadable SSR Add-on ,非常好用add-on这将增强您的服务器端 Assets 管理,为您提供与 CSR(客户端渲染)相同的好处。

Server Side Render add-on for React Loadable. Load splitted chunks was never that easy.



https://github.com/themgoncalves/react-loadable-ssr-addon

关于webpack-4 - SSR : dynamic import in react app how to deal with html miss match when component is loading on the client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53195429/

相关文章:

javascript - Webpack + React router动态路由——如何用require.ensure捕获require加载异常

webpack - 如何配置 webpack 4 以防止入口点列表中的 block 出现在任何其他包中?

node.js - 如何在 Node 后端使用浏览器库

node.js - Express Handlebars 不会渲染数据

javascript - 如何将庞大的 React 应用程序拆分为多个小模块

css - 有没有办法用webpack动态加载css文件

javascript - HTML webpack 插件未将脚本注入(inject)模板

css - 网络包 4 : How to get CSS source maps working with LESS?

javascript - 配置 SourceMapDevToolPlugin 生成 "source-map"

authentication - 如何使用 Nuxtjs 实现 Auth0 服务器端?