【问题标题】:React App : Start API server with React serverReact App : 使用 React 服务器启动 API 服务器
【发布时间】:2018-05-01 10:31:40
【问题描述】:

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

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

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

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

有人对此有意见吗?
(我知道这不是一个合适的 SO 问题,但我似乎找不到任何信息来结束这个烦人的奇迹)

【问题讨论】:

    标签: react react-router express react-router javascript reactjs api express react-router


    【解决方案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.jsonscripts:

    // 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 中定义什么?提前感谢您的解释!
    • 我已将其添加到答案的底部。
    【解决方案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
    猜你喜欢
    • 2020-12-23
    • 2021-02-22
    • 2018-03-11
    • 2019-10-30
    • 2020-05-19
    • 2018-07-16
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多