2017-06-28 15 views
0

次のコードは動作します動作します。ES6メンバーのインポートが機能していないが、デフォルトのインポートは予想通り

// ./mwe/index.js 
let foo =() => 'foo'; 

const Bar = { 
    foo 
}; 

export default Bar; 

// ./index.js 
import Bar from './mwe'; 

console.log(Bar); // logs an object with a member foo that is a function 

しかし、これは動作しません:

// ./index.js 
import {foo} from './mwe'; 

console.log(foo); // logs undefined 

なぜ第2の変形解決はしていませんメンバーfoo正しく?


私はthe documentation

の次の文を解釈するには、モジュールの単一のメンバーをインポートします。 myMemberを現在のスコープに挿入します。モジュールはBarのようなオブジェクトをエクスポートする場合は、その後、私はその構文を使用してBarの個々のメンバーをインポートできるという意味として

import {myMember} from 'my-module'; 

。これはうまくいかないが、どうして?私は何の部分を誤解していますか?

答えて

1

インポートステートメントはオブジェクトを破棄しません。彼らはオブジェクトの破壊と非常によく似ていますが、それらは異なっています。

名前付きインポート "レベル1"深さ一部のモジュールexportsモジュール全体を表すオブジェクト。従ってimport {foo} from 'bar'const { foo } = require('bar')ではなく、const { foo } = require('bar').defaultを意味します。 Supported statements.

しかし、ここでもまた、オブジェクトの構造化ではない特殊な構文です。例えば

あなたはない行うことができます

import { foo: { bar } } from 'baz' // syntax error 

だからあなたはどちらか別の名前のエクスポートなどの輸出fooまたは

import Bar from './mwe' 

const { foo} = Bar 
を構造化代入のために別のステートメントを使用する必要が

import { foo: bar } from 'baz' // syntax error 

またはネストされた構造化代入

1

fooをエクスポートしていないので、export let foo =() => 'foo';に変更すると動作します。

+0

しかし、なぜ私はエクスポートしないでください'Bar 'のメンバー' foo'としてtを使用しますか? (この質問の明確化のために私の更新を参照してください) –

1

export defaultを使用しました。つまり、バーのみがエクスポートされます。

エクスポートのデフォルトでは、彼の後に来る変数のみがエクスポートされます。

+0

なぜ、それを 'bar'のメンバー' foo'としてエクスポートしないのですか? (この質問の明確化のために私の更新を参照してください。) –

+0

importステートメントはes6のオブジェクトで使用される構造解除パターンではないためです。 Barからのデフォルトのインポートを使用し、Bar.foo()でアクセスすることができますが、import文でフィールドfooの抽出を使用することはできません。 –

+0

申し訳ありませんが、私の答えではない答え:D –

関連する問題