ブラケットをJavaScriptインポート構文で使用する


115

次の構文を使用してライブラリをインポートするJavaScriptライブラリに出くわしました。

import React, { Component, PropTypes } from 'react';

上記の方法と次の方法の違いは何ですか?

import React, Component, PropTypes from 'react';


4
モジュールからインポートするメンバーは中かっこで囲まれています
adeneo


1
ハ。「RTFM」で間違いなくSOの質問に答えられる可能性があるすべての時間を排除すると、ジョンスキートでさえ6桁未満になる可能性があります。; ^)
2017年

回答:


174
import React, { Component, PropTypes } from 'react';

これは言う:

インポートデフォルトからの輸出'react'名の下にReactして、インポートという名前の輸出をComponentし、PropTypes同じ名前の下に。

これは、おそらくあなたが見たことがある2つの一般的な構文を組み合わせたものです

import React from 'react';
import { Component, PropTypes } from 'react';

最初はデフォルトのエクスポートのインポートと名前付けに使用され、2番目は指​​定された名前付きエクスポートのインポートに使用されます。

原則として、ほとんどのモジュールは、単一のデフォルトのエクスポート、または名前付きエクスポートのリストを提供します。モジュールがデフォルトのエクスポート名前付きエクスポートの両方を提供することは、あまり一般的ではありません。ただし、最もよくインポートされる機能が1つだけでなく、追加のサブ機能もある場合、最初の機能をデフォルトとしてエクスポートし、残りの機能を名前付きエクスポートとしてエクスポートすることは有効な設計です。そのような場合は、import参照する構文を使用します。

他の答えは、おそらくこの質問が尋ねられたときのMDNドキュメントが間違っていて混乱しているため、間違っていると混乱の間にあります。MDNが例を示した

import name from "module-name";

そして、言っnameている「インポートした値を受け取るオブジェクトの名前。」しかし、それは誤解を招きやすく、正しくありません。まず最初に、「受信」されるインポート値は1つだけです(「割り当てられた」または「参照に使用された」と言うだけではありません)name。この場合のインポート値は、モジュールからのデフォルトのエクスポートです。 。

これを説明するもう1つの方法は、上記のインポートは、

import { default as name } from "module-name";

OPの例は、

import { default as React, Component, PropTypes } from 'react';

MDNドキュメンテーションは例を示すことを続けました

import MyModule, {foo, bar} from "my-module.js";

それが意味すると主張した

モジュールのコンテンツ全体をインポートします。一部は明示的に名前が付けられます。これmyModuleによりfoo、(sic)、、、barが現在のスコープに挿入されます。なお、foomyModule.fooしていると、同じですbarmyModule.bar

ここでMDNが言ったこと、および誤ったMDNドキュメントに基づいて他の回答が主張していることは、完全に間違っており、仕様の以前のバージョンに基づいている可能性があります。これが実際に行うことは

デフォルトのモジュールエクスポートと、名前が明示された一部のエクスポートをインポートします。この挿入MyModulefooおよびbar現在のスコープに。エクスポート名でfooありbar、からアクセスできませんMyModule。これはデフォルトのエクスポートであり、すべてのエクスポートを網羅する傘ではありません。

(デフォルトのモジュールエクスポートは、export default構文でエクスポートされた値export {foo as default}です。

MDNドキュメントの作成者は、次のフォームと混同されている可能性があります。

import * as MyModule from 'my-module';

これmy-moduleにより、からすべてのエクスポートがインポートされ、などの名前でアクセスできるようになりMyModule.nameます。MyModule.defaultデフォルトのエクスポートは実際にはと同じ名前の別の名前付きエクスポートに過ぎないため、デフォルトのエクスポートにはとしてもアクセスできますdefault。この構文では、名前付きエクスポートのサブセットのみをインポートする方法はありませんが、デフォルトのエクスポートが存在する場合は、すべての名前付きエクスポートとともに、

import myModuleDefault, * as myModule from 'my-module';

1
from '/path/to/my-module.js'私が個人的に使用していますが、バベルは受け入れますfrom '/path/to/my-module'
royhowie 2015年

5
そのような詳細な説明では、そのようにインポートするために、それらがどのようにエクスポートされるかも追加する必要があります。
Caio Iglesias 2016

37
import React, { Component, PropTypes } from 'react'

これは、エクスポートつかむだろう{ Component, PropTypes }からメンバーを'react'モジュールとに割り当てるComponentPropTypes、それぞれ。Reactモジュールのdefaultエクスポートと同じになります。

以下の虎三郎が指摘するように、これは

import { default as React, Component, PropTypes } from 'react'

これは略記です

import { default as React, Component as Component, PropTypes as PropTypes} from 'react'

ここに別の例があります(gistへのリンク):

// myModule.js
export let a = true
export let b = 42
export let c = 'hello, world!'
// `d` is not exported alone
let d = 'some property only available from default'

// this uses the new object literal notation in es6
// {myVar} expands to { myVar : myVar }, provided myVar exists
// e.g., let test = 22; let o = {test}; `o` is then equal to { test : 22 }
export default { a, b, d }

// example1.js
import something from 'myModule'
console.log(something)
// this yields (note how `c` is not here):
/*
  {
    a : true,
    b : 42,
    d : 'some property only available from default'
  }
*/

// example2.js
import something, { c } from 'myModule'
console.log(something)  // same as above; the `default` export
console.log(c)          // c === 'hello, world!'

// example3.js
import { a, b, d, default as something } from 'myModule'
console.log(a)            // a === true
console.log(b)            // b === 42
console.log(d)            // d === undefined (we didn't export it individually)
console.log(something.d)  // something.d === 'some property...'

2番目の例をbabelでテストしました。

import test, test3, test2 from './app/lib/queries.js'
console.log(test, test3, test2)

構文エラーが発生しました。

~/code/repo/tutoring $ babel-node test.js
/Users/royhowie/.node/lib/node_modules/babel/node_modules/babel-core/lib/babel/transformation/file/index.js:601
      throw err;
            ^
SyntaxError: /Users/royhowie/code/repo/tutoring/test.js: Unexpected token (1:13)
> 1 | import test, test3, test2 from './app/lib/queries.js'
    |              ^
  2 | 
  3 | console.log(test, test3, test2)
  4 | 

参考までに、importMDNの新しいドキュメントを参照してください。ただし、明らかに技術的な見直しが必要です。今のところ、Axel Rauschmayer博士のブログ投稿が参考になります。


1
これは、 'react'モジュールのエクスポートから{Component、PropTypes}プロパティを取得し、それらをReactに割り当てます。これは誤りです。デフォルトのエクスポートをに割り当て、React名前付きエクスポートComponentPropTypes同じ名前の変数に割り当てます。残念ながらMDNのドキュメントは間違っています。試してみるとわかります。2ality.com/2014/09/es6-modules-final.htmlを参照してください。また、インポート構文は、構造化代入とはまったく関係ありません。

3
「新しいimportドキュメント」についてのコメントに関して、そのMDN記事の改訂履歴を確認すると、ページが最初に作成されてから1年以上が経過しているため、引用している部分は変更されていません。急速に変化します

1
@torazaburo答えをより正確に書き直しました。
royhowie 2015年

@royhowieこの例をありがとうございました!! 文字通り、うっかり見て回る時間をさらに1時間節約できました...質問が1つだけあります。ではexample3.jsなぜそれが印刷したのundefinedためにconsole.log(d)?そうしたexport default { a, b, d }ので、それをでエクスポートしましたmyModule.js
CapturedTree 2017年

2
1290年には@ myModule.js、ノートabおよびc個別に輸出されました。これは、別のファイルがそれらを直接でインポートできることを意味しますimport { a } from 'myModule'。一方、dはデフォルトのエクスポートを介してのみ使用できるため、別のモジュールは2つの方法でそれにアクセスできます。OR およびをimport thisObjectContainsDefault from 'myModule'介してアクセスします。2番目のアプローチの利点は、に示すように、個別にエクスポートされたアイテムを取得できることです。thisObjectContainsDefault.dimport { default as wrapperObject }wrapperObject.dexample3.js
royhowie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.