Reactjs 由于客户端重新呈现DOM并实现服务器端呈现,导致出现空白屏幕 背景

Reactjs 由于客户端重新呈现DOM并实现服务器端呈现,导致出现空白屏幕 背景,reactjs,server-side,client-side,rerender,Reactjs,Server Side,Client Side,Rerender,我正在从事一个基于react的(MERN.io)项目()。该项目的堆栈主要是React、Redux、Webpack、Node和Express。在我实现服务器端渲染之后。我发现,如果没有良好的网络连接,用户可以在渲染完成后看到全屏空白,然后重新渲染。因此,这可能是一个重新渲染的问题。我在MERN.io上进行了测试,并在服务器端渲染字符串中添加了一个额外的div 发件人: 服务器:Server.js 请参见https://github.com/Hashnode/mern-starter ======

我正在从事一个基于react的(MERN.io)项目()。该项目的堆栈主要是React、Redux、Webpack、Node和Express。在我实现服务器端渲染之后。我发现,如果没有良好的网络连接,用户可以在渲染完成后看到全屏空白,然后重新渲染。因此,这可能是一个重新渲染的问题。我在MERN.io上进行了测试,并在服务器端渲染字符串中添加了一个额外的div

发件人:

服务器:Server.js 请参见
https://github.com/Hashnode/mern-starter

======以下是如何重现问题:======= 步骤1: 关闭生产模式上的缩小功能,以便我们可以在浏览器中读取js代码并针对关键代码:

在webpack.config.prod.js(第80~85行)中注释UglifyJSPlugin:

步骤2: 运行mongodb并在项目文件夹中运行
npm运行bs
以运行产品模式

步骤3: 在Chrome浏览器资源中,我们可以看到类似app.cb4f935522b22f1d48a0.js的js文件,我们可以在第10316行附近找到代码

// Initialize store
    var store = (0, _store.configureStore)(window.__INITIAL_STATE__);
    var mountApp = document.getElementById('root');

    (0, _reactDom.render)(_jsx(_reactHotLoader.AppContainer, {}, void 0, _jsx(_App2.default, {
      store: store
    })), mountApp);
步骤4: 在
(0,_reactDom.render)…上设置断点。
,在运行此函数之前,客户端已经使用服务器端呈现的文档呈现了一些内容,跨过此函数后,屏幕将为白色


我试图找到一个解决办法来避免这种重演,但对我来说有点困难,埃文,你成功了吗?
<div id="root"><div>${html}</div></div>
(client) <!-- react-empty: 1 -
(server) <div data-reactroot="
/**
 * Client entry point
 */
import React from 'react';
import { render } from 'react-dom';
import { AppContainer } from 'react-hot-loader';
import App from './App';
import { configureStore } from './store';

// Initialize store
const store = configureStore(window.__INITIAL_STATE__);
const mountApp = document.getElementById('root');

render(
  <AppContainer>
    <App store={store} />
  </AppContainer>,
  mountApp
);

// For hot reloading of react components
if (module.hot) {
  module.hot.accept('./App', () => {
    // If you use Webpack 2 in ES modules mode, you can
    // use <App /> here rather than require() a <NextApp />.
    const NextApp = require('./App').default; // eslint-disable-line 
global-require
    render(
      <AppContainer>
        <NextApp store={store} />
      </AppContainer>,
      mountApp
    );
  });
}
  new ChunkManifestPlugin({
    filename: "chunk-manifest.json",
    manifestVariable: "webpackManifest",
  }),
  // new webpack.optimize.UglifyJsPlugin({
  //   compressor: {
  //     warnings: false,
  //   }
  // }),
],
// Initialize store
    var store = (0, _store.configureStore)(window.__INITIAL_STATE__);
    var mountApp = document.getElementById('root');

    (0, _reactDom.render)(_jsx(_reactHotLoader.AppContainer, {}, void 0, _jsx(_App2.default, {
      store: store
    })), mountApp);