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";
и пример OP в точности идентичен
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';