【问题标题】:React Not Attaching DOM to the HTMLReact 不将 DOM 附加到 HTML
【发布时间】:2017-04-15 22:45:23
【问题描述】:

我的 ReactJs 代码有一些问题。一切都在使用 webpack 编译,没有任何错误。但是在 webpack 开发服务器启动之后,当我浏览到 localhost:9000 时,没有任何东西从 ReactJs 插入到 DOM 中。

我正在终端上运行 npm start

这是我写的所有代码-

.babelrc

{
  "presets": ["es2015", "react", "stage-0"]
}

.eslintrc

{
  "ecmaFeatures": {
    "jsx": true,
    "modules": true
  },
  "env": {
    "browser": true,
    "node": true
  },
  "parser": "babel-eslint",
  "rules": {
    "quotes": [2, "single"],
    "strict": [2, "never"],
    "react/jsx-uses-react": 2,
    "react/jsx-uses-vars": 2,
    "react/react-in-jsx-scope": 2
  },
  "plugins": [
    "react"
  ]
}

.jslintrc

{
  "node": true,
  "browser": true,
  "esnext": true,
  "newcap": false
}

index.html

<html>
  <head>
    <title>Forms in React Test</title>
    <link rel="stylesheet"  href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" />
  </head>
  <body>
    <div id='root' class="container">
    </div>
  </body>
  <script src="/static/bundle.js" type="text/javascript"></script>
</html>

index.js

    import React, { Component } from 'react';
    import ReactDOM from 'react-dom';

    class IndexComponent extends React.Component{
      render() {
        return (
          <div>
            <input type="text" value="Shawn" />
          </div>
        );
      }
    }

    ReactDOM.render(<IndexComponent />, document.getElementById('root'));

**package.json**
{
  "name": "chapter4",
  "version": "0.0.1",
  "description": "ReactJS forms example",
  "scripts": {
    "start": "node server.js",
    "lint": "eslint src"
  },
  "author": "",
  "license": "MIT",
  "homepage": "",
  "devDependencies": {
    "babel": "^6.23.0",
    "babel-cli": "^6.24.1",
    "babel-core": "^6.24.1",
    "babel-eslint": "^7.2.2",
    "babel-loader": "^6.4.1",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "eslint": "^3.19.0",
    "eslint-plugin-react": "^6.10.3",
    "react-hot-loader": "^1.3.1",
    "webpack": "^2.4.1",
    "webpack-dev-server": "^2.4.2"
  },
  "dependencies": {
    "react": "^15.5.4",
    "react-dom": "^15.5.4"
  }
}

webpack.config.js

var path = require('path');
var webpack = require('webpack');

module.exports = {
  devtool: 'eval',
  entry: [
    'webpack-dev-server/client?http://localhost:9000',
    'webpack/hot/only-dev-server',
    './src/index'
  ],
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js',
    publicPath: '/static/'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    // new webpack.NoEmitOnErrorsPlugin()
  ],
  resolve: {
    extensions: ['.js', '.jsx']
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        include: [path.join(__dirname, 'src')],
      },
      {
        use: [
          {
            loader: 'react-hot-loader'
          },
          {
            loader: 'babel-loader',
            options: {
              // cacheDirectory: 'babel_cache',
              presets: ['react', 'es2015']
            }
          }
        ]
      }
    ]

  }
};

提前谢谢大家。

【问题讨论】:

  • JS控制台有错误吗?或者您在编译期间没有任何错误以及运行时错误?
  • 打开您的控制台并检查是否有任何错误。这将为您指明正确的方向。
  • @saadq 控制台上没有错误。
  • @AndrewLi 已经发布了代码并给出了要点的链接。

标签: reactjs webpack ecmascript-6 babeljs


【解决方案1】:

在您的 webpack.confg.js 中,您有以下内容:

module.exports = {
  devtool: 'eval',
  entry: [
    'webpack-dev-server/client?http://localhost:9000',
    'webpack/hot/only-dev-server',
    './src/index' // <-- no src dir in project
  ],
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js',
    publicPath: '/static/'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    // new webpack.NoEmitOnErrorsPlugin()
  ],
  resolve: {
    extensions: ['.js', '.jsx']
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        include: [path.join(__dirname, 'src')], // <-- no src dir in project
      },
      {
        use: [
          {
            loader: 'react-hot-loader'
          },
          {
            loader: 'babel-loader',
            options: {
              // cacheDirectory: 'babel_cache',
              presets: ['react', 'es2015']
            }
          }
        ]
      }
    ]

  }
};

您在此项目中没有 src 目录。

修复:创建一个 src 目录并将您的 index.js 文件移动到其中。您尝试引入 react-hot-loader 并且不排除 node_modules 的方式也有问题。在你的模块部分试试这个:

module: {
    loaders: [
        {
            test: /\.jsx?$/,
            loaders: ['react-hot-loader', 'babel-loader?presets[]=es2015&presets[]=react&presets[]=stage-2&presets[]=stage-0'],
            include: [path.join(__dirname, 'src')],
            exclude: '/node_modules/'
        }
    ]
}

经过测试,可以在我的本地使用。

【讨论】:

    【解决方案2】:

    找到解决方案。 在 rules 部分我犯了一些错误。以下将是正确的规则。

    rules: [{
      test: /\.jsx?$/,
      include: [path.join(__dirname, 'src/')],
      use: [
        {
          loader: 'react-hot-loader'
        },
        {
          loader: 'babel-loader',
        }
      ]
    }]
    

    这将是正确的 webpack.config.js

    var path = require('path');
    var webpack = require('webpack');
    
    module.exports = {
      devtool: 'eval',
      entry: [
        'webpack-dev-server/client?http://localhost:9000',
        'webpack/hot/only-dev-server',
        path.resolve(__dirname, 'src/')
      ],
      output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js',
        publicPath: '/static/'
      },
      plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NoEmitOnErrorsPlugin()
      ],
      resolve: {
        extensions: ['.js', '.jsx']
      },
      module: {
        rules: [{
          test: /\.jsx?$/,
          include: [path.join(__dirname, 'src/')],
          use: [
            {
              loader: 'react-hot-loader'
            },
            {
              loader: 'babel-loader',
            }
          ]
        }]
      }
    };
    

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 2011-05-24
      • 2016-05-29
      相关资源
      最近更新 更多