reactjs - what - webpack react js
Cómo configurar Babel 6 etapa 0 con React y Webpack (6)
¿Has intentado usar solo la
stage-1
?
Usar la propiedad de consulta funcionó para mí.
```
module: {
loaders: [{
test: //.jsx?$/,
loader: ''babel'',
query: {
presets: [''es2015'', ''stage-1'', ''react'']
}
}]
}
```
Por supuesto, no he podido usar las opciones
.babelrc
y babel en
package.json
.
Todavía
babel-*v6.0
tratando de descubrir
babel-*v6.0
Mi comprensión de los documentos
Veo que Babel 6 tiene tres presets por ahora: es2015, react y stage-x.
Leí que puedo configurarlos en
.babelrc
así:
{
"presets": ["es2015", "react", "stage-0"]
}
o directamente en el paquete. JSON así:
{
...,
"version": x.x.x,
"babel": {
"presets": ["es2015", "react", "stage-0"]
},
...,
}
Además puedo usar babel-loader con webpack como este:
loader: ''babel?presets[]=es2015''
Mi problema
Entonces, para compilar todo lo bueno y limpio, agrego
babel-loader
, que acaba de actualizarse para que funcione con Babel6, a la configuración del paquete web de esta manera:
module.exports = function(options) {
var jsLoaders = [''babel?presets[]=es2015''];
[...]
loaders: [
{
test: //.js$/,
exclude: /node_modules/,
loaders: jsLoaders
},
{
test: //.jsx$/,
exclude: /node_modules/,
loaders: options.production ? jsLoaders : [''react-hot''].concat(jsLoaders)
},
[...]
Ahora, cuando compilo
sin
.babelrc
en la raíz o las opciones preestablecidas establecidas en
package.JSON
, es decir, solo con el preajuste babel-loader es2015 configurado en la configuración del paquete web, obtengo un error inesperado de token sobre tipos de prop estáticos en mi clase de componente React:
ERROR in ./app/components/form/index.jsx
Module build failed: SyntaxError: /Library/WebServer/Documents/yarsk.test/app/components/form/index.jsx: Unexpected token (19:19)
17 | // ES6 React Component:
18 | export default class SurveyForm extends Component {
> 19 | static propTypes = {
| ^
En GitHub me dijeron que esta es una característica de
stage-1
, a saber,
transform-class-properties
.
Así que me gustaría implementar la
stage-0
inmediato.
PERO
Cuando lo hago agregando
.babelrc
o definiendo
package.JSON
como el anterior, obtengo un error de falla de compilación muy extraño:
ERROR in ./app/components/form/index.jsx
Module build failed: Error: /Library/WebServer/Documents/yarsk.test/app/components/form/index.jsx: We don''t know what to do with this node type. We were previously a Statement but we can''t fit in here?
at NodePath.insertAfter (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/modification.js:181:13)
at NodePath.replaceWithMultiple (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/replacement.js:92:8)
at handleClassWithSuper (/Library/WebServer/Documents/yarsk.test/node_modules/babel-plugin-transform-class-constructor-call/lib/index.js:80:10)
at PluginPass.Class (/Library/WebServer/Documents/yarsk.test/node_modules/babel-plugin-transform-class-constructor-call/lib/index.js:101:11)
at newFn (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/visitors.js:233:27)
at NodePath._call (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/context.js:72:18)
at NodePath.call (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/context.js:44:17)
at NodePath.visit (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/context.js:102:12)
at TraversalContext.visitQueue (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:151:16)
at TraversalContext.visitSingle (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:111:19)
at TraversalContext.visit (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:195:19)
at Function.traverse.node (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/index.js:139:17)
at NodePath.visit (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/path/context.js:106:22)
at TraversalContext.visitQueue (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:151:16)
at TraversalContext.visitMultiple (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:106:17)
at TraversalContext.visit (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/context.js:193:19)
at Function.traverse.node (/Library/WebServer/Documents/yarsk.test/node_modules/babel-traverse/lib/index.js:139:17)
@ ./app/index.jsx 9:0-28
O, en resumen:
Module build failed: Error: /.../index.jsx: We don''t know what to do with this node type. We were previously a Statement but we can''t fit in here?
Module build failed: Error: /.../index.jsx: We don''t know what to do with this node type. We were previously a Statement but we can''t fit in here?
Aquí es donde estoy atrapado. Escribí este componente con Babel5 cuando pude compilar con babel-loader así y todo funcionó bien:
loader: ''babel?optional[]=runtime&stage=0
Ahora obtengo los errores mencionados compilando.
-
¿Es este un problema de
babel-loader
, o un problema debabel
? -
¿Dónde tengo que configurar la
stage-0
para que no arroje errores?
Actualizar
Al compilar con los ajustes preestablecidos establecidos y usar la solución alternativa mencionada para el error de exportación de la clase (no debe exportar la clase hasta después de crearla), el orden de los ajustes preestablecidos cambia el mensaje de error.
Cuando configuro primero la
stage-0
el error ahora es
''this'' is not allowed before super() (This is an error on an internal node. Probably an internal error)
Cuando pongo la
stage-0
segundo o tercero recibo el mensaje sobre error de sintaxis desde arriba.
Último
Para obtener los últimos avances con respecto a estos errores, consulte mi publicación o el nuevo rastreador de problemas de babel en phabricator para obtener más información. (Básicamente, la compilación se corrige a partir de 6.2.1, pero ahora suceden otras cosas)
Todos los errores mencionados en este artículo están completamente corregidos a partir de Babel 6.3.x. Actualice sus dependencias si todavía tiene problemas.
¿Has probado?:
presets: [{
plugins: [
''transform-class-properties''
]
}, ''stage-0'', ''es2015'', ''react'']
Después de tener los mismos problemas, pude hacer que esto funcionara con React usando la siguiente configuración de WebPack.
module.exports = {
entry: ''./app/Index.js'',
output: { path: __dirname, filename: ''dist/bundle.js'' },
module: {
loaders: [
{
test: //.js$/,
loader: ''babel'',
query: {
presets: [''react'']
}
}
]
}
};
También necesitaba instalar babel-preset-react también.
npm install --save-dev babel-preset-react
EDITAR: Por supuesto, es posible que aún necesite incluir también el preajuste ES2015 si también está escribiendo ES6.
Los Presets de Babel se pueden encontrar aquí: https://github.com/babel/babel/tree/development/packages
Intente reemplazar su exportación con tal construcción:
class SurveyForm extends Component {/*implementation*/}
export default SurveyForm
Los dos errores bastante pesados que encontré aquí, a saber, la exportación directa de una clase ES6 con una propiedad estática y un problema con el constructor ES6 se discuten en las respuestas de este hilo
y se pueden encontrar en GitHub explícitamente aquí (error de exportación) y aquí (error del constructor)
.
(GitHub Issue Tracker se ha cerrado y los
problemas, errores y solicitudes se han trasladado aquí
).
Ambos son errores confirmados oficialmente, corregidos desde Babel 6.3.17
(Tal vez una o dos antes, no antes de 6.3.x, esta es la versión en la que estoy y todo funciona como estaba con Babel5. Feliz codificación para todos).
(Por los récords:)
Entonces, si recibe el siguiente mensaje de error en la CLI:
We don''t know what to do with this node type. We were previously a Statement but we can''t fit in here?
Es probable que esté exportando una clase ES6 con una propiedad estática como esta o de una manera similar (tenga en cuenta que esto ya no parece estar conectado a la clase que se está extendiendo, sino a una clase que tiene una propiedad estática) :
import React, { Component, PropTypes } from ''react''
export default class ClassName extends Component {
static propTypes = {...}
// This will not get compiled correctly for now, as of Babel 6.1.4
}
La solución simple mencionada por Stryzhevskyi y varias personas en GitHub:
import React, { Component, PropTypes } from ''react''
class ClassName extends Component {
static propTypes = {...}
}
export default ClassName // Just export the class after creating it
El segundo problema es sobre el siguiente error:
''this'' is not allowed before super() (This is an error on an internal node. Probably an internal error)
A pesar de ser una regla legítima como lo señala Dominic Tobias, este es un error confirmado en el que parece que las clases extendidas que tienen sus propias propiedades arrojarán este o un mensaje similar. Por ahora no he visto ninguna solución para este. Mucha gente regresó a Babel5 por este motivo por ahora (a partir de 6.1.4).
Supuestamente, esto se solucionó con el lanzamiento de Babel 6.1.18
(consulte el problema de GitHub anterior),
pero la gente, incluido yo, todavía ve que ocurre el mismo problema exacto.
También tenga en cuenta que por ahora el orden en el que carga los presets de babel
stage-x
,
react
y
es2015
parece ser importante y puede cambiar su salida.
A partir de Babel 6.2.1
ambos errores son
corregidos
, el código se compila bien.
Pero ...
todavía hay otro que probablemente afecta a muchas personas que trabajan con react, que arroja
ReferenceError: this hasn''t been initialised - super() hasn''t been called
a
ReferenceError: this hasn''t been initialised - super() hasn''t been called
en tiempo de ejecución.
Referenciado aquí
Manténganse al tanto...
Completamente arreglado desde Babel 6.3.17
(Tal vez una o dos antes, no antes de 6.3.x, esta es la versión en la que estoy y todo funciona como estaba con Babel5. Feliz codificación para todos).
Here hay un ejemplo de trabajo con Babel 6, React, Webpack y Sequelize:
Básicamente este es el
.babelrc
{
"presets": [
"es2015",
"react",
"stage-0"
],
"env": {
"development": {
"plugins": [
"babel-relay-plugin-loader",
[
"react-transform",
{
"transforms": [
{
"transform": "react-transform-hmr",
"imports": [
"react"
],
"locals": [
"module"
]
},
{
"transform": "react-transform-catch-errors",
"imports": [
"react",
"redbox-react"
]
}
]
}
]
]
},
"production": {
"plugins": [
"babel-relay-plugin-loader"
]
}
}
}
y estas son las versiones del módulo
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Funciona para mi.