ES6のインデックスファイルへのエクスポート/インポート


202

現在、webpack / babelを介してReactアプリでES6を使用しています。インデックスファイルを使用して、モジュールのすべてのコンポーネントを収集し、それらをエクスポートしています。残念ながら、これは次のようになります。

import Comp1_ from './Comp1.jsx';
import Comp2_ from './Comp2.jsx';
import Comp3_ from './Comp3.jsx';

export const Comp1 = Comp1_;
export const Comp2 = Comp2_;
export const Comp3 = Comp3_;

だから私はこのように他の場所からうまくインポートすることができます:

import { Comp1, Comp2, Comp3 } from './components';

明らかにそれはあまり良い解決策ではないので、他に方法があるかどうか疑問に思いました。インポートしたコンポーネントを直接エクスポートできないようです。


回答:


369

デフォルトのインポートを簡単に再エクスポートできます。

export {default as Comp1} from './Comp1.jsx';
export {default as Comp2} from './Comp2.jsx';
export {default as Comp3} from './Comp3.jsx';

あなたが書けるようにするES7 ES8のため提案もありますexport Comp1 from '…';



6
ES8の提案に加えて、コード生成を使用してインデックスファイルを維持できます。見ていgithub.com/gajus/create-indexgithub.com/ryardley/indexrを
Gajus

@Bergiでは、これらの3行はインポートとエクスポートの両方を行いますか?または、これは単にエクスポートしていますが、Comp1_の名前などをいじる必要はありませんか?
musicformellons 2016

@musicformellonsはい、参照されたモジュールから直接エクスポートします。
Bergi 2016

2
@amannそれ自体の循環参照は悪くありませんが、モジュールの動作によっては問題が発生する可能性があります。いずれにしても、ライブラリのインデックスファイルでこのパターンを使用してすべてのコンポーネントをエクスポートする必要があると思います。モジュール間の依存関係がある場合は、大きなコンポーネントからパーツをインポートするのではなく、直接インポートする必要があります。そのため、このパターンでは循環参照は導入されません。
Bergi、2016年

56

また、使用できるアクションなど、複数の関数を一度にエクスポートする必要がある場合は、

export * from './XThingActions';

14
はい。残念ながら、これは名前付きエクスポートのみを受け取ります。つまり、デフォルトのエクスポートは含まれません。
ArneHugo 2016

get's me a(かなり誤解を招く...ちょっと時間がかかりました)SyntaxError: Unexpected reserved word、@ Bergiの受け入れられた答えは機能します。
フランクノッケ2017

デフォルトのエクスポートに名前を付けて、その問題を回避することもできます。そして、あなたのアクションは本当にデフォルトのエクスポートを持っていてはいけないので、このソリューションはうまく機能します。
バリーマイケルドイル

2
ベストプラクティスは、JavaScriptでデフォルトのエクスポートを使用しないことです。不要な余分な構文があります。@GMは、このjavascriptのスレッドで最良の答えを持っています。
mibbit 2018

39

手遅れですが、私はそれを解決する方法を共有したいと思います。

model2つの名前付きエクスポートを持つファイルを持っている:

export { Schema, Model };

そしてcontrollerデフォルトのエクスポートを持つファイルがあります:

export default Controller;

indexはこの方法でファイルを公​​開しました:

import { Schema, Model } from './model';
import Controller from './controller';

export { Schema, Model, Controller };

そして、私はそれらすべてをインポートしたいと仮定します:

import { Schema, Model, Controller } from '../../path/';

これは、関数をインポートしてからエクスポートするときに機能しますか?私は試しましたが、しませんでした。
Aftab Naveed 2017年

申し訳ありませんが、実際には機能しました。パスに抜けていました。
Aftab Naveed 2017年

14

単に:

// Default export (recommended)
export {default} from './MyClass' 

// Default export with alias
export {default as d1} from './MyClass' 

// In >ES7, it could be
export * from './MyClass'

// In >ES7, with alias
export * as d1 from './MyClass'

または関数名で:

// export by function names
export { funcName1, funcName2, …} from './MyClass'

// export by aliases
export { funcName1 as f1, funcName2 as f2, …} from './MyClass'

詳細:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export


1

インストール@babel/plugin-proposal-export-default-from

yarn add -D @babel/plugin-proposal-export-default-from

あなた.babelrc.jsonまたは任意の設定ファイルタイプ

module.exports = {
  //...
  plugins: [
     '@babel/plugin-proposal-export-default-from'
  ]
  //...
}

exportから直接次のことができますfile-path

export Foo from './components/Foo'
export Bar from './components/Bar'

幸運を...


イジェクトせずにCreate-React-Appでそれを行う方法は?
Negin Basiri
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.