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


85

У 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 (...) не є функцією

Я хочу знати чому?


У вас є .babelrc? Ви десь вказуєте варіанти Babel? Я запитую, оскільки Babel 6 за замовчуванням нічого не транспілює, і ви не вказуєте es2015пресет у коді, який ви опублікували.
Ігор Рауш

@IgorRaush У мене справді є .babelrc, інші сценарії es6 працюють нормально
XGHeaven

Будь ласка, прочитайте описи тегів. babel- для питань до бібліотеки Python із зазначеною назвою.
Фелікс Клінг

Просто не експортуйте функцію з app.js, а запустіть її відразу
Бергі

@FelixKling вибачте, я не знаю того самого імені також у python ...
XGHeaven

Відповіді:


156

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модулями, що транслюються за допомогою Babel (як ви це робите). Це також було непослідовно; якщо модуль містив як ім'я, так і експортування за замовчуванням, він не може бути 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();

19
Для мене require('./app').default;працював. default()повернувсяundefined
thinklinux

14
@thinklinux, require(...).defaultдає посилання на експортовану функцію. default()називає це. Якщо ваша функція нічого не повертає (або порожня), то, звичайно, результат буде undefined.
Ігор Рауш

10
require('path').default()не працює, require('path').defaultпрацює для мене
soulmachine

2
Ви повинні використовувати require('./app').default;Якщо ви експортуєте об'єкт замість функції.
Tokenyet

7

Просто щоб продовжити правильну відповідь вище.

Якщо ви хочете використовувати поведінку експорту за замовчуванням babel@5, ви можете спробувати плагін babel-plugin-add-module- export .

У мене це працює досить добре.


2

Якщо це не спрацює

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

використання

require('./app').default

Без виклику функції в кінці.


Як каже Ігор у коментарі вище ( stackoverflow.com/questions/33704714/… ), перший із ваших прикладів буде викликати функцію, а другий - посилання
Стефано,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.