Вопрос с
- как модули ES6 эмулируются в CommonJS
- как вы импортируете модуль
ES6 в CommonJS
На момент написания этой статьи ни одна среда не поддерживала модули ES6 изначально. При использовании их в Node.js вам нужно использовать что-то вроде Babel для преобразования модулей в CommonJS. Но как именно это происходит?
Многие люди считают, module.exports = ...что эквивалентны export default ...и exports.foo ...эквивалентны export const foo = .... Это не совсем верно, или, по крайней мере, не так, как это делает Бабель.
defaultЭкспорт ES6 на самом деле также называется экспортом, за исключением того, что defaultэто «зарезервированное» имя, и для него существует специальная синтаксическая поддержка. Давайте посмотрим, как Babel компилирует именованные и экспорты по умолчанию:
// 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;
Здесь мы видим, что экспорт по умолчанию становится свойством exportsобъекта, так же, как foo.
Импортировать модуль
Мы можем импортировать модуль двумя способами: используя CommonJS или importсинтаксис ES6 .
Ваша проблема: я считаю, что вы делаете что-то вроде:
var bar = require('./input');
new bar();
ожидая, что barприсваивается значение экспорта по умолчанию. Но, как видно из приведенного выше примера, экспорту по умолчанию присваивается defaultсвойство!
Таким образом, чтобы получить доступ к экспорту по умолчанию, нам нужно сделать
var bar = require('./input').default;
Если мы используем синтаксис модуля ES6, а именно
import bar from './input';
console.log(bar);
Бабель превратит его в
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
Вы можете видеть, что каждый доступ к barконвертируется в доступ .default.