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 defaultexportations ES6 sont en fait également nommées exportations, sauf qu'il defaults'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' exportsobjet, tout comme foo.
Importez le module
Nous pouvons importer le module de deux manières: soit en utilisant CommonJS, soit en utilisant la importsyntaxe ES6 .
Votre problème: je crois que vous faites quelque chose comme:
var bar = require('./input');
new bar();
en attendant qu'on barlui 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 defaultproprié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 à barest converti en accès .default.