React应用程序:使用React服务器启动API服务器

4

我正在开发一个相当简单的应用程序(我的第一个),但我无法弄清楚如何同时启动API和React服务器...

我在客户端路由中使用,并且在另一个项目中使用了,因此我开始使用它来设置API。

但我想知道是否有一种方法可以使用处理API路由并返回一些数据...

我已经谷歌搜索过并查看了周围的内容,但似乎找不到任何关于这个问题的信息(无论是证实还是否定)。

有人对此有什么意见吗?
(我知道这不是一个适当的SO问题,但我似乎找不到任何信息来解决这个烦人的问题)

2个回答

1

有一种方法可以同时启动API服务器和React。在我的情况下,在您的Express主文件中,即server.js中,您需要安装webpack-dev-middlewarewebpack-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.jsonscripts中定义什么?提前感谢您的解释! - R3uK
1
我已将其添加到答案底部。 - codejockie

1

我正在开发一个相当简单的 React 应用(我的第一个),但是我无法弄清楚如何同时启动 API 和 React 服务器...

我使用一个名为 concurrently 的 npm 模块来启动客户端和后端服务器。

我已经全局安装了它:

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/./bin/www/中有什么呢?另外,为了确保,concurrently在生产环境中也能正常工作吗? - R3uK
构建脚本呢?我们能否也使用concurrently呢? - R3uK
1
@R3uK bin/www 启动我的 Node 服务器。你可能称其为 server.js。我还没有在生产环境中使用过 concurrently,但我不认为它不能在生产环境中工作。你可以在这里阅读更多信息:https://www.npmjs.com/package/concurrently - JJJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接