Ich bin auf eine Javascript-Bibliothek gestoßen, die die folgende Syntax zum Importieren von Bibliotheken verwendet:
import React, { Component, PropTypes } from 'react';
Was ist der Unterschied zwischen der obigen Methode und der folgenden?
import React, Component, PropTypes from 'react';
Antworten:
Dies sagt:
Dies kombiniert die beiden gängigen Syntaxen, die Sie wahrscheinlich gesehen haben
Der erste dient zum Importieren und Benennen des Standardexports, der zweite zum Importieren der angegebenen benannten Exporte.
In der Regel stellen die meisten Module entweder einen einzelnen Standardexport oder eine Liste benannter Exporte bereit. Es ist etwas weniger üblich, dass ein Modul sowohl einen Standardexport als auch benannte Exporte bereitstellt . Wenn jedoch ein Feature am häufigsten importiert wird, aber auch zusätzliche Unter-Features, ist es ein gültiges Design, das erste als Standard und die übrigen als benannte Exporte zu exportieren. In solchen Fällen würden Sie die
import
Syntax verwenden, auf die Sie sich beziehen.Die anderen Antworten liegen irgendwo zwischen falsch und verwirrend, möglicherweise weil die MDN-Dokumente zum Zeitpunkt der Beantwortung dieser Frage falsch und verwirrend waren. MDN zeigte das Beispiel
und gesagt
name
ist der "Name des Objekts, das die importierten Werte erhält". Aber das ist irreführend und falsch; Erstens gibt es nur einen Importwert, der "empfangen" wird (warum nicht einfach "zugewiesen zu" oder "verwendet, um darauf zu verweisen" sagen)name
, und der Importwert ist in diesem Fall der Standardexport aus dem Modul .Eine andere Möglichkeit, dies zu erklären, besteht darin, zu beachten, dass der obige Import genau identisch mit ist
und das Beispiel des OP ist genau identisch mit
Die MDN-Dokumentation zeigte das Beispiel
und behauptete, dass es bedeutet
Was MDN hier gesagt hat und welche anderen Antworten aufgrund der falschen MDN-Dokumentation behaupten, ist absolut falsch und basiert möglicherweise auf einer früheren Version der Spezifikation. Was dies tatsächlich tut, ist
(Der Standardmodulexport ist der mit der
export default
Syntax exportierte Wert , der auch sein kannexport {foo as default}
.)Die Verfasser der MDN-Dokumentation sind möglicherweise mit dem folgenden Formular verwechselt worden:
Dies importiert alle Exporte von
my-module
und macht sie unter Namen wie zugänglichMyModule.name
. Auf den Standardexport kann auch zugegriffen werdenMyModule.default
, da der Standardexport eigentlich nichts anderes als ein anderer benannter Export mit dem Namen istdefault
. In dieser Syntax gibt es keine Möglichkeit, nur eine Teilmenge der benannten Exporte zu importieren, obwohl man den Standardexport importieren könnte, wenn es einen zusammen mit allen benannten Exporten mit gibtquelle
from '/path/to/my-module.js'
, obwohl ich persönlich benutzefrom '/path/to/my-module'
.Dadurch werden die ausgeführten greifen
{ Component, PropTypes }
Mitglieder aus dem'react'
Modul und ordnen sieComponent
undPropTypes
, respectively.React
entspricht demdefault
Export des Moduls .Wie von Torazaburo unten bemerkt , ist dies dasselbe wie
Das ist eine Abkürzung für
Hier ist ein weiteres Beispiel ( Link zum Kern ):
Ich habe das zweite Beispiel mit babel getestet:
und bekam einen Syntaxfehler.
Als Referenz können Sie die neue
import
Dokumentation von MDN nachlesen . Es bedarf jedoch offenbar einer technischen Überprüfung. Der Blogbeitrag von Dr. Axel Rauschmayer ist vorerst eine bessere Referenz.quelle
React
und den benannten ExportenComponent
sowie gleichnamigenPropTypes
Variablen zu. Leider sind die MDN-Dokumente falsch, wie Sie herausfinden würden, wenn Sie es versuchen würden. Siehe 2ality.com/2014/09/es6-modules-final.html . Außerdem hat die Importsyntax absolut nichts mit der Destrukturierungszuweisung zu tun.import
Dokumentation", der den Revisionsverlauf dieses MDN-Artikels überprüft, wurden die von Ihnen zitierten Teile nicht überarbeitet, seit die Seite vor mehr als einem Jahr zum ersten Mal geschrieben wurde. In diesem Zeitraum war die Modulsyntax schnell ändern.example3.js
warum es gedruckt wirdundefined
fürconsole.log(d)
? Seitdem habenexport default { a, b, d }
Sie es exportiertmyModule.js
.myModule.js
, beachten Sie, dassa
,b
undc
einzeln exportiert wurden. Dies bedeutet, dass eine andere Datei sie direkt mit importieren kannimport { a } from 'myModule'
. Auf der anderen Seited
ist es nur über den Standardexport verfügbar, sodass ein anderes Modul auf zwei Arten daraufimport thisObjectContainsDefault from 'myModule'
zugreifen kann: und überthisObjectContainsDefault.d
ORimport { default as wrapperObject }
undwrapperObject.d
. Der Vorteil des zweiten Ansatzes besteht darin, dass Sie auch Elemente abrufen können, die einzeln exportiert wurden, wie in zu sehen istexample3.js
.