ES6モジュールで複数のクラスをエクスポートする


150

複数のES6クラスをエクスポートするモジュールを作成しようとしています。次のディレクトリ構造があるとします。

my/
└── module/
    ├── Foo.js
    ├── Bar.js
    └── index.js

Foo.jsそしてBar.js各エクスポートデフォルトES6クラス:

// Foo.js
export default class Foo {
  // class definition
}

// Bar.js
export default class Bar {
  // class definition
}

私は現在、次のようにindex.js設定しています:

import Foo from './Foo';
import Bar from './Bar';

export default {
  Foo,
  Bar,
}

ただし、インポートできません。これを実行したいのですが、クラスが見つかりません。

import {Foo, Bar} from 'my/module';

ES6モジュールで複数のクラスをエクスポートする正しい方法は何ですか?


5
exportデフォルトなしで使用するだけ
webdeb

defaultエクスポートできるのは1つだけです。誰かがしようとした場合を想像してみてくださいimport SomeClass from 'my/module'。これによりdefault、そのパスからモジュールが自動的にインポートされます。そこに複数のデフォルトのエクスポートがある場合、どのエクスポートをインポートするかをどのようにして知るのでしょうか?
saadq

回答:


258

あなたのコードでこれを試してください:

import Foo from './Foo';
import Bar from './Bar';

// without default
export {
  Foo,
  Bar,
}

ところで、次のようにすることもできます:

// bundle.js
export { default as Foo } from './Foo'
export { default as Bar } from './Bar'
export { default } from './Baz'

// and import somewhere..
import Baz, { Foo, Bar } from './bundle'

使用する export

export const MyFunction = () => {}
export const MyFunction2 = () => {}

const Var = 1;
const Var2 = 2;

export {
   Var,
   Var2,
}


// Then import it this way
import {
  MyFunction,
  MyFunction2,
  Var,
  Var2,
} from './foo-bar-baz';

との違いexport defaultは、何かをエクスポートし、インポートした場所に名前を適用できることです。

// export default
export default class UserClass {
  constructor() {}
};

// import it
import User from './user'

私は取得していますUnexpected token構築する際にエラーがexport Foo from './Foo'; export Bar from './Bar'
inostia

@inostiaのメモ、これはES6構文です。サポートするにはおそらく「babel」が必要です
webdeb

バベルを使っています。webpackでコンパイルするとエラーが発生しました。のようなことをする必要があると思いますexport { default as Foo } from './Foo';。私は他の場所でそれを見てきました
イノスティア

@inostia私もこれを経験しており、export { default as Foo } from './Foo';実際にエクスポートする必要がありました。
エコーロケーション

17

お役に立てれば:

// Export (file name: my-functions.js)
export const MyFunction1 = () => {}
export const MyFunction2 = () => {}
export const MyFunction3 = () => {}

// if using `eslint` (airbnb) then you will see warning, so do this:
const MyFunction1 = () => {}
const MyFunction2 = () => {}
const MyFunction3 = () => {}

export {MyFunction1, MyFunction2, MyFunction3};

// Import
import * as myFns from "./my-functions";

myFns.MyFunction1();
myFns.MyFunction2();
myFns.MyFunction3();


// OR Import it as Destructured
import { MyFunction1, MyFunction2, MyFunction3 } from "./my-functions";

// AND you can use it like below with brackets (Parentheses) if it's a function 
// AND without brackets if it's not function (eg. variables, Objects or Arrays)  
MyFunction1();
MyFunction2();

7

@webdebの答えがうまくいきませんでした。ES6 unexpected tokenをBabelでコンパイルして、名前付きのデフォルトのエクスポートを実行すると、エラーが発生しました。

これは私にとってはうまくいきました:

// Foo.js
export default Foo
...

// bundle.js
export { default as Foo } from './Foo'
export { default as Bar } from './Bar'
...

// and import somewhere..
import { Foo, Bar } from './bundle'

3
// export in index.js
export { default as Foo } from './Foo';
export { default as Bar } from './Bar';

// then import both
import { Foo, Bar } from 'my/module';

-2

クラスのインスタンスをエクスポートするには、次の構文を使用できます。

// export index.js
const Foo = require('./my/module/foo');
const Bar = require('./my/module/bar');

module.exports = {
    Foo : new Foo(),
    Bar : new Bar()
};

// import and run method
const {Foo,Bar} = require('module_name');
Foo.test();

4
これはES6構文ではありません
GerDner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.