如果您希望您的 Express ejs 页面在同一端口上提供您的 React 代码,请创建以下文件:
src/javascripts/views/layout.ejs:
<!DOCTYPE html>
<html lang="en">
<head>
<title><%= title %></title>
</head>
<body>
<div class="container" >
<h2>Server rendered EJS File</h2>
<div id="main">
<!--This div is where React Component Renders -->
</div>
</div>
<script src="javascripts/main.js"></script>
</body>
</html>
src/javascripts/main.js 文件:
import React from 'react'
import ReactDOM from 'react-dom'
import App from './components/App'
ReactDOM.render(<App />, document.getElementById('main'))
src/javascripts/components/App.js
import React from 'react'
export default function App() {
return (
<div className="react-stuff">
<h1>My React App component</h1>
</div>
)
}
在您的 Express 服务器中指定以下公用文件夹:
app.use(express.static(path.join(__dirname, 'public')))
在 webpack 中指定你的 React 源代码应该从 src/javascripts/main.js 编译到 pubic/javascripts/main.js:
entry: {
main: './src/javascripts/main.js'
},
output: {
path: path.resolve(__dirname, 'public'),
filename: 'javascripts/main.js',
publicPath: '/'
},
最后,创建一个服务于 layout.ejs 的 Express 路由。说“/”(例如 http://localhost:8080)
现在,每次编译 React 代码时,它都会将 ./src/javascripts/main.js 中的代码编译/捆绑到 Express 静态目录(例如 public/javascripts/main.js)
当你请求 http://localhost:8080 时,Express 将提供 layout.ejs。由于 layout.ejs 通过指向 public/javascripts/main.js 的脚本标签连接到您的 React 包,它将为您的 App.js React 组件提供服务!
注意:上述解决方案依赖于您的 React 页面将由 Express 提供服务的架构。但是,如果您想创建一个完全独立于您的 Express 服务器(可能除了 SPA 的 API 调用)的 SPA(单页应用程序),那么解决方案将有所不同,并且将涉及(正如其他答案所建议的那样)使用package.json 中的代理行。
这里还有一个图表,概述了不同文件之间的关系: