2017-05-05 10 views
8

インポート時にデフォルトのエクスポートオブジェクトを破棄できますか?次のエクスポート構文(export defaultデフォルトのエクスポートオブジェクトを破棄する

const foo = ... 
function bar() { ... } 

export default { foo, bar }; 

を考えると

は、次のインポートの構文有効なJSのですか?

import { foo, bar } from './export-file'; 

私のシステムでは機能するので尋ねられますが、仕様に従って動作しないように言われました。複数のオブジェクトがエクスポートされる

export foo; 
export bar; 

ので、それらはモジュールシステムによって暗黙的にオブジェクトにラップされている:

+0

良い質問が、彼らは 'export default {a、b}'を使います。http://exploringjs.com/es6/ch_modules.html –

+1

誰がそれがうまくいかないと言ったのですか?しかし、私はそれらに同意する、それは動作しません。環境設定を提供したり、デモプロジェクトをどこかで共有できますか? – Bergi

+0

@Bergi:あなたはそうでした:) しかし、この構文の制約が仕様に綴られているのを見ていません。 – sfletche

答えて

14

インポート時にデフォルトのエクスポートオブジェクトを破棄できますか?

いいえオブジェクトを変数にインポートした後でのみ、オブジェクトの構造を解除できます。

インポート/エクスポートには、オブジェクトリテラル/オブジェクトパターンとはまったく異なる構文とセマンティクスがあります。唯一の共通点は、中括弧を使用することと、識別子名とコンマのみを使用する簡略表現が区別できないことです。

次のインポート構文は有効なJSですか?

import { foo, bar } from './export-file'; 

はい。モジュールから2つの名前付きエクスポートをインポートします。これは、結合fooを宣言し、それがexport-fileから名前fooの下にエクスポートされた変数を参照してみましょう、と結合barを宣言し、それがもとでエクスポートされた変数を参照してみましょう」という意味

import { foo as foo, bar as bar } from './export-file'; 

の簡略表記ですbarからexport-fileまで "という名称が付けられています。

次のエクスポート構文(輸出デフォルト)を考えると

export default { foo, bar }; 

これと上記のインポート機能するのですか?

何それがないことは、目に見えない変数を宣言したオブジェクト{ foo: foo, bar: bar }でそれを初期化し、名前defaultの下でそれをエクスポートすることです。このモジュールはexport-fileとしてインポートされた場合
、名前defaultは使用されず、名前foobarSyntaxErrorにつながる発見されることはありません。

import { default as obj } from './export-file'; 
const {foo: foo, bar: bar} = obj; 
// or abbreviated: 
import obj from './export-file'; 
const {foo, bar} = obj; 

それともインポート構文を維持し、その代わりという名前の輸出を使用します:あなたのいずれかがデフォルト・エクスポートされたオブジェクトをインポートする必要があり、この問題を解決するには

、私はそこに見える

export { foo as foo, bar as bar }; 
// or abbreviated: 
export { foo, bar }; 
// or right in the respective declarations: 
export const foo = …; 
export function bar() { ... } 
+0

「デフォルトのエクスポートが優先されます」という意味の無数の時間を読んだことがあります。しかし、デフォルトのオブジェクトをインポートして内容を破棄する必要はなく、その主張に反するのでしょうか? – sfletche

+1

@sfletcheはい、その申し立ては間違っています。複数の変数がある場合、名前付きエクスポートが優先されます。デフォルトのエクスポートは、エクスポートするメジャー値(たとえばクラス)が1つだけの場合に優先されます。デフォルトのエクスポートは、一般的に好まれるためではなく、頻繁に必要となるため、構文が単純です。 – Bergi

+0

ああ!ありがとう@ベルギー!私はそのような説明を探していた: – sfletche

-2

コードは同等です。モジュールのエクスポートは実際に次のようになります。

{ foo: {}, bar: {} } 

これはモジュールがjsでエクスポートされる方法です。 1つのオブジェクトに複数のエクスポートステートメントに関係なく

非構造化が意味をなすので、あなたは通常と同じようにオブジェクトの構造を変更しています。これは完全に有効です。

関連する問題