javascript - 预期的服务器 HTML 包含匹配项在服务器端渲染
问题描述
我是服务器端渲染的新手。我正在尝试像下面那样实现它,但是它显示错误。
索引.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<div id="root"></div>
</body>
</html>
index.js
import React from 'react';
import ReactDOM from 'react-dom'
import { createStore, applyMiddleware, compose } from 'redux';
import thunk from 'redux-thunk'
import { Provider } from 'react-redux'
import rootReducer from './reducers'
import './index.css'
import Main from './Main'
const preloadedState = window.__PRELOADED_STATE__
delete window.__PRELOADED_STATE__
const store = createStore(
rootReducer,
preloadedState,
applyMiddleware(thunk)
);
ReactDOM.hydrate(
<Provider store={store}>
<Main />
</Provider>,
document.getElementById('root')
);
服务器.js
import express from 'express';
import open from 'open';
import rootReducer from '../src/reducers'
import Main from '../src/Main';
import { createStore } from 'redux';
import { Provider } from 'react-redux';
import { renderToString } from 'react-dom/server'
var app = express();
const port = 4000;
app.use(express.static('dist'));
app.get('/', (req, res) => {
const store = createStore(rootReducer)
const html = renderToString(
<Provider store={store}>
<Main />
</Provider>
)
const preloadedState = store.getState();
res.send(renderFullPage(html, preloadedState))
});
function renderFullPage(html, preloadedState) {
return `
<!doctype html>
<html>
<body>
<div id="root">${html}</div>
<script>
window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace(/</g,'\\u003c')}
</script>
</body>
</html>
`
}
app.listen(port, function (err) {
if (err) {
console.log(err);
} else {
open('http://localhost:' + port);
}
})
当我尝试运行 SSR 时,它显示以下错误。我不明白我做错了什么?
Warning: Expected server HTML to contain a matching <div> in <div>.
任何帮助将不胜感激。
编辑:
import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Content from './components/Content';
import PageNotFound from './components/PageNotFound'
import Movie from './components/Movie';
class Main extends Component {
render() {
return (
<div className="main">
<Router>
<Switch>
<Route exact path='/' component={Content} />
<Route path='/search/:query' component={Content} />
<Route path='/film/:id' component={Movie} />
<Route path='*' component={PageNotFound} />
</Switch>
</Router>
</div>
);
}
}
export default Main;
这不是给定链接的重复,因为我正在使用 SSR。那为什么我在使用 SSR 时应该使用渲染而不是水合物?
解决方案
推荐阅读
- python - Python:For 循环和列表
- c# - Regex.IsMatch returning True which is not correct
- angular - Insert some element according to Average number
- firebase - NoSQL 'like' 模型结构
- c - 为什么加密函数 'crypt()' 不接受我的 nonce,尽管 nonce 是一个有效的、两个字符长的字符串?
- javascript - 我可以从子组件获取计算数据到父组件吗?
- node.js - Firebase auth getUser 多个用户
- reactjs - 为什么函数作为 React child 无效?
- java - 如何在java中获取流编写器的长度
- php - Angularjs 中的 JSONP