React:服务器端渲染,不变违规:无效标签:<!doctype html>

Nik*_*nko 6 javascript server-side reactjs

我试图渲染整个页面,React然后将其发送到浏览器。我收到以下错误:

违反不变性:无效标签:<!doctype html>

产生此错误的行是ReactDOMServer.renderToString(el);

fs.readFile('./public/index.html',"utf8", function (err, data){
    /*res.writeHead(200, {'Content-Type': 'text/html','Content-Length':data.length});
    res.write(data);
    res.end();*/
    var el = React.createElement(data);
    console.log("React element was successfully created!");
-----> var html = ReactDOMServer.renderToString(el);
    res.send(html);
  });
Run Code Online (Sandbox Code Playgroud)

html文件如下所示:

<!DOCTYPE html>
<html lang="en">
 <head>
    <meta charset="utf-8">
    ...
    <title>React App</title>
 </head>
 <body>
<div id="root"></div>
<script type="text/javascript" src="bundle.js" charset="utf-8">
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

如何修复错误?任何建议将不胜感激。

更新

我尝试执行以下操作:

var mainData = prepareDataForScatterChart(result);
  const html = ReactDOMServer.renderToString(`<App 
  mainData=${mainData}/>`);
  fs.readFile('./public/index.html',"utf8", function (err, data){
  const document = data.replace(/<div id="app"><\/div>/, `<div 
  id="app">${html}</div>`);
  res.send(document);
Run Code Online (Sandbox Code Playgroud)

错误消失了,但是在加载页面后出现错误,这意味着数据未传递到App.

更新

我通过添加使其在服务器上工作babel-node,但浏览器仍然无法获取数据。因此,在App我打印出来的中mainData,它位于控制台中node,但在浏览器中显示为undefined。这是我现在使用的代码:

const html = ReactDOMServer.renderToString(<App mainData={mainData}/>);
Run Code Online (Sandbox Code Playgroud)

小智 2

import React from 'react';
import { renderToString } from 'react-dom/server';
// import your app component containing the html structure.
import App from './App.jsx';
// Get your data as required.
const mainData = {}; 

res.send(
  renderToString(`<!DOCTYPE html>${<App mainData={mainData}/>}`)
);
Run Code Online (Sandbox Code Playgroud)

使用fs加载静态 html 文件并使用replace()是不必要的,除非您有令人信服的理由这样做。