Le problème est le suivant
- comment les modules ES6 sont émulés dans CommonJS
- comment vous importez le module
De ES6 à CommonJS
Au moment où nous écrivons 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 passe-t-il exactement ?
De nombreuses personnes considèrent module.exports = ...
pour être équivalent à export default ...
y exports.foo ...
pour être équivalent à export const foo = ...
. Ce n'est pas tout à fait vrai, ou du moins pas de la manière dont Babel procède.
ES6 default
les exportations sont en fait aussi nommé les exportations, sauf que default
est un nom "réservé" et il existe un support syntaxique spécial pour lui. 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é de l'objet exports
tout comme foo
.
Importez le module
Nous pouvons importer le module de deux manières : Soit en utilisant CommonJS, soit en utilisant ES6. import
la syntaxe.
Votre problème : Je crois que vous faites quelque chose comme :
var bar = require('./input');
new bar();
en s'attendant à ce que bar
se voit attribuer 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 à l'élément default
propriété !
Donc pour accéder à l'exportation par défaut, nous devons en fait faire
var bar = require('./input').default;
Si nous utilisons la syntaxe des modules 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
.