Il problema è con
- come vengono emulati i moduli ES6 in CommonJS
- come importare il modulo
ES6 a CommonJS
Al momento della stesura di questo documento, nessun ambiente supporta i moduli ES6 in modo nativo. Quando li usi in Node.js devi usare qualcosa come Babel per convertire i moduli in CommonJS. Ma come succede esattamente?
Molte persone considerano module.exports = ...equivalenti export default ...e exports.foo ...equivalenti export const foo = .... Questo non è del tutto vero, o almeno non come Babel lo fa.
Le defaultesportazioni ES6 sono in realtà anche denominate esportazioni, tranne per il fatto che defaultè un nome "riservato" e per esso esiste uno speciale supporto di sintassi. Diamo un'occhiata a come Babel compila le esportazioni nominate e predefinite:
// 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;
Qui possiamo vedere che l'esportazione predefinita diventa una proprietà exportssull'oggetto, proprio come foo.
Importa il modulo
È possibile importare il modulo in due modi: utilizzando CommonJS o utilizzando la importsintassi ES6 .
Il tuo problema: credo che stai facendo qualcosa del tipo:
var bar = require('./input');
new bar();
prevedendo che barvenga assegnato il valore dell'esportazione predefinita. Ma come possiamo vedere nell'esempio sopra, l'esportazione predefinita è assegnata alla defaultproprietà!
Quindi, per accedere all'esportazione predefinita, dobbiamo effettivamente farlo
var bar = require('./input').default;
Se utilizziamo la sintassi del modulo ES6, vale a dire
import bar from './input';
console.log(bar);
Babele lo trasformerà in
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
Puoi vedere che ogni accesso a barviene convertito in accesso .default.