您目前正在使用NODE_ENV ==='production'之外的缩小代码.这意味着您正在运行较慢的Redux开发版本

doc*_*pus 11 reactjs webpack redux

我已经创建了一个基本应用程序并将其部署用于生产.运行webpack -p并启动服务器后,我现在收到此控制台日志错误:

You are currently using minified code outside of NODE_ENV === 'production'. This means that you are running a slower development build of Redux. You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) to ensure you have the correct code for your production build.
Run Code Online (Sandbox Code Playgroud)

这是我的webpack.config.js文件:

module.exports = {
  entry: [
    './src/index.js'
  ],
  output: {
    path: __dirname,
    publicPath: '/',
    filename: 'bundle.js'
  },
  module: {
    loaders: [{
      exclude: /node_modules/,
      loader: 'babel',
      query: {
        presets: ['react', 'es2015', 'stage-1']
      }
    }]
  },
  resolve: {
    extensions: ['', '.js', '.jsx']
  },
  devServer: {
    historyApiFallback: true,
    contentBase: './'
  }
};
Run Code Online (Sandbox Code Playgroud)

对于React和Webpack来说,这是一个非常新的东西.如果有人能够指出什么是错的并帮助我绕过webpack(这非常令人困惑)那么它将永远感恩!

编辑:

我添加了webpack插件并运行NODE_ENV=production webpack -p并在终端中收到此错误:

/Users/Joseph/workspace/weather-fcc/webpack.config.js:27
    new webpack.DefinePlugin({
        ^

ReferenceError: webpack is not defined
    at Object.<anonymous> (/Users/Joseph/workspace/weather-fcc/webpack.config.js:27:9)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
    at Function.Module._load (module.js:438:3)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at requireConfig (/usr/local/lib/node_modules/webpack/bin/convert-argv.js:96:18)
    at /usr/local/lib/node_modules/webpack/bin/convert-argv.js:109:17` FWIW my webpack version is 1.12.9
Run Code Online (Sandbox Code Playgroud)

tay*_*c93 15

Webpack 4更新

如果您使用的是webpack> = 4,则可以设置modeproduction.这将自动定义NODE_ENVproduction无需使用define插件.https://webpack.js.org/concepts/mode/#mode-production.

似乎webpack已经更新了-p标志,process.env.NODE_ENV以便production在您的捆绑代码中自动定义(感谢@ x-yuri指出这一点).因此,虽然下面的答案现在是不必要的,但我将其保留在那里以供参考,并作为webpack定义插件如何工作的解释.

原始答案+解释

TLDR:使用webpack define插件设置process.env.NODE_ENV为production.

长版:

React,Redux和许多其他JS库包括额外的验证和错误日志记录,使开发更容易.但是,您显然不希望在生产中使用它,因为这会使您的代码库更大更慢.这些检查通常包含在如下所示的语句中:

if (process.env.NODE_ENV !== 'production') {
  // do development checks
}
Run Code Online (Sandbox Code Playgroud)

你得到的错误是Redux告诉你虽然你已经缩小了代码,但是process.env.NODE_ENV没有设置production,所以开发检查仍然存在.要解决此问题,您需要使用webpack define插件设置process.env.NODE_ENV为生产.

var webpack = require('webpack');

module.exports = {
  entry: [
    './src/index.js'
  ],
  output: {
    path: __dirname,
    publicPath: '/',
    filename: 'bundle.js'
  },
  module: {
    loaders: [{
      exclude: /node_modules/,
      loader: 'babel',
      query: {
        presets: ['react', 'es2015', 'stage-1']
      }
    }]
  },
  resolve: {
    extensions: ['', '.js', '.jsx']
  },
  devServer: {
    historyApiFallback: true,
    contentBase: './'
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
    }),
  ]
};
Run Code Online (Sandbox Code Playgroud)

请注意,process.env.NODE_ENV当您运行webpack时,我正在定义为您设置的值.因此,要生成生产包,您需要运行NODE_ENV=production webpack -p,而不仅仅是webpack -p.这将替换的任何实例process.env.NODE_ENVproduction你的包.所以上面显示的检查现在看起来像这样:

if ('production' !== 'production') {
  // do development checks
}
Run Code Online (Sandbox Code Playgroud)

Minifiers足够聪明,可以检测到if语句中的代码永远不会发生,并将从生产包中删除它.因此,您将获得两全其美:更好的开发体验,并且您的生产包中没有额外的代码:)

  • “例如,-optimize-minimize标志将在后台包含UglifyJSPlugin。--define process.env.NODE_ENV =“'production'”将对上述的DefinePlugin实例执行相同的操作。并且,webpack -p将自动调用这两个标志,并因此调用要包含的插件。” 是否没有运行`webpack -p` [足够](https://webpack.js.org/guides/production/#cli-alternatives)?如果要在`webpack.config.js`中使用`NODE_ENV`,则只需要在`NODE_ENV = production`之前添加。我有什么想念的吗? (2认同)