React App : 使用 React 服务器启动 API 服务器
Posted
技术标签:
【中文标题】React App : 使用 React 服务器启动 API 服务器【英文标题】:React App : Start API server with React server 【发布时间】:2018-05-01 10:31:40 【问题描述】:我正在开发一个非常简单的 react 应用程序(我的第一个),但我不知道如何启动 API 和反应服务器...
我将react-router 用于客户端路由,并且我在另一个项目中使用了express,因此我已经使用它启动了我的React 项目来设置API。
但我想知道是否有办法使用react-router 来处理 API 路由并返回一些数据...
我已经用谷歌搜索并环顾四周,但我似乎可以找到任何相关信息(既不确认也不反驳)。
有人对此有意见吗? (我知道这不是一个合适的 SO 问题,但我似乎找不到任何信息来结束这个烦人的奇迹)
【问题讨论】:
【参考方案1】:有一种方法可以同时启动 API 服务器并做出反应。在我的情况下,在您的快速主文件server.js
中。您需要安装 webpack-dev-middleware
和 webpack-hot-middleware
。
// server.js
import path from 'path';
import express from 'express';
import webpack from 'webpack';
import webpackDevMiddleware from 'webpack-dev-middleware';
import webpackHotMiddleware from 'webpack-hot-middleware';
import config from './webpack.config';
const app = express(),
DIST_DIR = path.join(__dirname, 'client'),
html_FILE = path.join(DIST_DIR, 'index.html'),
compiler = webpack(config),
isDevelopment = process.env.NODE_ENV === 'development';
if (isDevelopment)
app.use(webpackDevMiddleware(compiler,
publicPath: config.output.publicPath,
));
app.use(webpackHotMiddleware(compiler));
else
app.use(express.static(DIST_DIR));
app.get('/', (req, res) => res.sendFile(HTML_FILE));
app.get('*', (req, res) => res.redirect(301, '/'));
app.listen(process.env.PORT || 4200);
然后在你的webpack.config.js
,你可以按照我下面的设置:
const path = require('path');
const webpack = require('webpack');
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
module.exports =
entry: [
'webpack-hot-middleware/client',
'./app/app.jsx',
],
externals:
jquery: 'jQuery',
'react/addons': 'react',
'react/lib/ExecutionEnvironment': 'react',
'react/lib/ReactContext': 'react',
,
output:
path: path.resolve(__dirname, 'client'),
filename: 'bundle.js',
publicPath: '/',
sourceMapFilename: 'bundle.map',
,
devtool: process.env.NODE_ENV === 'production'
? undefined : 'cheap-module-eval-source-map',
resolve:
modules: ['node_modules', './app/components'],
extensions: ['.js', '.jsx'],
,
module:
rules: [
test: /(\.js$|\.jsx$)/,
exclude: /(node_modules|bower_components)/,
use: [
loader: 'babel-loader',
options:
presets: ['react', 'es2015', 'stage-0', 'airbnb'],
,
,
],
,
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
,
test: /\.(eot|svg|ttf|woff|woff2)(\?v=\d+\.\d+\.\d+)?$/,
use:
loader: 'file-loader',
options:
name: '[name].[ext]'
],
,
plugins: [
new webpack.optimize.OccurrenceOrderPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
new webpack.ProvidePlugin(
$: 'jquery',
jQuery: 'jquery',
),
new webpack.optimize.UglifyJsPlugin(
sourceMap: true,
minimize: true,
compressor:
warnings: false,
,
),
new webpack.DefinePlugin(
'process.env':
NODE_ENV: JSON.stringify(process.env.NODE_ENV)
,
),
],
;
然后在你的package.json
scripts
:
// package.json
"scripts":
"build": "webpack",
"postinstall": "npm run build",
"start": "babel-node server.js",
"start:dev": "nodemon -e js --exec babel-node -- ./server.js",
"test": "karma start"
现在,当您启动 express 服务器时,您的 API 和 react 将一起运行。
【讨论】:
感谢输入,这似乎可以处理开发和生产启动方法!但是关于build
script
它也有效吗?我必须在package.json
的scripts
中定义什么?提前感谢您的解释!
我已将其添加到答案的底部。【参考方案2】:
我正在开发一个非常简单的 react 应用程序(我的第一个),但我做不到 弄清楚如何让 API 和反应服务器都启动......
有一个 npm 模块用于我的 React/Express 应用程序,名为 concurrent,我用它来同时启动我的客户端和后端服务器。
我已全局安装:
npm install concurrently
在我的应用程序主 package.json
中,我的脚本设置如下:
"scripts":
"start": "concurrently \"npm run server\" \"npm run client\"",
"server": "node bin/www",
"client": "node start-client.js"
该设置允许我运行 npm start
并启动我的服务器和客户端脚本。
在start-client.js
,我有这个:
const args = ["start"];
const opts = stdio: "inherit", cwd: "client", shell: true ;
require("child_process").spawn("npm", args, opts);
start-client.js
位于我的应用程序的根目录。
我的文件结构如下:
|--bin
|--client
|--routes
|--app.js
|--package.json
|--start-client.js
但我想知道是否有办法使用 react-router 来处理 API 路由并返回一些数据...
为了从 API 服务器获取数据,我在我的 React 组件中使用了原生的 fetch()
方法。
由于我使用的是 Express,我将创建一个路由并将其导出到我的 app.js
文件中,如下所示:
/* myRoute.js */
var express = require('express')
var router = express.Router()
router.get('/', function(req, res, next)
res.send('index', title: 'Express')
)
module.exports = router
/* app.js */
var myRoute = require('./routes/myRoute')
var app = express()
//will fetch data from this endpoint
app.use('/myRoute', myRoute)
现在在我的 React 组件中,我将从 /myRoute
获取数据,如下所示:
fetch('/myRoute')
.then(res => JSON.parse(res))
.then(res => console.log(res))
【讨论】:
感谢输入,我几乎什么都懂了,但我仍然有一件事:我猜myRoute.js
在 ./routes/
中,但你在 ./bin/
和 @987654338 中有什么@?可以肯定的是,concurrently
是否也适用于生产环境?
那么build
scripts
也可以使用concurrently
吗?
@R3uK bin/www
启动我的节点服务器。你可能称它为server.js
。我还没有在生产中同时使用,但我不明白为什么它不应该在生产中工作。你可以在这里阅读更多信息:npmjs.com/package/concurrently以上是关于React App : 使用 React 服务器启动 API 服务器的主要内容,如果未能解决你的问题,请参考以下文章
create-react-app + nodejs (express) 服务器
如何在 Ubuntu 服务器上使用 create-react-app 使用 Webpack/React 配置 Django
使用 Flask 为使用 create-react-app 创建的前端提供服务