Проблемы с export default¶
Предположим, у вас есть файл foo.ts
со следующим содержимым:
1 2 |
|
Вы должны импортировать его (в bar.ts
), используя синтаксис ES6, как показано ниже:
1 |
|
Здесь есть несколько проблем с удобством сопровождения:
- Если вы переименуете
Foo
вfoo.ts
, он не переименуется его вbar.ts
. - Если вам в конечном итоге потребуется экспортировать больше сущностей из
foo.ts
(что довольно распространенная ситуация), вам придется переделать синтаксис импорта.
По этой причине я рекомендую простой экспорт + деструктурированный импорт. Например foo.ts
:
1 |
|
А затем:
1 |
|
Ниже я также привожу еще несколько причин.
Плохая обнаруживаемость¶
У экспорта по умолчанию очень низкая обнаруживаемость. Вы не можете исследовать модуль с помощью intellisense, чтобы узнать, есть ли у него экспорт по умолчанию или нет.
При экспорте по умолчанию вы ничего здесь не получите (может быть модуль экспортирует что-то по умолчанию / а может и нет ¯\_(ツ)_/¯
):
1 |
|
Без экспорта по умолчанию вы получите хорошее автодополнение intellisense:
1 |
|
Автодополнение¶
Независимо от того, знаете вы об экспорте или нет, вы можете автодополнить импорт import {/*здесь*/} from "./foo";
. Это упрощает работу разработчиков.
Несочетаемость с CommonJS¶
Использование default
ужасные испытания для commonJS пользователей, которым приходится использовать const {default} = require('module/foo');
вместо const {Foo} = require('module/foo')
. Скорее всего, при импорте вы захотите переименовать экспорт по умолчанию
во что-нибудь другое.
Защита от опечаток¶
Вы не получите опечаток, например, когда один разработчик пишет import Foo from "./foo";
, а другой пишет import foo from "./foo";
Автоимпорт в TypeScript¶
Автоматический импорт лучше всего работает c именованным экспортом. Вы используете Foo
, и автоматический импорт запишет import { Foo } from "./foo";
потому что это четко определенное имя, экспортированное из модуля. Некоторые инструменты будут пытаться волшебным образом прочитать и логически вывести имя и для экспорта по умолчанию, но такая магия уже не так надежна.
Реэкспорт¶
Реэкспорт является обычным явлением для корневого файла index
в пакетах npm и заставляет вас вручную указать экспорт по умолчанию, например export { default as Foo } from "./foo";
(экспорт по умолчанию) по сравнению с export * from "./foo"
(именованный экспорт).
Динамический импорт¶
Экспорт по умолчанию раскрывается с дополнительным default
при динамическом импорте
, например:
1 2 |
|
Лучше с именованным экспортом:
1 2 |
|
Требуется две строки для не-классов / не-функций¶
Достаточно одной инструкции для функции/класса, например:
1 |
|
Достаточно одной инструкции для безымянных / типизированых объектов, например:
1 2 3 4 |
|
Но в противном случае нужны две инструкции:
1 2 3 4 5 6 7 |
|