В 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 (...) не является функцией
Я хочу знать почему?
javascript
ecmascript-6
babeljs
XGHeaven
источник
источник
.babelrc
? Вы где-то указываете параметры Babel? Я спрашиваю, потому что Babel 6 ничего не переносит по умолчанию, и вы не указываетеes2015
предустановку в опубликованном вами коде..babelrc
скрипт es6, остальные работают нормальноbabel
предназначен для вопросов к библиотеке Python с указанным именем.app.js
, а запускайте ее сразуОтветы:
TL; DR
Вы должны использовать
require('./app').default();
Объяснение
В Babel 5 использовался способ совместимости
export default
: если модуль содержал только один экспорт, и это был экспорт по умолчанию, он был назначенmodule.exports
. Так, например, ваш модуль app.jsexport default function () {}
будет перенесено на это
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = function () {}; module.exports = exports["default"];
Это было сделано исключительно для совместимости с
require
модулями -ing Babel-transpiled (как вы это делаете). Это также было непоследовательно; если модуль содержал как именованный экспорт, так и экспорт по умолчанию, он не мог быть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();
источник
require('./app').default;
сработало.default()
вернулсяundefined
require(...).default
дает ссылку на экспортируемую функцию.default()
называет это. Если ваша функция ничего не возвращает (или пуста), то, конечно, результат будетundefined
.require('path').default()
не работает,require('path').default
у меня работаетrequire('./app').default;
Если вы экспортируете объект вместо функции.Просто чтобы ответить на правильный ответ выше.
Если вы хотите использовать поведение экспорта по умолчанию
babel@5
, вы можете попробовать плагин babel-plugin-add-module-exports .У меня это работает очень хорошо.
источник
Если это не сработает
require('./app').default()
использовать
require('./app').default
Без вызова функции в конце.
источник