在React.js中使用renderToString使用express启用服务器端渲染时出错

问题描述 投票:0回答:1

这是我的服务器/server.js:


import express from "express";
import React from "react";
import ReactDOMServer, { renderToString } from 'react-dom/server';

import {App} from '../src/App';

const PORT = 4000;
const app = express();

app.use(express.static('./build', {index: false}));

app.get('/', (req, res) => {
        const reactApp = renderToString(
            <App/>
            //<h2>Works using a simple h2</h2>
        );

        return res.send(
            `
            <html>
                <body>
                    <div id="root">${reactApp}</div>
                </body>
            </html>
            `
        );
});

app.listen(PORT, () => {
  console.log(`Server listening on port ${PORT}`);
});

我的服务器/index.js:

// server/index.js
require("ignore-styles");

require("@babel/register")({
  ignore: [/(node_modules)/],
  presets: ["@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript"],
});

require("./server");

App.tsx:

import React from 'react';
import './App.css';
import Home from './components/Home/Home';

function App () {
  return (
     <div className="App">
       <Home/>
     </div>
  );
}

export default App;

最后,运行命令后:

node server/index.js

我收到了这个错误

错误:元素类型无效:需要一个字符串(对于内置组件)或一个类/函数(对于复合组件),但得到:未定义。您可能忘记从定义它的文件中导出组件,或者您可能混淆了默认导入和命名导入。

reactjs express babeljs server-side-rendering
1个回答
0
投票

在您的服务器文件中,将导入更改为

import App from '../src/App';

而不是

import {App} from '../src/App';

因为你的App组件是默认导出,即

export default App
,而不是命名导出,即
export { App }

© www.soinside.com 2019 - 2024. All rights reserved.