import React, { Component, PropTypes } from 'react';
To mówi:
Importuj domyślny eksport spod 'react'
nazwy React
i importuj nazwane eksporty Component
i PropTypes
pod tymi samymi nazwami.
Łączy w sobie dwie popularne składnie, które prawdopodobnie widzieliście
import React from 'react';
import { Component, PropTypes } from 'react';
Pierwsza służy do importowania i nadawania nazwy domyślnemu eksportowi, a druga do importowania określonych nazwanych eksportów.
Z reguły większość modułów zapewnia pojedynczy, domyślny eksport lub listę nazwanych eksportów. Nieco rzadziej moduł udostępnia zarówno domyślny eksport, jak i nazwane eksporty. Jednak w przypadku, gdy istnieje jedna cecha, która jest najczęściej importowana, ale także dodatkowe funkcje podrzędne, prawidłowym projektem jest eksportowanie pierwszej jako domyślnej, a pozostałych jako nazwanych eksportów. W takich przypadkach użyjesz import
składni, do której się odnosisz.
Pozostałe odpowiedzi są gdzieś pomiędzy błędnymi a zagmatwanymi, być może dlatego, że dokumenty MDN w momencie zadawania tego pytania były błędne i zagmatwane. MDN pokazał przykład
import name from "module-name";
i mówi się, że name
jest to „nazwa obiektu, który otrzyma zaimportowane wartości”. Ale to mylące i niepoprawne; po pierwsze jest tylko jedna wartość importu, która zostanie „odebrana” (dlaczego nie powiedzieć po prostu „przypisany do” lub „używany do odniesienia się do”) name
, a wartość importu w tym przypadku jest domyślnym eksportem z modułu .
Innym sposobem wyjaśnienia tego jest zauważenie, że powyższy import jest dokładnie identyczny z
import { default as name } from "module-name";
a przykład PO jest dokładnie identyczny z
import { default as React, Component, PropTypes } from 'react';
W dalszej części dokumentacji MDN pokazano przykład
import MyModule, {foo, bar} from "my-module.js";
i twierdził, że to oznacza
Zaimportuj zawartość całego modułu, a niektóre z nich są również jawnie nazwane. To wstawia myModule
(sic) foo
, i bar
do bieżącego zakresu. Zauważ, że foo
i myModule.foo
są takie same, jak są bar
imyModule.bar
To, co tu powiedział MDN i jakie inne odpowiedzi twierdzą na podstawie niewłaściwej dokumentacji MDN, jest całkowicie błędne i może opierać się na wcześniejszej wersji specyfikacji. To, co to właściwie robi, to
Importuj domyślny eksport modułu i kilka jawnie nazwanych eksportów. Te wkładki MyModule
, foo
oraz bar
w bieżącym zakresie. Nazwy eksportu foo
i niebar
są dostępne za pośrednictwemMyModule
, co jest domyślnym eksportem, a nie jakimś parasolem obejmującym wszystkie eksporty.
(Domyślnym eksportem modułu jest wartość eksportowana ze export default
składnią, która również może być export {foo as default}
.)
Autorzy dokumentacji MDN mogli pomylić się z następującą formą:
import * as MyModule from 'my-module';
Spowoduje to zaimportowanie wszystkich eksportów z my-module
i udostępnienie ich pod nazwami, takimi jak MyModule.name
. Domyślny eksport jest również dostępny jako MyModule.default
, ponieważ domyślny eksport to nic innego jak inny nazwany eksport o nazwie default
. W tej składni nie ma możliwości zaimportowania tylko podzbioru nazwanych eksportów, chociaż można zaimportować domyślny eksport, jeśli istnieje, razem ze wszystkimi nazwanymi eksportami, z
import myModuleDefault, * as myModule from 'my-module';