Je suis tombé sur une bibliothèque javascript qui utilise la syntaxe suivante pour importer des bibliothèques:
import React, { Component, PropTypes } from 'react';
Quelle est la différence entre la méthode ci-dessus et la suivante?
import React, Component, PropTypes from 'react';
import React, { Component, PropTypes } from 'react';
Cela dit:
Importer le valeur par défaut exporter de
'react'
sous le nomReact
et importez le nommé exporteComponent
etPropTypes
sous les mêmes noms.
Ceci combine les deux syntaxes courantes que vous avez probablement déjà vues
import React from 'react';
import { Component, PropTypes } from 'react';
Le premier étant utilisé pour importer et nommer l'exportation par défaut, le second pour importer les exportations nommées spécifiées.
En règle générale, la plupart des modules fournissent soit une exportation unique, par défaut, soit une liste d'exportations nommées. Il est un peu moins habituel pour un module de fournir à la fois une exportation par défaut et exportations nommées. Toutefois, dans le cas où il existe une fonctionnalité importée le plus souvent, mais également des sous-fonctionnalités supplémentaires, il est judicieux d'exporter la première comme valeur par défaut et les autres comme des exportations nommées. Dans ce cas, vous utiliseriez la syntaxe import
à laquelle vous vous référez.
Les autres réponses sont à la fois erronées et déroutantes, peut-être parce que les documents MDN au moment où cette question a été posée étaient faux et déroutants. MDN a montré l'exemple
import name from "module-name";
et dit name
est le "nom de l'objet qui recevra les valeurs importées". Mais c'est trompeur et incorrect; Tout d’abord, il n’ya que n valeur d’importation, qui sera "reçue" (pourquoi ne pas simplement dire "affecté à", ou "utilisé pour désigner") name
, et la valeur d'importation dans ce cas est le exportation par défaut du module.
Une autre façon d’expliquer cela est de noter que l’importation ci-dessus est précisément identique à
import { default as name } from "module-name";
et l'exemple du PO est précisément identique à
import { default as React, Component, PropTypes } from 'react';
La documentation MDN a ensuite montré l'exemple
import MyModule, {foo, bar} from "my-module.js";
et a affirmé que cela signifie
Importez le contenu d'un module entier, certains étant également nommés explicitement. Ceci insère
myModule
(sic),foo
etbar
dans la portée actuelle. Notez quefoo
etmyModule.foo
sont les mêmes, tout commebar
etmyModule.bar
Ce que MDN a dit ici et ce que d’autres réponses prétendent sur la base d’une documentation MDN incorrecte sont tout à fait faux et peuvent être basés sur une version antérieure de la spécification. Qu'est-ce que cela fait, c'est
Importez l'exportation de module par défaut et certaines exportations explicitement nommées. Ceci insère
MyModule
,foo
etbar
dans la portée actuelle. Les noms d'exportationfoo
etbar
ne sont pas accessibles viaMyModule
=, qui est l'exportation par défaut , et non un parapluie couvrant toutes les exportations.
(L’export de module par défaut est la valeur exportée avec le export default
_ syntaxe, qui pourrait aussi être export {foo as default}
.)
Les auteurs de la documentation MDN ont peut-être été confondus avec le formulaire suivant:
import * as MyModule from 'my-module';
Cela importe toutes les exportations de my-module
, et les rend accessibles sous des noms tels que MyModule.name
. L'exportation par défaut est également accessible en tant que MyModule.default
, puisque l’exportation par défaut n’est en réalité rien de plus qu’une autre exportation nommée avec le nom default
. Dans cette syntaxe, il n’existe aucun moyen d’importer uniquement un sous-ensemble des exportations nommées, bien que l’export par défaut puisse être importé, s’il en existe un, ainsi que toutes les exportations nommées, avec
import myModuleDefault, * as myModule from 'my-module';
import React, { Component, PropTypes } from 'react'
Cela va récupérer les membres { Component, PropTypes }
Exportés du module 'react'
Et les attribuer à Component
et PropTypes
, respectivement. React
sera égal à l'export default
du module.
Comme noté par torazaburo ci-dessous , ceci est identique à
import { default as React, Component, PropTypes } from 'react'
qui est un raccourci pour
import { default as React, Component as Component, PropTypes as PropTypes} from 'react'
Voici un autre exemple ( lien vers 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...'
J'ai testé le deuxième exemple avec babel:
import test, test3, test2 from './app/lib/queries.js'
console.log(test, test3, test2)
et a une erreur de syntaxe.
~/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 |
Pour référence, vous pouvez lire la nouvelle documentation import
de MDN. Cependant, il a apparemment besoin d'un examen technique. Le blog du Dr Axel Rauschmayer est une meilleure référence pour le moment.