9

My webpack.config.js

var path = require("path")
var webpack = require('webpack')
var BundleTracker = require('webpack-bundle-tracker')

module.exports = {
    context: __dirname,

    entry: [
        'webpack-dev-server/client?http://localhost:3000',
        'webpack/hot/only-dev-server',
        './assets/js/index', // entry point of our app. assets/js/index.js should require other js modules and dependencies it needs
    ],

    output: {
        path: path.resolve('./assets/bundles/'),
        filename: "[name]-[hash].js",
        publicPath: 'http://localhost:3000/assets/bundles/', // Tell django to use this URL to load packages and not use STATIC_URL + bundle_name
    },

    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NoEmitOnErrorsPlugin(), // don't reload if there is an error
        new BundleTracker({filename: './webpack-stats.json'}),
    ],

    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                exclude: /node_modules/,
                loaders: ['react-hot-loader', 'babel-loader?presets[]=react'],
            }, // to transform JSX into JS
        ],
    },

    resolve: {
        modules: ['node_modules', 'bower_components'],
        extensions: ['.js', '.jsx']
    },
} 
                   

Error:

Error: Module 'C:\Workspace\PyCharmProjects\ProjectPearl\node_modules\react-hot-loader\index.js' is not a loader (must have normal or pitch function)

Looks like some got working (https://github.com/webpack/webpack/issues/3180) by adding -loader extension for modules, however for me it still doesn't resolve.

Please assist.

                      
                               improve this question                            
edited Jun 20 '17 at 4:21                                
                                   
                               
Nithin                                    
1,1407 silver badges28 bronze badges                                    
asked Jun 20 '17 at 4:17                                
                                   
                               
       

2 Answers  正确答案                


           
       
24

I think the usage is react-hot-loader/webpack                        

loaders: ['react-hot-loader/webpack', 'babel-loader?presets[]=react'],
                       

Look a some example usages here http://gaearon.github.io/react-hot-loader/getstarted/                        

                               improve this answer                            
answered Jun 20 '17 at 4:30                                
                                   
                               
  • 3                                    
    And in case people are using ES6 and get the same error, note that the migration guide reads as the first step: If you're using Babel and ES6, remove the react-hot loader from any loaders in your Webpack config, and add react-hot-loader/babel to the plugins section of your .babelrc: – Matti Eiden Jul 10 '17 at 7:22                                     
       
0

The issue may arise because of mismatched version of react-hot-loader dependent libraries. To ensure you have all react-hot-loader related dependencies configured correctly in package.json run following command.

  • npm install (if you have already installed all dependencies then this is not required)

  • npm remove --save-dev react-hot-loader

  • npm install --save react-hot-loader@<specific-version>

in my case specific-version was 1.3.1

                               improve this answer                            
edited Nov 23 '18 at 9:06                                
answered Nov 1 '18 at 18:28                                
                                   
                               
  • I was trying to add new library to package.json related to redux-saga but that did not work right so removed the library from package.json and then started getting this error. I am not sure how it happened but since then after spending whole day I got to know about this solution. – Techflash Nov 1 '18 at 18:32                                    

       


       

来自 https://stackoverflow.com/questions/44643738/react-webpack-error-module-is-not-a-loader-must-have-normal-or-pitch-functio        


       

  1.  

  2. 问答详情

                       

执行$ webpack-dev-server --inline --hot就会报错:react-hot-loaderindex.js' is not a loader (must have normal or pitch function)

我的webpack.config.js配置:

module.exports = {
    entry: "./entry.js",    //入口文件
    output: {                //打包以后生成的文件放到哪里,叫什么
        path: __dirname,    //存储路径,__dirname表示把生成的文件放在这个同一个目录下面,如果要是放到别的目录,如要放在app文件夹下,就是__dirname + "/app"
        filename: "bundle.js"
    },

    //devtool块,source-map来调试
    devtool:"source-map",

    // module表示要使用的模块
    module: {
        loaders: [        //设置使用的loader,是数组,每一个项都是一个对象
            {
                test: /\.js$/,
                exclude:/node_modules/,        //exclude排除不使用loader的目录
                loader: "react-hot-loader!babel-loader"
            },
            {
                test: /\.css$/,        //判断是不是css文件
                loader:"style-loader!css-loader"    //必须写-loader,不能简写,否则报错
            }
        ]
    }
};
                               

name.js文件:

'use strict';    //严格模式

import React from "react";

class Name extends React.Component {    //定义一个react组件
    render() {
        return (
            <div>
                hello ~ ninghao.net <input />
            </div>
        );
    }
}

export { Name as default };
                               

entry.js文件:

//导入组件
import React from "react";
import ReactDOM from "react-dom";
import Name from "./name.js";

ReactDOM.render(
    <Name />
    document.getElementById("app");
);
                               

我一开始怀疑是不是因为 exclude:/node_modules/, 这里不对,因为我的所有文件都是放在node_modules目录的一个同级目录的里面的,我就把所有文件都拿出来放到了和node_modules同一级目录下,还是会报这个错误。之后我又删了node_modules全部重新下载,还是会报这个错误,不知道问题出在了哪里。。

                                   
半岛七年  98                                        
2018-01-02 提问                                    
默认排序时间排序                        
3 个回答

entry: [

'react-hot-loader/patch',
'mian.js'
                                   

]

是不是入口需要加东西.

                                       
Allen_zc  4                                            
2018-01-07 回答                                            

急问 最后怎么解决的 我现在也遇到同样的问题呀

                                       
LGMMI  4                                            
2018-01-18 回答                                            
 entry: {
    app: [
      'react-hot-loader/patch',
      'webpack-hot-middleware/client?path=http://localhost:8083/__webpack_hmr',
      'webpack/hot/only-dev-server',
      './src/entry'
    ],
  },
                               
                                       
有杯葡萄  238                                            
2018-08-03 回答                                            

来自  https://segmentfault.com/q/1010000012669789?sort=created                        


                       

入门                            

React Hot Loader是一个插件,允许React组件在不丢失状态的情况下进行实时重新加载。它适用于Webpack和其他支持热模块替换(HMR)和Babel插件的捆绑器。                            

如果你只是想快速启动一个新鲜的准系统样板,一切都可以开箱即用(使用Webpack),请查看react-hot-boilerplate官方样板:                            

https://github.com/gaearon/react-hot-boilerplate                            

或新的,最小的一个:                            

https://github.com/wkwiatek/react-hot-loader-minimal-boilerplate                            

集成到您的应用程序中                            

以下是将React Hot Loader集成到当前项目中的三步指南。                            

步骤1(共3步):启用热模块更换(HMR)                            

HMR允许我们在不重新启动服务器的情况下就地替换模块。以下是如何为不同的捆绑包启用它:                            

的WebPack                            

选项1:Webpack Dev Server CLI(仅限客户端呈现)                            

使用阵营热装载机的WebPack最简单,最快捷的选择是使用webpack-dev-server--hotCLI选项。                            

  "scripts": {
    "start": "webpack-dev-server --hot"
  },
                               

而已!你可以去第2步                            

选项2:具有自定义服务器的Webpack Dev Server(仅限客户端呈现)                            

如果您只在客户端进行渲染,但必须使用某些自定义节点服务器,这仍然是一个简单的选择。您只需server.js从官方样板复制到您的项目中即可。配置的重要部分是,在创建a时new WebpackDevServer,需要指定hot: true为选项。                            

这是server.js来自官方样板:                            

var webpack = require('webpack');
var WebpackDevServer = require('webpack-dev-server');
var config = require('./webpack.config');

new WebpackDevServer(webpack(config), {
  publicPath: config.output.publicPath,
  hot: true,
  historyApiFallback: true
}).listen(3000, 'localhost', function (err, result) {
  if (err) {
    return console.log(err);
  }

  console.log('Listening at http://localhost:3000/');
});
                               

要通过它启动它npm start,请将以下脚本添加到package.json                            

  "scripts": {
    "start": "node server.js"
  },
                               

在您的工作中webpack.config.js,您需要将dev服务器和热重装服务器添加到该entry部分。在应用entry程序的入口点之前将它们放入数组中:                            

  entry: [
    'webpack-dev-server/client?http://0.0.0.0:3000', // WebpackDevServer host and port
    'webpack/hot/only-dev-server', // "only" prevents reload on syntax errors
    './scripts/index' // Your appʼs entry point
  ]
                               

最后,Webpack的Hot Replacement插件必须包含在plugins配置部分中。添加var webpack = require('webpack')到Webpack配置的顶部,然后添加new webpack.HotModuleReplacementPlugin()到以下plugins部分:                            

  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ]
                               

注意:如果您使用的是Webpack Dev Server命令行界面而不是其Node API,请不要在使用该--hot标志时将此插件添加到配置中它与--hot选项互斥                                

查看样板文件webpack.config.js,一起查看。                            

选项3:使用webpack-dev-middleware(客户端和服务器)快速                            

如果您使用的是服务器端呈现,则上面的WebpackDevServer是不够的。相反,我们必须使用Express服务器webpack-dev-middleware这是一项更多的工作,但也给了我们更多的控制权。我们需要添加这个中间件,这是它的切入点。                            

XXX TODO                            

流星                            

  • 如果您使用的是webpack:webpack,则可以按照Webpack说明进行操作,或者在论坛帖子中寻求帮助

  • 否则,对于“原生”Meteor中的HMR,键入:meteor remove ecmascript && meteor add gadicc:ecmascript-hot或者查看自述文件以获取更多详细信息。此处还有一些特定于Meteor的RHLv3安装说明

步骤2(共3步):使用HMR替换根组件                            

要在发生更改时更新组件,您需要向主客户端入口点文件添加一些代码。                            

如果您的入口点如下所示,<RootContainer>您应用的顶级组件在哪里                            

import React from 'react';
import { render } from 'react-dom';
import RootContainer from './containers/rootContainer.js';

render(<RootContainer />, document.getElementById('react-root'));
                               

添加以下代码以接受对RootContainer 或其任何后代的更改                            

 if (module.hot) {
   module.hot.accept('./containers/rootContainer.js', () => {
     const NextRootContainer = require('./containers/rootContainer.js').default;
     render(<NextRootContainer />, document.getElementById('react-root'));
   })
 }
                               

工作原理:当HMR运行时收到更新的模块时,它首先检查模块是否知道如何更新自身。然后它上传导入/需求链,寻找可以接受更新的父模块。添加的代码允许我们的根组件接受来自任何子组件的更新。                                

请注意,如果没有进一步的步骤,这足以将更改热重新加载到React组件,但是不会保留其内部组件状态,因为安装了组件的新副本,并重新初始化其状态。外部保存在状态存储中的状态(例如Redux)显然不会丢失。                            

步骤3(共3步):添加React Hot Loader以保留组件状态                            

要保留内部组件状态,现在需要添加react-hot-loader到项目中。                            

  1. 安装包:

    $ npm install --save-dev react-hot-loader@next
    
                                           
  2. 将包添加到您的配置:

    一个。如果您使用Babel,请修改您的.babelrc至少包括:                                    

      {
        "plugins": [ "react-hot-loader/babel" ]
      }
    
                                           

    湾 或者,在Webpack中,添加react-hot-loader/webpack到以下loaders部分webpack.config.js                                    

        module: {
            loaders: [{
                test: /\.js$/,
                loaders: ['react-hot-loader/webpack', 'babel'],
                include: path.join(__dirname, 'src')
            }]
        }
    
                                           

    注意:react-hot-loader/webpack仅适用于导出的组件,而react-hot-loader/babel拾取文件中的所有顶级变量作为一种解决方法,使用Webpack,您可以导出要维护其状态的所有组件,即使它们未在其他任何位置导入也是如此。                                        

  3. 更新主客户端入口点:

    一个。将以下行添加到主客户端入口点的顶部:                                    

    import 'react-hot-loader/patch';
    
                                           

    或者,在Webpack中,添加react-hot-loader/patch到以下entry部分webpack.config.js                                        

      entry: [
        'react-hot-loader/patch', // RHL patch
        './scripts/index' // Your appʼs entry point
      ]
    
                                           

    湾 将应用程序的顶级组件包装在一个内部<AppContainer>                                    

    AppContainer是由react-hot-loader处理热重新加载以及错误处理的组件提供的它还在内部处理在生产环境中运行时禁用热重新加载/错误处理,因此您不再需要。                                        

    您需要将两个实例(例如原始安装)和安装代码包装在module.hot.accept()函数内部请注意,<AppContainer>必须只包装一个React组件。                                    

    您的主要入口点现在看起来应该是这样的:                                    

    import 'react-hot-loader/patch';
    import React from 'react';
    import ReactDOM from 'react-dom';
    
    import { AppContainer } from 'react-hot-loader';
    import RootContainer from './containers/rootContainer';
    
    const render = Component => {
      ReactDOM.render(
        <AppContainer>
          <Component />
        </AppContainer>,
        document.getElementById('root')
      );
    }
    
    render(RootContainer);
    
    if (module.hot) {
      module.hot.accept('./containers/rootContainer.js', () => {
        const NextRootContainer = require('./containers/rootContainer').default;
        render(NextRootContainer);
      });
    }
    
                                           

    C。Webpack 2内置了对ES2015模块的支持,您无需在module.hot.accept中重新使用您的应用程序根目录。上面的例子变成:                                    

    注意:要使其工作,您需要通过将Babel ES2015预设更改为选择退出Babel转换ES2015模块                                        

    {
      "presets": [["es2015", { "modules": false }]]
    }
    
                                               

    或者在使用latest预设时:                                        

    {
      "presets": [
        ["latest", {
          "es2015": {
            "modules": false
          }
        }]
      ]
    }
    
                                               
    import 'react-hot-loader/patch';
    import React from 'react';
    import ReactDom from 'react-dom';
    import { AppContainer } from 'react-hot-loader';
    
    import RootContainer from './containers/rootContainer';
    
    const render = Component => {
      ReactDOM.render(
        <AppContainer>
          <Component />
        </AppContainer>,
        document.getElementById('root')
      );
    }
    
    render(RootContainer);
    
    if (module.hot) {
      module.hot.accept('./containers/rootContainer', () => { render(RootContainer) });
    }
    
                                           

而已!快乐热重装!                            

故障排除                            

如果热重新加载不起作用,通常是由于偏离上述配置。确保将您的设置与react-hot-boilerplate进行比较,react-hot-loader-minimal-boilerplate并验证样板是否适合您。仔细观察小错字。                            

如果您遇到困难,请在Gitter会议室提出问题或寻求帮助,我们会尽力解决问题。                            

为了改进我们的文档,我们需要您的反馈!随意为此开一个问题                            


由Dan Abramov在Stampsy建造。                         


来自  http://gaearon.github.io/react-hot-loader/getstarted/                        


                       

JavaScript的                            

朱利安瓦伦西亚                                        
                                       

react-hot-loader / index.js'不是加载器(必须具有普通或音调功能)                                        

运行npm start后会出现此错误,并且dev服务器无法启动:                                            

/node_modules/react-hot-loader/index.js'不是加载器(必须具有普通或音调功能)                                            

1答案                                    

朱利安瓦伦西亚                                            
                                           

找到解决方案:                                                    

您需要将/ webpack添加到.js加载器中                                                    

loaders: ['react-hot-loader/webpack', 'babel-loader']                                                    

来自  https://teamtreehouse.com/community/reacthotloaderindexjs-is-not-a-loader-must-have-normal-or-pitch-function