A questão é com
- como os módulos ES6 são emulados no CommonJS
- como você importa o módulo
ES6 para CommonJS
No momento em que escrevemos isso, nenhum ambiente suporta módulos ES6 nativamente. Ao usá-los no Node.js, você precisa usar algo como Babel para converter os módulos em CommonJS. Mas como exatamente isso acontece?
Muitas pessoas consideram module.exports = ...ser equivalente export default ...e exports.foo ...equivalente export const foo = .... Isso não é bem verdade, porém, ou pelo menos não como Babel faz.
defaultNa verdade, as exportações do ES6 também são denominadas exportações, exceto que defaulté um nome "reservado" e há suporte especial à sintaxe. Vamos ver como o Babel compila exportações nomeadas e padrão:
// 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;
Aqui podemos ver que a exportação padrão se torna uma propriedade no exportsobjeto, assim como foo.
Importar o módulo
Podemos importar o módulo de duas maneiras: Usando CommonJS ou usando a importsintaxe ES6 .
Seu problema: acredito que você está fazendo algo como:
var bar = require('./input');
new bar();
esperando que barseja atribuído o valor da exportação padrão. Mas, como podemos ver no exemplo acima, a exportação padrão é atribuída à defaultpropriedade!
Portanto, para acessar a exportação padrão, precisamos fazer
var bar = require('./input').default;
Se usarmos a sintaxe do módulo ES6, a saber
import bar from './input';
console.log(bar);
Babel irá transformá-lo em
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
Você pode ver que todo acesso a baré convertido em acesso .default.