Le problème est avec
- comment les modules ES6 sont émulés dans CommonJS
- comment importer le module
ES6 à CommonJS
Au moment d'écrire ces lignes, aucun environnement ne prend en charge les modules ES6 de manière native. Lorsque vous les utilisez dans Node.js, vous devez utiliser quelque chose comme Babel pour convertir les modules en CommonJS. Mais comment cela se produit-il exactement?
Beaucoup de gens considèrent module.exports = ...
comme équivalents export default ...
et exports.foo ...
équivalents à export const foo = ...
. Ce n'est pas tout à fait vrai cependant, ou du moins pas comment Babel le fait.
Les default
exportations ES6 sont en fait également nommées exportations, sauf qu'il default
s'agit d'un nom "réservé" et qu'il est pris en charge par une syntaxe spéciale. Voyons comment Babel compile les exportations nommées et par défaut:
// input
export const foo = 42;
export default 21;
// output
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = exports.foo = 42;
exports.default = 21;
Ici, nous pouvons voir que l'exportation par défaut devient une propriété sur l' exports
objet, tout comme foo
.
Importez le module
Nous pouvons importer le module de deux manières: soit en utilisant CommonJS, soit en utilisant la import
syntaxe ES6 .
Votre problème: je crois que vous faites quelque chose comme:
var bar = require('./input');
new bar();
en attendant qu'on bar
lui attribue la valeur de l'exportation par défaut. Mais comme nous pouvons le voir dans l'exemple ci-dessus, l'exportation par défaut est affectée à la default
propriété!
Donc, pour accéder à l'exportation par défaut, nous devons réellement faire
var bar = require('./input').default;
Si nous utilisons la syntaxe du module ES6, à savoir
import bar from './input';
console.log(bar);
Babel le transformera en
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
Vous pouvez voir que chaque accès à bar
est converti en accès .default
.