【发布时间】:2018-05-01 03:54:18
【问题描述】:
我尝试使用服务器端渲染构建 ReactJs 应用程序 我的客户端和服务器入口点:
const store = createStore(window.__INITIAL_STATE__);
hydrate(
<Provider store={store}>
<BrowserRouter>{renderRoutes(routes)}</BrowserRouter>
</Provider>,
document.querySelector('#root')
);
const app = express();
if (isDev) {
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const config = require('../../webpack.config.js');
const compiler = webpack(config);
app.use(express.static('/public'));
app.use(
webpackDevMiddleware(compiler, {
publicPath: config.output.publicPath,
stats: 'errors-only',
})
);
}
app.get('*', (req, res) => {
const helmet = Helmet.renderStatic();
const htmlAttrs = helmet.htmlAttributes.toComponent();
const bodyAttrs = helmet.bodyAttributes.toComponent();
const context = {};
const data = {};
res.set('content-type', 'text/html');
res.send(
'<!DOCTYPE html>' +
renderToString(
<html {...htmlAttrs}>
<head>
{helmet.title.toComponent()}
{helmet.meta.toComponent()}
{helmet.link.toComponent()}
</head>
<body {...bodyAttrs}>
<div id="root">
<StaticRouter location={req.url} context={context}>
{renderRoutes(routes)}
</StaticRouter>
</div>
<script
dangerouslySetInnerHTML={{
__html: `window.__INITIAL_STATE__ = ${JSON.stringify(data)}`,
}}
/>
<script src="/public/vendor.js" />
<script src="/public/app.js" />
</body>
</html>
)
);
});
和组件:
home.jsx
import React, { Component } from 'react';
class Home extends Component {
render() {
return <div>home</div>;
}
}
export default Home;
当我更改我的组件 Home 并刷新浏览器页面时,我收到此错误:
警告:文本内容不匹配。服务器:“home” 客户端:“home1”
没关系,因为服务器会渲染我的代码的旧版本。如何在服务端重新加载代码,使客户端和服务端版本相等?
【问题讨论】:
-
我遇到了一个非常相似的错误 - 在服务器中使用 staticRouter 在客户端中使用 browserRouter。我有一堆路由,当我直接访问其中一个路由(即不通过客户端路由)时,它可以工作,但会出现 JS 错误。
-
这篇文章可以帮上忙:tylermcginnis.com/react-router-server-rendering 有一个部分出现了同样的错误 - 只需在页面上找到“文本内容不匹配”即可查看。
标签: javascript reactjs express webpack webpack-dev-server