web-dev-qa-db-fra.com

Impossible d'exiger () la valeur d'exportation par défaut dans Babel 6.x

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?

77
XGHeaven

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();
132
Igor Raush

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.

7
haotang