16

React プロジェクトのプロダクション ビルドを作成しようとしていますが、間違った構成が選択されます。

開発版では、HMR (Hot Module Replacement) を使用しています。これは、.babelrc の下で構成されenv > development > pluginsます。余分なノードを追加するenv > productionと、無視されるようです。HMR で開発構成を使用しているため、エラーが発生します。

キャッチされないエラー: locals[0] はmodule、ホット モジュール置換 API が有効になっているオブジェクトではないようです。envBabel 設定の section を使用して、本番環境で react-transform-hmr を無効にする必要があります。README の例を参照してください: https://github.com/gaearon/react-transform-hmr

もちろん、その情報は確認しましたが、すべて正しいようです。.babelrc の開発構成から HMR プラグインを削除すると、実際に運用ではなく開発構成を使用していることを証明して動作します。これが私のファイルです:

パッケージ.json

{
  "name": "myproject",
  "main": "index.js",
  "scripts": {
    "serve": "cross-env NODE_ENV=development webpack-dev-server --content-base bin/ --devtool eval --progress --colors --hot --inline",
    "deploy": "cross-env NODE_ENV=production BABEL_ENV=production webpack -p --config webpack.production.config.js"
  }
  //dependencies omitted in this example
}

.babelrc

{
    "presets": ["react", "es2015", "stage-0"],
    "plugins": [
        ["transform-decorators-legacy"]
    ],
    "env": {
        "development": {
            "plugins": [
                ["react-transform", {
                    "transforms": [{
                        "transform": "react-transform-hmr",
                        "imports": ["react"],
                        "locals": ["module"]
                    }]
                }]
            ]
        },
        "production": {
            "plugins": []
        }
    }
}

でわかるようにpackage.json > scripts > deploy、BABEL_ENV を明示的に「運用」に設定しています。

なぜこうなった?本番ビルドで HMR プラグインが無視されるようにするにはどうすればよいですか?

ところで、検索すると React-transform-HMR Github ページの問題 #5 につながることが多く、これは明確な解決策のない長いスレッドです。

編集 2016.03.30: リクエストに応じて webpack 構成の Babel 部分を追加します。編集 2016.04.06: リクエストに応じて webpack ファイル全体を追加します。

webpack.production.config.js

require('es6-promise').polyfill();
var path = require('path');

module.exports = {
    entry: './main.jsx',
    context: __dirname + path.sep + 'src',
    output: {
        path: path.resolve(__dirname, './bin'),
        filename: 'index.js'
    },
    devServer: {
        port: 3333
    },
    module: {
        loaders: [
            {
                test: /\.js(x?)$/,
                exclude: /node_modules/,
                loader: 'babel',
                query: {
                    presets: ['react', 'es2015', 'stage-0'],
                    plugins: [['transform-decorators-legacy']]
                }
            },
            {
                test: /\.css$/,
                loader: "style!css"
            },
            {
                test: /\.scss$/,
                exclude: /(node_modules|bower_components)/,
                loader: 'style-loader!css-loader!sass-loader?sourceMap'
            }
        ]
    }
};
4

4 に答える 4

8

私のために働いた唯一のことは、私が書いたことです-

process.env.NODE_ENV = 'production';

私の webpack.config.prod.js ファイルの先頭にあります。

于 2016-07-13T10:42:36.423 に答える
5

で指定された値のdevelopmentセクションを何があってもBabelが使い続けるようです。私の問題を解決したのは、「開発」以外の名前を使用し、それをBABEL_ENVの値として設定することでした。env.babelrc

"env": {
    "dev": {
        "plugins": [
        ]
    },
    "production": {
    }
}

開発には別のconfを使用します。私が持っているプラ​​グインでは:

new webpack.DefinePlugin({
  'process.env': {
    'NODE_ENV': JSON.stringify('development'),
    'BABEL_ENV': JSON.stringify('dev')
  }
}),
于 2016-05-24T14:53:16.423 に答える
0

をそのまま使用できますbabel-preset-react-hmre

.babelrc

{
    "presets": ["react", "es2015", "stage-0"],
    "plugins": [
        "transform-decorators-legacy"
    ],
    "env": {
        "development": {
            "presets": ["react-hmre"]
        }
    }
}

ウェブパック

    {
        test: /\.js(x?)$/,
        exclude: /node_modules/,
        loader: 'babel',
        query: {
            presets: ['es2015', 'react', 'stage-0'],
            plugins: ['transform-decorators-legacy'],
            env: {
              development: {
                presets: ['react-hmre']
              }
            }
        }
    }
于 2016-04-04T13:41:33.653 に答える
0

&in shell はバックグラウンドで実行されることを意味するため、変数宣言が同時に発生するビルドにキャッチされない可能性があります。良いことは、コマンドの先頭に変数宣言を追加できることです。

次のようにコマンドを簡略化できます。

"serve": "NODE_ENV=development webpack-dev-server --content-base bin/ --devtool eval --progress --colors --hot --inline",
"deploy": "NODE_ENV=production BABEL_ENV=production webpack -p --config webpack.production.config.js"
于 2016-03-30T11:53:34.057 に答える