Экспортв ESM: именованный или по умолчанию?
Назвать илине назвать?
Стоит ли использовать named или default экспорты в JavaScript?
Нет недостатка в ярко сформулированных статьях на эту тему.
Большинство считает default export «ужасным». Другие настаивают, что default должен побеждать (например, в руководстве стиля AirBnb).
Они часто обвиняют чисто временные вещи: баги автодобавления импортов в IDE, возможности tree‑shaking конкретного бандлера или простую возможность опечатки при именовании импорта.
Не упустили ли мы из виду смысл exportа изначально?
Код — это коммуникация. ✨
Мы посылаем сигнал импортёрам — как пользоваться объектом.
И что мы говорим?
Грубо говоря, в современном JavaScript есть два способа экспортировать вещи:
export defaultсмело заявляет: «Это ЕДИНСТВЕННО САМОЕ ВАЖНОЕ». При этом «любые именованные экспорты играют лишь вспомогательную роль».- Именованный экспорт говорит: «Это КОНКРЕТНАЯ ВЕЩЬ!». При этом поднимает вопросы: «Есть ли у вас ещё какие‑то товарищи?», а затем — «Приглашены они или обязательны?»
Разумеется, можно комбинировать оба подхода или использовать разные стратегии в разных частях кодовой базы. Смотрите дополнительные примеры в конце статьи.
Слабые аргументы, чувак
Давайте разберём некоторые из часто встречающихся «временных проблем», с которыми сталкиваются разработчики.
- Аргумент #1: Именованные экспорты обеспечивают согласованность имён. источник
- Нет, они этого не делают. Возможно, вам нужна линтер‑правила?
- (Ненавижу разрушать иллюзии, но подождите, пока не узнаете, на что способны переменные!)
// Вы можете задавать алиасы обоими способами!import { Knife as Handle } from "./knife.js"; // 🔪import { default as Handle } from "./knife.js"; // 🔪import Handle from "./knife.js"; // 🔪-
Аргумент #2: Использовать
import * as soManyKnives from './kinves.js'для объединения именованных экспортов. (Ссылка отсутствует, автор отрёкся.)- Крутая возможность. Не по теме.
- И скажите, как мне снова держать ваш механизм? Нет намерения автора.
-
Аргумент #3: Именованные экспорты лучше поддерживаются IDE при импорте или переименовании. источник
-
Неправильно (и дальше). Настройте/обновите свои инструменты.
-
Поддержка существует более 3 лет в VS Code, IntelliJ и прочих.
-
Тем не менее, есть «лучшие практики» для
default exports, которые позволяют получить лучший опыт в IDE и при рефакторинге. -
✅
export default function UserService() {}— по возможности используйте именованные функции. -
❌
export default function() { }— анонимные функции не привязываются к имени файла. Если вы не назовёте сущность, будет сложно заставить инструменты её переименовать. -
Примечание: По историческим причинам нельзя комбинировать
export defaultс выражениемconst.export default const Knife = () => {...blade, ...handle}// ^ ❌ Не поддерживается ❌ ^// Невозможно экспортировать default const …// ==========================// Однако после объявления можно экспортировать const‑переменную как default.const Knife = () => {...blade, ...handle}export default Knife;// ^ ✅ Валидно// Для полноты картины:export default class anyoneStillUseThese {}// ^ ✅ Также допустимо экспортировать класс как default
-
Итоги
Существует множество комбинаций способов экспорта, каждая из которых рассказывает свою историю:
| Default (Exports) | Named (Exports) | Private Fns | Pattern | Meaning |
|---|---|---|---|---|
| ✅ | ❌ | ❌ | Один default‑экспорт. | “Представляем ОДНУ функцию с единственной целью!” |
| ❌ | ✅ | ❌ | Один именованный экспорт. | “Пожалуйста, не переименовывайте меня.” |
| ✅ | ✅ | ✅ | Default‑экспорт + несколько «приватных» функций без экспорта | “Вот связанная логика. И ожидайте поведение, похожее на класс.” |
| ❌ | ❌ | ✅ | Несколько именованных экспортов, общее имя файла. | “Сборная коробка с слабо связанными вещами, без подразумеваемой иерархии.” |
| ✅ | ✅ | ❌ | Один именованный экспорт, также экспортированный как default. | “Вы не сможете ошибиться при импорте.” |
На размышление: Что мы подразумеваем, когда имя файла совпадает или не совпадает с одним из его экспортов? (Например, utils.js с множеством функций.)
Заключение
Если код — это коммуникация, пожалуйста, export делайте так, как вы действительно имеете в виду. 💞