Webpack Hot Module Reloader 不适用于 React 无状态组件

Posted

技术标签:

【中文标题】Webpack Hot Module Reloader 不适用于 React 无状态组件【英文标题】:Webpack Hot Module Reloader not working with React Stateless Component 【发布时间】:2016-07-08 20:29:38 【问题描述】:

我在 webpack-dev-middleware 不使用 react 无状态函数进行热重载时遇到了一些问题,但如果我创建一个类扩展组件,则工作正常。

例如,这非常有效。

// home.js

import React from 'react'

export default class Home extends React.Component 
  render() 
    return (
            <div>
                <h1>Drop it like it's hot</h1>
            </div>
        )
  

然而,这失败得很惨。

// home.js

import React from 'react'

export default function Home() 
  return (
        <div>
            <h1>Hello World</h1>
        </div>
    )

错误:

[Warning] [HMR] The following modules couldn't be hot updated: (Full reload needed) (bundle.js, line 1742)
This is usually because the modules which have changed (and their parents) do not know how to hot reload themselves. See http://webpack.github.io/docs/hot-module-replacement-with-webpack.html for more details.
[Warning] [HMR]  - ./client/components/home.js (bundle.js, line 1750)

【问题讨论】:

github.com/gaearon/babel-plugin-react-transform/issues/57 AFAIK,因为它只是一个函数,所以很难静态确定它是react组件还是函数(上面的问题提到了) 不行,项目的README里有提到。 感谢您的回复! 【参考方案1】:

如果它仍然相关并且人们仍然有问题,那么有一种方法,版本 3 仍在开发中。我将在此处粘贴我对 package.json 和 webpack.config.js 文件的设置,但如果您想要一个工作示例 here is the repo I created for this

package.json


  "name": "favesound-project",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": 
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack-dev-server --progress --colors --hot --config ./webpack.config.js"
  ,
  "devDependencies": 
    "babel-core": "^6.0.20",
    "babel-loader": "^6.0.1",
    "babel-preset-es2015": "^6.0.15",
    "babel-preset-react": "^6.0.15",
    "babel-preset-stage-0": "^6.0.15",
    "chai": "^3.5.0",
    "enzyme": "^2.3.0",
    "exports-loader": "^0.6.3",
    "imports-loader": "^0.6.5",
    "jsdom": "^9.2.1",
    "mocha": "^2.5.3",
    "react-addons-test-utils": "^15.1.0",
    "react-hot-loader": "^3.0.0-beta.0",
    "webpack": "^1.12.2",
    "webpack-dev-server": "^1.12.1"
  ,
  "dependencies": 
    "react": "^15.1.0",
    "react-dom": "^15.1.0",
    "react-redux": "^4.4.5",
    "react-router": "^2.4.1",
    "react-router-redux": "^4.0.5",
    "redux": "^3.5.2",
    "redux-logger": "^2.6.1",
    "redux-thunk": "^2.1.0",
    "soundcloud": "^3.1.2",
    "whatwg-fetch": "^1.0.0"
  ,
  "author": "",
  "license": "ISC",
  "keywords": [],
  "description": ""

webpack.config.js

const webpack = require('webpack');

module.exports = 
    entry: [
        'react-hot-loader/patch',
        'webpack-dev-server/client?http://localhost:8080',
        'webpack/hot/only-dev-server',
        './src/index.js'
    ],
    module: 
        loaders: [
            test: /\.jsx?$/,
            exclude: /node_modules/,
            loaders: ['babel']
        ]
    ,
    resolve: 
        extensions: ['', '.js', '.jsx']
    ,
    output: 
        path: __dirname + '/dist',
        publicPath: '/',
        filename: 'bundle.js'
    ,
    devServer: 
        contentBase: './dist',
        hot: true
    
;

您可以将我创建的 repo 用作样板,并在 react-hot-loader 投入生产时升级它。干杯。

【讨论】:

以上是关于Webpack Hot Module Reloader 不适用于 React 无状态组件的主要内容,如果未能解决你的问题,请参考以下文章

pnpm Module not found: Error: Can‘t resolve ‘vue-hot-reload-api

how webpack Hot Module Replacement works

webpack——Modules && Hot Module Replacement

webpack的Hot Module Replacement运行机制

Webpack Hot Module Reloader 不适用于 React 无状态组件

Webpack2 Hot Module 重新加载 Express.js 通用 React 应用程序