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



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



приложение.js



export default function (){}


.js



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


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



index.es6.js



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


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




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




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

592   2  

2 ответов:

TL; DR

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

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

объяснение

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

export default function () {}

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

"use strict";

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

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

module.exports = exports["default"];

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

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

import something from './app';

это то же самое, что это

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

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

'use strict';

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

exports.default = function () {};

как видите, больше никаких заданий module.exports. К require этот модуль, вам нужно сделать

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

просто чтобы следить за правильным ответом выше.

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

это работает довольно хорошо для меня.

Comments

    Ничего не найдено.