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 default
esportazioni 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à exports
sull'oggetto, proprio come foo
.
Importa il modulo
È possibile importare il modulo in due modi: utilizzando CommonJS o utilizzando la import
sintassi ES6 .
Il tuo problema: credo che stai facendo qualcosa del tipo:
var bar = require('./input');
new bar();
prevedendo che bar
venga assegnato il valore dell'esportazione predefinita. Ma come possiamo vedere nell'esempio sopra, l'esportazione predefinita è assegnata alla default
proprietà!
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 bar
viene convertito in accesso .default
.