javascript - online - transpilador babel
No se puede requerir() valor de exportación predeterminado en Babel 6.x (2)
Solo para seguir con la respuesta correcta anterior.
Si desea utilizar el comportamiento de exportación predeterminado de
babel@5
, puede probar
babel-plugin-add-module-exports
.
Me está funcionando bastante bien.
En Babel 5.x, puedo escribir el siguiente código:
app.js
export default function (){}
index.js
require(''babel/register'');
require(''./app'')();
Entonces, puedo ejecutar el
node index.js
sin errores.
Sin embargo, usando Babel 6.x, ejecutando el siguiente código
index.es6.js
require(''babel-core/register'');
require(''./app'')();
da como resultado un error
require (...) no es una función
¿Quiero saber por qué?
TL; DR
Tienes que usar
require(''./app'').default();
Explicación
Babel 5 solía tener un truco de compatibilidad para
export default
: si un módulo contenía solo una exportación, y era una exportación predeterminada, se asignaba a
module.exports
.
Entonces, por ejemplo, su módulo
app.js
export default function () {}
se trasladaría a esto
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = function () {};
module.exports = exports["default"];
Esto se realizó
únicamente
por compatibilidad con módulos transpilados Babel requeridos (como lo está haciendo).
También fue inconsistente;
si un módulo contuviera exportaciones con nombre y predeterminadas, no podría
require
-d.
En realidad, de acuerdo con las especificaciones del módulo ES6, una exportación predeterminada
no
es
diferente
de una exportación con nombre con el nombre
default
.
Es solo el azúcar sintáctico que puede resolverse estáticamente en tiempo de compilación, por lo que esto
import something from ''./app'';
es lo mismo que esto
import { default as something } from ''./app'';
Dicho esto, parece que Babel 6 decidió abandonar el truco de interoperabilidad al transpilar módulos. Ahora, su módulo app.js se transpila como
''use strict'';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function () {};
Como puede ver, no más asignaciones a
module.exports
.
Para
require
este módulo, debe hacer
require(''./app'').default();