Питання - с
- як емуляції модулів 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
.