【发布时间】:2021-09-30 20:01:41
【问题描述】:
当我尝试在 React 应用上实现服务器端渲染时,我遇到了一种奇怪的行为。
...
Error: Element type is invalid: expected a string (for built-in components) or a
class/function (for composite components) but got: object.
You likely forgot to export your component from the file it's defined in,
or you might have mixed up default and named imports.
...
我意识到带有 JSX 扩展名的渲染文件存在一个普遍问题。这是我的代码的样子。
./server/server.js
app.use('/*', (req, res, next) => {
const context = {};
const app = ReactDOMServer.renderToString(
<App />
);
console.log(app)
fs.readFile(path.resolve('./build/index.html'), 'utf-8', (err, data) => {
if (err) {
console.log(err);
return res.status(500).send("Some Error")
}
return res.send(
data.replace(
'<div id="root"></div>',
`<div id="root">${app}</div>`
)
)
})
})
./server/index.js
require("ignore-styles")
require("@babel/register")({
ignore: [/(node_module)/],
presets: ['@babel/preset-env', '@babel/preset-react']
})
require('./server')
./src/App.jsx
import './App.scss';
import React from 'react';
function App() {
return (
<div className='app'>
<p>Sample</p>
</div>
);
}
export default App;
./src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.scss';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter as Router } from "react-router-dom";
ReactDOM.hydrate(
<Router>
<React.StrictMode>
<App />
</React.StrictMode>
</Router>,
document.getElementById('root')
);
reportWebVitals();
并且在../server/server.js:17:30 中发生错误,也就是在调用ReactDOMServer.renderToString 时。问题是组件在导入后被视为空对象。我觉得这是 babel 的问题,但我不确定。
【问题讨论】:
-
react 应用程序是否作为字符串正确发送到浏览器?另外,您在浏览器中调用什么来将 React 应用程序从字符串呈现到应用程序? (你打电话给
ReactDOM.hydrate(...)吗?) -
它们根本没有被发送到浏览器。他们在
ReactDOMServer.renderToString失败了,是的,我调用了 ReactDOM.hydrate。
标签: javascript reactjs babeljs