Ответ 1
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';