Reactjs 我得到;“未定义反应”;使用express时,创建react应用程序和babel节点
我只是想使用react和CreateReact应用程序启用服务器端渲染 我已经编写了一个server/index.js文件,它应该以字符串形式返回一个简单的react组件Reactjs 我得到;“未定义反应”;使用express时,创建react应用程序和babel节点,reactjs,express,create-react-app,babel-node,babel-register,Reactjs,Express,Create React App,Babel Node,Babel Register,我只是想使用react和CreateReact应用程序启用服务器端渲染 我已经编写了一个server/index.js文件,它应该以字符串形式返回一个简单的react组件 //require('import-export'); //require('babel-register')({ ignore: /\/(build|node_modules)\//, presets: ['react-app', 'es2015', 'react'] }); const express = require(
//require('import-export');
//require('babel-register')({ ignore: /\/(build|node_modules)\//, presets: ['react-app', 'es2015', 'react'] });
const express = require('express');
const morgan = require('morgan');
const path = require('path');
const fs = require('fs');
const index = require('./index.js');
const react = require('react');
const reactServerDom = require('react-dom/server');
const renderToString = reactServerDom.renderToString;
const ourComponent = require('../src/App.js');
const app = express();
// Setup logger
app.use(morgan(':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] :response-time ms'));
// Serve static assets - NEEDS TO BE ACTIVATED LATER WHEN RENDERTOSTRING WORKS!
//app.use(express.static(path.resolve(__dirname, '..', 'build')));
app.get('/', (req, res) => {
const filePath = path.resolve(__dirname, '..', 'build', 'index.html');
let result = '';
fs.readFile(filePath, 'utf8', function (err, data) {
if (err) {
return console.log(err);
}
const ReactApp = renderToString(react.createElement(ourComponent));
result = data.replace('{{SSR}}', ReactApp);
res.send(result);
});
});
const port = 9007;
app.listen(port, () => {
console.log(`App listening on port ${ port }`);
});
module.exports = app;
应该呈现的组件只是每个人从create react app获得的示例组件:
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {
render() {
return (
<div className="App">
<div className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h2>Welcome to React</h2>
</div>
<p className="App-intro">
To get started, edit <code>src/App.js</code> and save to reload.
</p>
</div>
);
}
}
export default App;
在my package.json中,我使用命令warn server或npm run server启动带有babel节点的服务器:
...
"scripts": {
"start": "react-scripts start",
"server": "NODE_ENV=development babel-node --presets=es2015,react server/index.js",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
}
...
但我仍然得到以下错误:
$ NODE_ENV=development babel-node --presets=es2015,react server/index.js
/home/sonnenfeld/ssr-render/src/logo.svg:4
React.createElement(
^
ReferenceError: React is not defined
如果从组件中删除svg,则会出现另一个错误:
SyntaxError: /home/sonnenfeld/ssr-render/src/App.css: Unexpected token (1:0)
> 1 | .App {
| ^
2 | text-align: center;
3 | }
4 |
我已经尝试了巴贝尔钩与巴贝尔登记,但也没有成功
使用create react app with express时,将my server.js和所有依赖项转换为vanilla javascript的好方法是什么?服务器端渲染可能非常困难。所以我完全转到下一个js
样式化组件的问题通过正式的解决方法得到解决服务器端渲染可能非常困难。所以我完全转到下一个js
样式化组件的问题通过一个官方解决方案解决了我认为问题在于您的组件。我认为,您还需要在
我们的组件
中导入React
,名称为React
而不是React
。或者您可以尝试一件事,像这样导入reactconst react=require('react')代码>然后在所有位置使用React
,而不是React
它应该可以工作。该组件只是创建React应用程序中的示例组件。我将编辑我的帖子并在那里插入组件。@MayankShukla我的组件中已经有import-React
。组件也可以有子组件。所有这些都应该通过babel自动传输到vanilla javascript。这就是使用巴贝尔节点的意义。但是他只是没有传输,我不知道为什么。我想问题在于你的组件。我想,你需要在我们的组件中导入React
,名称为React
而不是React
。或者您可以尝试一件事,像这样导入reactconst react=require('react')代码>然后在所有位置使用React
,而不是React
它应该可以工作。该组件只是创建React应用程序中的示例组件。我将编辑我的帖子并在那里插入组件。@MayankShukla我的组件中已经有import-React
。组件也可以有子组件。所有这些都应该通过babel自动传输到vanilla javascript。这就是使用巴贝尔节点的意义。但他只是不明白为什么。