【问题标题】:React Hot Loader 3 with Webpack and in productionReact Hot Loader 3 与 Webpack 并在生产中
【发布时间】:2023-03-04 05:59:01
【问题描述】:

我正在使用 Webpack 和 React Hot Loader v3。在开发中,它的工作大部分与预期一致。但是,我希望在使用

输出静态捆绑文件时禁用热加载功能

webpack --progress -p

但我得到的是这种重复的错误;

这是我的 Webpack 配置;

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

module.exports = {
    devServer: {
        publicPath: '/js/',
        hot: false,
        historyApiFallback: true,
        port: process.env.PORT || 3000
    },
    devtool: 'eval-source-map',
    entry: [
        'react-hot-loader/patch',
        'webpack-dev-server/client?http://localhost:3000',
        'webpack/hot/only-dev-server',
        './js/app/index'
    ],
    output: {
        path: path.join(__dirname, '/web/js/'),
        filename: 'bundle.js',
        publicPath: '/js/'
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin()
    ],
    module: {
        loaders: [
            {
                test: /\.css$/,
                loader: "style-loader!css-loader?modules",
            },
            {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                loader: 'babel',
                query: {
                    presets: ['es2015', 'react', 'stage-0'],
                    plugins: ['transform-flow-strip-types'],
                    cacheDirectory: true
                },
                include: path.join(__dirname, '/js/')
            }
        ]
    }
};

我收到了尝试禁用HotModuleReplacementPlugin() 的建议,但仍然出现相同的错误。关于我在这里缺少什么的任何想法?

【问题讨论】:

    标签: webpack babeljs webpack-dev-server react-hot-loader


    【解决方案1】:

    您需要一个单独的生产配置,该配置不包括条目中的开发服务器或热加载器。有关我的 webpack 配置的简化版本,请参见下文。如果应用程序使用webpack -p 之类的东西运行,那么LAUNCH_COMMAND 就是production 并且使用productionConfig

    但这只是一种方法。您还可以有一个单独的配置文件用于生产。像webpack.prod.config.js 这样的东西。然后您可以使用webpack -p --config webpack.prod.config.js 指定生产配置,而不是运行webpack -p。同样,您的生产配置不会在条目中包含 webpack-dev-serverhot-loader

    import webpack from 'webpack'
    import path from 'path'
    import HtmlWebpackPlugin from 'html-webpack-plugin'
    
    const HtmlWebpackPluginConfig = new HtmlWebpackPlugin({
      template: path.join(__dirname, '/app/index.html'),
      filename: 'index.html',
      inject: 'body',
    })
    
    const PATHS = {
      app: path.join(__dirname, 'app'),
      build: path.join(__dirname, 'dist'),
    }
    
    const LAUNCH_COMMAND = process.env.npm_lifecycle_event
    
    const isProduction = LAUNCH_COMMAND === 'production'
    process.env.BABEL_ENV = LAUNCH_COMMAND
    
    const productionPlugin = new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: JSON.stringify('production'),
      },
    })
    
    const base = {
      output: {
        path: PATHS.build,
        filename: 'index_bundle.js',
      },
    }
    
    const developmentConfig = {
      entry: [
        'webpack-dev-server/client?http://localhost:8080',
        'webpack/hot/only-dev-server',
        './app/index',
      ],
    }
    
    const productionConfig = {
      entry: [
        './app/index',
      ],
    }
    
    export default Object.assign({}, base,
      isProduction === true ? productionConfig : developmentConfig)
    

    【讨论】:

      【解决方案2】:

      除了去掉HotModuleReplacementPlugin,你还需要去掉额外的入口点:

      // Current
      entry: [
          'react-hot-loader/patch',
          'webpack-dev-server/client?http://localhost:3000',
          'webpack/hot/only-dev-server',
          './js/app/index'
      ],
      
      // Fixed
      entry: [
          './js/app/index'
      ],
      

      【讨论】:

        猜你喜欢
        • 2017-10-20
        • 2016-02-28
        • 2018-01-22
        • 2020-01-01
        • 2016-06-14
        • 2018-02-11
        • 1970-01-01
        • 2015-12-03
        • 2016-08-20
        相关资源
        最近更新 更多