React プロジェクトのプロダクション ビルドを作成しようとしていますが、間違った構成が選択されます。
開発版では、HMR (Hot Module Replacement) を使用しています。これは、.babelrc の下で構成されenv > development > plugins
ます。余分なノードを追加するenv > production
と、無視されるようです。HMR で開発構成を使用しているため、エラーが発生します。
キャッチされないエラー: locals[0] は
module
、ホット モジュール置換 API が有効になっているオブジェクトではないようです。env
Babel 設定の 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'
}
]
}
};