Babel 6.xではrequire()のデフォルトのエクスポート値はできません


88

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 6はデフォルトでは何もトランスパイルせずes2015、投稿したコードでプリセットを指定していないので、お願いします。
Igor Raush 2015年

@IgorRaush私は本当に持っています.babelrc、他のes6スクリプトは正常に実行されています
XGHeaven 2015年

タグの説明をお読みください。上記の名前のPythonライブラリbabelに関する質問用です。
Felix Kling 2015年

から関数をエクスポートしないで、すぐにapp.js実行してください
Bergi 2015年

@FelixKling申し訳ありませんが、私は... pythonでも同じ名前を知らない
XGHeaven

回答:


157

TL; DR

あなたは使用する必要があります

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

説明

Babel 5には、互換性ハックがありましたexport default。モジュールに含まれるエクスポートが1つだけで、それがデフォルトのエクスポートである場合、に割り当てられました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モジュールとの互換性のために行われました(あなたがしているように)。また、一貫性がありませんでした。モジュールに名前付きエクスポートとデフォルトエクスポートの両方が含まれている場合、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.exportsrequireこのモジュールを、あなたは何をする必要があります

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

19
私のためにrequire('./app').default;働いた。default()返されましたundefined
thinklinux 2016年

14
@thinklinuxはrequire(...).default、エクスポートされた関数への参照を提供します。default()それを呼び出します。関数が何も返さない(または空である)場合、もちろん、結果はになりますundefined
Igor Raush 2016

10
require('path').default()動作しませんrequire('path').default、私のために動作します
soulmachine 2017

2
require('./app').default;関数の代わりにオブジェクトをエクスポートする場合は、を使用する必要があります。
Tokenyet

7

上記の正解をフォローアップするだけです。

のデフォルトのエクスポート動作を使用したい場合はbabel@5babel-plugin-add-module-exportsプラグインを試すことができます。

それは私にとってかなりうまくいっています。


3

これが機能しない場合

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

使用する

require('./app').default

最後に関数呼び出しなし。


Igorが上記のコメント(stackoverflow.com/questions/33704714/…)で述べているように、最初の例は関数を呼び出し、2番目の例は関数を参照します
Stefano
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.