Я пытаюсь выполнить рендеринг на стороне сервера с помощью response-router 4. Я следую приведенному здесь примеру https://reacttraining.com/react-router/web/guides/server-rendering/putting-it-all-вместе
Согласно примеру на сервере мы должны использовать StaticRouter
. Когда я импортирую в соответствии с примером, я вижу StaticRouter как неопределенный
import {StaticRouter} from 'react-router';
Проведя небольшое исследование в Интернете, я обнаружил, что могу использовать react-router-dom
. Теперь мой оператор импорта выглядит так.
import {StaticRouter} from 'react-router-dom';
Однако, когда я запускаю код, я получаю Invariant Violation: Browser history needs a DOM
в браузере.
мой код файла server.js
....
app.get( '*', ( req, res ) => {
const html = fs.readFileSync(path.resolve(__dirname, '../index.html')).toString();
const context = {};
const markup = ReactDOMServer.renderToString(
<StaticRouter location={req.url} context={context} >
<App/>
</StaticRouter>
);
if (context.url) {
res.writeHead(302, {
Location: context.url
})
res.end();
} else {
res.send(html.replace('$react', markup));
}
} );
....
И мой код client / index.js
....
ReactDOM.render((
<BrowserRouter>
<App />
</BrowserRouter>
), root);
....
Обновление v1 свел мой пример к минимуму, но по-прежнему получаю ту же ошибку.
clientIndex.js
import ReactDOM from 'react-dom'
import { BrowserRouter } from 'react-router-dom'
import App from '../App'
ReactDOM.render((
<BrowserRouter>
<App/>
</BrowserRouter>
), document.getElementById('app'))
serverIndex.js
import { createServer } from 'http'
import React from 'react'
import ReactDOMServer from 'react-dom/server'
import { StaticRouter } from 'react-router'
import App from '../App'
createServer((req, res) => {
const context = {}
const html = ReactDOMServer.renderToString(
<StaticRouter
location={req.url}
context={context}
>
<App/>
</StaticRouter>
)
res.write(`
<!doctype html>
<div id="app">${html}</div>
`)
res.end()
}).listen(3000);
App.js
import React from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import routes from "./client/routes";
const App = ( ) => (
<Router>
<Route path="/" exact render={( props ) => ( <div>Helloworld</div> )} />
</Router>
)
export default App;
createMemoryHistory()
и передайте его в свойство 'history' (т. е.<Router history={ history }>
- person Jason Goemaat   schedule 29.03.2017