React App:使用React服务器启动API服务器

时间:2017-11-17 15:34:06

标签: javascript reactjs api express react-router

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

我正在使用用于客户端路由,并且我在另一个项目中使用了,因此我已经使用它启动了我的React项目来设置API。

但我想知道是否有办法使用处理API路线并返回一些数据......

我用Google搜索并环顾四周,但我似乎可以找到任何相关信息(也不确认或反驳)。

有没有人对此有任何意见?
(我知道这不是一个正确的SO问题,但我似乎无法找到任何信息来关闭唠叨的奇迹)

2 个答案:

答案 0 :(得分:1)

有一种方法可以启动API服务器并做出反应。在我的案例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"
  }

现在,当您启动快速服务器时,您的API和反应将一起运行。

答案 1 :(得分:1)

  

我正在制作一个非常简单的反应应用程序(我的第一个),但我无法做到   弄清楚如何启动API和反应服务器......

我用于我的React / Express应用程序的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))