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 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é?
javascript
ecmascript-6
babeljs
XGHeaven
fuente
fuente
.babelrc
? ¿Estás especificando opciones de Babel en alguna parte? Lo pregunto porque Babel 6 no transpila nada de forma predeterminada y no está especificando eles2015
ajuste preestablecido en el código que ha publicado..babelrc
, el otro script es6 se está ejecutando normalmentebabel
es para preguntas sobre una biblioteca de Python con dicho nombre.app.js
, pero ejecutarlo de inmediatoRespuestas:
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 le asignabamodule.exports
. Entonces, por ejemplo, su módulo app.jsexport default function () {}
se trasladaría a esto
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = function () {}; module.exports = exports["default"];
Esto fue hecho exclusivamente para la compatibilidad con
require
-ing módulos transpiled-Babel (como lo está haciendo). También fue inconsistente; si un módulo contiene exportaciones con nombre y predeterminadas, no puede serrequire
-d.En realidad, de acuerdo con la especificación del módulo ES6, una exportación predeterminada no es diferente de una exportación con nombre con el nombre
default
. Es solo azúcar sintáctico que se puede resolver estáticamente en tiempo de compilación, por lo que esteimport something from './app';
es lo mismo que este
import { default as something } from './app';
Dicho esto, parece que Babel 6 decidió eliminar 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 ves, no hay más asignaciones a
module.exports
. Pararequire
este módulo, debe hacerrequire('./app').default();
fuente
require('./app').default;
funcionó.default()
regresóundefined
require(...).default
da una referencia a la función exportada.default()
lo llama. Si su función no devuelve nada (o está vacía), entonces, por supuesto, el resultado seráundefined
.require('path').default()
no funciona,require('path').default
funciona para mírequire('./app').default;
Si exporta un objeto en lugar de una función.Solo para continuar con la respuesta correcta arriba.
Si desea utilizar el comportamiento de exportación predeterminado de
babel@5
, puede probar el complemento babel-plugin-add-module-export .Me está funcionando bastante bien.
fuente
Si esto no funciona
require('./app').default()
utilizar
require('./app').default
Sin la llamada a la función al final.
fuente