Dans Babel 5.x, je peux écrire le code suivant:
app.js
export default function (){}
index.js
require('babel/register');
require('./app')();
Ensuite, je peux courir node index.js
sans erreur. Cependant, en utilisant Babel 6.x, en exécutant le code suivant
index.es6.js
require('babel-core/register');
require('./app')();
entraîne une erreur
require (...) n'est pas une fonction
Je veux savoir pourquoi?
TL; DR
Vous devez utiliser
require('./app').default();
Explication
Babel 5 avait l'habitude d'avoir un hack de compatibilité pour export default
: si un module ne contenait qu’une exportation et qu’il s’agissait d’une exportation par défaut, il était affecté à module.exports
. Ainsi, par exemple, votre module app.js
export default function () {}
serait transpilé à cette
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = function () {};
module.exports = exports["default"];
Cela a été fait uniquement pour assurer la compatibilité avec les modules require
- de Babel (comme vous le faites). C'était aussi incompatible. si un module contient à la fois des exportations nommées et des exportations par défaut, il ne peut pas s'agir de require
- d.
En réalité, selon les spécifications du module ES6, une exportation par défaut n'est pas différente d'une exportation nommée portant le nom default
. C’est juste un sucre syntaxique qui peut être résolu statiquement au moment de la compilation, donc ceci
import something from './app';
est le même que cela
import { default as something } from './app';
Cela étant dit, il semble que Babel 6 ait décidé de laisser tomber le piratage d'interopérabilité lors de la transposition de modules. Maintenant, votre module app.js est transpilé en
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function () {};
Comme vous le voyez, plus aucune affectation à module.exports
. Pour require
ce module, vous devez faire
require('./app').default();
Juste pour faire un suivi avec la bonne réponse ci-dessus.
Si vous voulez utiliser le comportement d'exportation par défaut de babel@5
, vous pouvez essayer plugin babel-plugin-add-module-exports .
Cela fonctionne plutôt bien pour moi.