Node.js 如何将表达和反应结合起来?

Node.js 如何将表达和反应结合起来?,node.js,reactjs,webpack,webpack-dev-server,Node.js,Reactjs,Webpack,Webpack Dev Server,当我使用webpack with webpack dev server运行react项目时,twitter npm模块出现错误 错误是: *ERROR in ./~/twitter/~/request/~/har-validator/lib/schemas/timings.json Module parse failed: /Users/peterkaminski/react-test/node_modules/twitter/node_modules/request/node_modules/

当我使用webpack with webpack dev server运行react项目时,twitter npm模块出现错误

错误是:

*ERROR in ./~/twitter/~/request/~/har-validator/lib/schemas/timings.json
Module parse failed: /Users/peterkaminski/react-test/node_modules/twitter/node_modules/request/node_modules/har-validator/lib/schemas/timings.json Unexpected token (2:12)*
我只有在需要推特的时候才能得到它。我当前的项目设置使用webpack和babel

我尝试过的一个解决方案是,在我使用React呈现所有前端时,只需设置一个express服务器来处理所有API调用。我已经试着找到了一些关于如何将express与React结合起来的教程,但都不是很清楚


设置项目的最佳方法是什么,这样您就可以包含各种节点模块而不会出现此类错误,您如何使用Express运行React?

似乎您的加载程序(包括节点模块)和您正在使用的库有一个JSON文件,而由于缺少JSON加载程序,Web包无法绑定该文件 使用npm Install json loader安装json loader,并将您的网页配置为处理json文件

顺便说一下,如果不需要捆绑,您应该排除节点_模块 它


似乎您的加载程序(包括节点_模块)和您正在使用的库有一个JSON文件,由于缺少JSON加载程序,Web包无法绑定该文件 使用npm Install json loader安装json loader,并将您的网页配置为处理json文件

顺便说一下,如果不需要捆绑,您应该排除节点_模块 它


下面是一个示例设置,允许您开始开发(包括npm包和网页包)

  • package.json

    {
      "name": "mvp",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "start": "nodemon server/server.js",
        "test": "echo \"Error: no test specified\" && exit 1",
        "webpack": "webpack --watch"
      },
    
      "author": "",
      "license": "ISC",
      "dependencies": {
        "angular": "^1.6.4",
        "axios": "^0.16.2",
        "babel-core": "^6.25.0",
        "babel-loader": "^7.0.0",
        "babel-preset-es2015": "^6.24.1",
        "babel-preset-react": "^6.24.1",
        "body-parser": "^1.17.2",
        "bootstrap": "^4.0.0-alpha.6",
        "cors": "^2.8.3",
        "dotenv": "^4.0.0",
        "express": "^4.15.3",
        "lodash": "^4.17.4",
        "morgan": "^1.8.2",
        "pg": "^6.2.4",
        "react": "^15.6.0",
        "react-bootstrap": "^0.31.0",
        "react-dom": "^15.6.0",
        "react-transition-group": "^1.2.0",
        "reactstrap": "^4.6.2",
        "sequelize": "^4.0.0",
        "webpack": "^2.6.1"
      },
      "devDependencies": {
        "nodemon": "^1.11.0"
      }
    }
    
  • webpack.config

    //this is a code 
    const path = require('path');
    
    const SRC_DIR = path.resolve(__dirname, 'react-client/src');
    const BUILD_DIR = path.resolve(__dirname, 'react-client');
    
    module.exports = {
      entry: path.resolve(SRC_DIR, 'index.js'),
      output: {
        filename: 'bundle.js',
        path: BUILD_DIR
      },
      module: {
        rules: [
          {
            test: /\.(js|jsx)$/,
            exclude: [/node_modules/],
            use: [{
              loader: 'babel-loader',
              options: { presets: ['es2015', 'react'] }
            }],
          }
        ]
      }
    }
    
  • 示例server.js设置

    const express = require('express');
    const bodyParser = require('body-parser');
    const morgan = require('morgan')
    const port = 8000
    const db = require('../database/config.js')
    const todoListRouter = require('./router/todoList.router')
    const cors = require('cors')
    const app = express()
    
    app.use(express.static('react-client'))
       .use(bodyParser.json())
       .use(bodyParser.urlencoded({extended:true}))
       .use(morgan('dev'))
       .use('/api', todoListRouter)
    
    app.all('*', function(req, res, next){
        res.header("Access-Control-Allow-Origin", "x")
        res.header("Access-Control-Allow-Headers","X-Request-With");
        next();
    })
    
    app.listen(port, 'localhost', ()=>{
        console.log("server running on port :" + port);
    })
    
  • 给定react index.js,这是一个导入所需内容的示例

    import React, { Component } from 'react'
    import ReactDOM from 'react-dom'
    import axios from 'axios'
    import NavBar from '../src/components/navbar'
    import ToDo from '../src/components/todo'
    import ToDoBuilder from '../src/components/todobuilder'
    import ToDoList from '../src/components/todolist'
    import ToDosWithSameUser from '../src/components/todowithsameuser'
    ....//your component here
    ReactDOM.render(<App />, document.getElementById('app'));
    
    import React,{Component}来自“React”
    从“react dom”导入react dom
    从“axios”导入axios
    从“../src/components/NavBar”导入导航栏
    从“../src/components/ToDo”导入ToDo
    从“../src/components/ToDoBuilder”导入ToDoBuilder
    从“../src/components/ToDoList”导入ToDoList
    从“../src/components/todowithsameuser”导入ToDosWithSameUser
    ....//此处显示您的组件
    ReactDOM.render(,document.getElementById('app'));
    
  • 简而言之,查看webpack.config.js中的入口点,您可以看到它查看'react client/src'并查找index.js

    要运行脚本,只需执行以下操作 npm启动,
    npm运行网页包

    这里是一个示例设置,允许您开始开发(包括npm包和网页包)

  • package.json

    {
      "name": "mvp",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "start": "nodemon server/server.js",
        "test": "echo \"Error: no test specified\" && exit 1",
        "webpack": "webpack --watch"
      },
    
      "author": "",
      "license": "ISC",
      "dependencies": {
        "angular": "^1.6.4",
        "axios": "^0.16.2",
        "babel-core": "^6.25.0",
        "babel-loader": "^7.0.0",
        "babel-preset-es2015": "^6.24.1",
        "babel-preset-react": "^6.24.1",
        "body-parser": "^1.17.2",
        "bootstrap": "^4.0.0-alpha.6",
        "cors": "^2.8.3",
        "dotenv": "^4.0.0",
        "express": "^4.15.3",
        "lodash": "^4.17.4",
        "morgan": "^1.8.2",
        "pg": "^6.2.4",
        "react": "^15.6.0",
        "react-bootstrap": "^0.31.0",
        "react-dom": "^15.6.0",
        "react-transition-group": "^1.2.0",
        "reactstrap": "^4.6.2",
        "sequelize": "^4.0.0",
        "webpack": "^2.6.1"
      },
      "devDependencies": {
        "nodemon": "^1.11.0"
      }
    }
    
  • webpack.config

    //this is a code 
    const path = require('path');
    
    const SRC_DIR = path.resolve(__dirname, 'react-client/src');
    const BUILD_DIR = path.resolve(__dirname, 'react-client');
    
    module.exports = {
      entry: path.resolve(SRC_DIR, 'index.js'),
      output: {
        filename: 'bundle.js',
        path: BUILD_DIR
      },
      module: {
        rules: [
          {
            test: /\.(js|jsx)$/,
            exclude: [/node_modules/],
            use: [{
              loader: 'babel-loader',
              options: { presets: ['es2015', 'react'] }
            }],
          }
        ]
      }
    }
    
  • 示例server.js设置

    const express = require('express');
    const bodyParser = require('body-parser');
    const morgan = require('morgan')
    const port = 8000
    const db = require('../database/config.js')
    const todoListRouter = require('./router/todoList.router')
    const cors = require('cors')
    const app = express()
    
    app.use(express.static('react-client'))
       .use(bodyParser.json())
       .use(bodyParser.urlencoded({extended:true}))
       .use(morgan('dev'))
       .use('/api', todoListRouter)
    
    app.all('*', function(req, res, next){
        res.header("Access-Control-Allow-Origin", "x")
        res.header("Access-Control-Allow-Headers","X-Request-With");
        next();
    })
    
    app.listen(port, 'localhost', ()=>{
        console.log("server running on port :" + port);
    })
    
  • 给定react index.js,这是一个导入所需内容的示例

    import React, { Component } from 'react'
    import ReactDOM from 'react-dom'
    import axios from 'axios'
    import NavBar from '../src/components/navbar'
    import ToDo from '../src/components/todo'
    import ToDoBuilder from '../src/components/todobuilder'
    import ToDoList from '../src/components/todolist'
    import ToDosWithSameUser from '../src/components/todowithsameuser'
    ....//your component here
    ReactDOM.render(<App />, document.getElementById('app'));
    
    import React,{Component}来自“React”
    从“react dom”导入react dom
    从“axios”导入axios
    从“../src/components/NavBar”导入导航栏
    从“../src/components/ToDo”导入ToDo
    从“../src/components/ToDoBuilder”导入ToDoBuilder
    从“../src/components/ToDoList”导入ToDoList
    从“../src/components/todowithsameuser”导入ToDosWithSameUser
    ....//此处显示您的组件
    ReactDOM.render(,document.getElementById('app'));
    
  • 简而言之,查看webpack.config.js中的入口点,您可以看到它查看'react client/src'并查找index.js

    要运行脚本,只需执行以下操作 npm启动,
    npm run webpack

    听起来好像您没有将
    排除
    节点单元模块
    从您的webpack加载程序配置中。您可能会混淆一些术语-express是一个http服务器,它响应http谓词,这几乎是它唯一的任务,而React是一个在浏览器中运行的面向用户的UI库。这些“协同工作”的唯一时间是,如果您正在进行服务器端页面呈现,那么用户在实际启动React之前已经看到了“静态页面”,并将其替换为真正的交互式UI。这并不是说你没有问题,但你可能想重新表述一下。听起来你没有从你的网页加载器配置中排除节点模块。你可能混淆了一些术语-express是一个http服务器,它响应http动词,这几乎是它唯一的工作,而React是在浏览器中运行的面向用户的UI库。这些“协同工作”的唯一时间是,如果您正在进行服务器端页面呈现,那么用户在实际启动React之前已经看到了“静态页面”,并将其替换为真正的交互式UI。这并不是说您没有问题,但您可能需要重新表述一下。我将尝试此操作并返回给您我现在收到这些错误:找不到模块:错误:无法在中解析模块“fs”。。。找不到模块:错误:无法解析模块“net”。。。在./~/twitter/~/request/~/forever agent/index.js模块中找不到错误:错误:无法解析/Users/peterkaminski/react test/node_modules/twitter/node_modules/request/node_modules/forever agent@./~/twitter/~/request/~/forever agent/index.js 7:10-24^在npm安装后保存json加载程序并使我的加载程序如下所示:加载器:[{test:/\.js$/,exclude:/node\u modules/,loader:“babel loader”},{test:/\.json$/,loader:“json loader”}]我还应该指出,我尝试了{test:/\.json$/,exclude:/node\u modules/,loader:“json loader”},但这也不起作用。现在是注释。您最初关于解析json的错误已经消失,这是另外一个问题,所以请更新您的问题,以便其他人也可以了解正在发生的事情以及如何帮助您。这是正确的方法{test://\.json$/,exclude:/node\u modules/,loader:“json loader”}我将尝试此方法并返回给您我现在收到这些错误:未找到模块:错误:无法解析中的模块“fs”。。。找不到模块:错误:无法解析模块“net”。。。在./~/twitter/~/request/~/forever agent/index.js模块中找不到错误:错误:无法解析/Users/peterkaminski/react test/n中的模块“tls”