Sto provando a creare una build di produzione del mio progetto React, ma seleziona la configurazione sbagliata.Perché la build di produzione dell'app React (con Webpack e Babel) utilizza un ambiente di sviluppo errato con HMR, che causa errori?
Nella versione di sviluppo sto usando HMR (Sostituzione modulo caldo). Questo è configurato in .babelrc, sotto env > development > plugins
. Quando si aggiunge un nodo aggiuntivo env > production
sembra essere ignorato. Sta ancora utilizzando la configurazione di sviluppo con HMR, che causa un errore:
Uncaught Error: locals[0] does not appear to be a
module
object with Hot Module replacement API enabled. You should disable react-transform-hmr in production by usingenv
section in Babel configuration. See the example in README: https://github.com/gaearon/react-transform-hmr
Naturalmente ho controllato quell'informazione, ma tutto sembra giusto. Quando ho rimosso il plugin HMR dalla configurazione di sviluppo di .babelrc, funziona, dimostrando che sta effettivamente utilizzando la configurazione di sviluppo anziché la produzione. Ecco i miei file:
package.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": []
}
}
}
Come si può vedere nel package.json > scripts > deploy
, sto impostando anche in modo esplicito il BABEL_ENV a 'la produzione '.
Perché sta succedendo? Come posso assicurarmi che la build di produzione ignori i plugin HMR?
A proposito, la ricerca spesso conduce a issue #5 on the React-transform-HMR Github page, che è un thread lungo senza una soluzione chiara.
Modifica 2016.03.30: aggiunta della parte Babel della configurazione del mio webpack su richiesta. Modifica 2016.04.06: aggiunta di un intero file webpack su richiesta.
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'
}
]
}
};
Quale sistema operativo si esegue? – Mijamo
Sono su OSX ma il mio compagno di squadra è su Windows. Modificheremo le righe di script, dato che stiamo usando 'cross-env' adesso. – Micros
Puoi mostrare la configurazione del webpack solo per essere sicuro? – Mijamo