Не может требовать() значения экспорта по умолчанию в Babel 6.x

В Babel 5.x я могу написать следующий код:

app.js

export default function (){}

index.js

require('babel/register');
require('./app')();

Тогда я могу запустить node index.js без ошибок. Однако, используя Babel 6.x, запуская следующий код

index.es6.js

require('babel-core/register');
require('./app')();

приводит к ошибке

require (...) не является функцией

Я хочу знать почему?

Ответ 1

TL; DR

Вы должны использовать

require('./app').default();

Объяснение

У Babel 5 раньше был пакет совместимости для export default: если модуль содержал только один экспорт, и он был экспортирован по умолчанию, он был назначен module.exports. Так, например, ваш модуль app.js

export default function () {}

будет передано на этот

"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});

exports["default"] = function () {};

module.exports = exports["default"];

Это было сделано исключительно для совместимости с require -ing Babel-transpiled modules (как вы это делаете). Это также было непоследовательно; если модуль содержит оба именованных и по умолчанию экспорта, он не может быть require -d.

В действительности, согласно спецификации модуля ES6, экспорт по умолчанию не отличается от именованного экспорта с именем default. Это просто синтаксический сахар, который можно статически решать во время компиляции, поэтому это

import something from './app';

совпадает с этим

import { default as something } from './app';

Таким образом, похоже, что Babel 6 решил отказаться от взлома интероперабельности при пересылке модулей. Теперь ваш модуль app.js транслируется как

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

exports.default = function () {};

Как вы видите, больше не присваивается module.exports. Чтобы require этот модуль, вам нужно сделать

require('./app').default();

Ответ 2

Просто для ответа на правильный ответ выше.

Если вы хотите использовать поведение экспорта по умолчанию [email protected], вы можете попробовать babel-plugin-add-module-exports плагин.

Это очень хорошо работает для меня.