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';
Réponses:
Cela dit:
Cela combine les deux syntaxes courantes que vous avez probablement vues
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 fourniront soit une seule exportation 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 des exportations nommées. Cependant, dans le cas où il existe une fonctionnalité qui est le plus souvent importée, mais également des sous-fonctionnalités supplémentaires, il est possible d'exporter la première par défaut et les autres en tant qu'exportations nommées. C'est dans ce cas que vous utiliserez la
import
syntaxe à laquelle vous faites référence.Les autres réponses sont quelque part entre fausses et déroutantes, peut-être parce que les documents MDN à l'époque où cette question a été posée étaient faux et déroutants. MDN a montré l'exemple
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'y a qu'une seule valeur d'importation, qui sera "reçue" (pourquoi ne pas simplement dire "assignée à", ou "utilisée pour faire référence à")name
, et la valeur d'importation dans ce cas est l' exportation par défaut du module .Une autre façon d'expliquer cela est de noter que l'importation ci-dessus est exactement identique à
et l'exemple de l'OP est exactement identique à
La documentation MDN a continué pour montrer l'exemple
et a affirmé que cela signifie
Ce que MDN a dit ici, et ce que d'autres réponses prétendent sur la base d'une documentation MDN incorrecte, est absolument faux et peut être basé sur une version antérieure de la spécification. Ce que cela fait réellement, c'est
(L'exportation de module par défaut est la valeur exportée avec la
export default
syntaxe, ce qui pourrait également l'êtreexport {foo as default}
.)Les rédacteurs de la documentation MDN peuvent avoir été confondus avec le formulaire suivant:
Cela importe toutes les exportations de
my-module
et les rend accessibles sous des noms tels queMyModule.name
. L'exportation par défaut est également accessible en tant queMyModule.default
, puisque l'exportation par défaut n'est en réalité rien de plus qu'une autre exportation nommée avec le nomdefault
. Dans cette syntaxe, il n'y a aucun moyen d'importer uniquement un sous-ensemble des exportations nommées, bien que l'on puisse importer l'exportation par défaut, s'il y en a une, avec toutes les exportations nommées, avecla source
from '/path/to/my-module.js'
, bien que j'utilise personnellementfrom '/path/to/my-module'
.Cela récupérera les
{ Component, PropTypes }
membres exportés du'react'
module et les affectera respectivement àComponent
etPropTypes
.React
sera égal à l'default
exportation du module .Comme indiqué par torazaburo ci - dessous , c'est la même chose que
qui est un raccourci pour
Voici un autre exemple ( lien vers l'essentiel ):
J'ai testé le deuxième exemple avec babel:
et a obtenu une erreur de syntaxe.
Pour référence, vous pouvez consulter la nouvelle
import
documentation de MDN. Cependant, il a apparemment besoin d'un examen technique. Le billet de blog du Dr Axel Rauschmayer est une meilleure référence pour le moment.la source
React
, et les exportations nomméesComponent
etPropTypes
à des variables de même nom. Malheureusement, les documents MDN sont erronés, comme vous le découvririez si vous les essayiez. Voir 2ality.com/2014/09/es6-modules-final.html . De plus, la syntaxe d'importation n'a absolument rien à voir avec l'affectation de déstructuration.import
documentation", en passant en revue l'historique des révisions de cet article MDN, les parties que vous citez n'ont pas été révisées depuis la création de la page il y a plus d'un an, période pendant laquelle la syntaxe du module était change rapidement.example3.js
pourquoi at - il imprimerundefined
pourconsole.log(d)
? Depuis que vous l'avez faitexport default { a, b, d }
, vous l'avez exporté au formatmyModule.js
.myModule.js
, notez quea
,b
etc
ont été exportés individuellement. Cela signifie qu'un autre fichier peut les importer directement avecimport { a } from 'myModule'
. D'autre part,d
n'est disponible que via l'exportation par défaut, donc un autre module peut y accéder de deux manières:import thisObjectContainsDefault from 'myModule'
et y accéder viathisObjectContainsDefault.d
ORimport { default as wrapperObject }
etwrapperObject.d
. L'avantage de la deuxième approche est que vous pouvez également récupérer des éléments qui ont été exportés individuellement, comme on peut le voir dansexample3.js
.