import React, { Component, PropTypes } from 'react';
Це говорить:
Імпортуйте експорт за замовчуванням з- 'react'
під імені React
та імпортуйте названий експорт Component
та PropTypes
під тими ж назвами.
Це поєднує в собі два поширених синтаксису, які ви, напевно, бачили
import React from 'react';
import { Component, PropTypes } from 'react';
Перший використовується для імпорту та назви експорту за замовчуванням, другий для імпорту вказаного експорту.
За загальним правилом, більшість модулів надаватимуть єдиний експорт за замовчуванням або список названих експортерів. Дещо менш звичним для модуля є надання як експорту за замовчуванням, так і названого експорту. Однак у випадку, коли є одна особливість, яка найчастіше імпортується, а також додаткові підфункції, це дійсна конструкція для експорту першої як за замовчуванням, а решти як названої експорту. Саме в таких випадках ви використовуєте import
синтаксис, на який ви посилаєтесь.
Інші відповіді десь між помилковими та заплутаними, можливо, тому, що документи MDN під час запитання цього питання були помилковими та заплутаними. MDN показав приклад
import name from "module-name";
і name
це "ім'я об'єкта, який отримає імпортовані значення". Але це вводить в оману і неправильно; Перш за все, існує лише одне значення імпорту, яке буде "отримано" (чому б не сказати просто "призначено" або "використовується для посилання") name
, а значення імпорту в цьому випадку - експорт за замовчуванням з модуля .
Ще один спосіб пояснення цього - зазначити, що вищевказаний імпорт точно ідентичний
import { default as name } from "module-name";
і приклад ОП точно ідентичний
import { default as React, Component, PropTypes } from 'react';
Документація MDN продовжувала показувати приклад
import MyModule, {foo, bar} from "my-module.js";
і стверджував, що це означає
Імпортуйте вміст цілого модуля, а деякі також мають чітке ім'я. Це вставляє myModule
(sic) foo
, і bar
в поточну область. Зауважте, що foo
і myModule.foo
такі самі, як bar
іmyModule.bar
Що тут говорив MDN та які відповіді на інші відповіді, виходячи з неправильної документації MDN, абсолютно невірно і може базуватися на більш ранній версії специфікації. Насправді це і є
Імпортуйте експорт модуля за замовчуванням та деякий експліцитно названий експорт. Це вставляє MyModule
, foo
і 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';