DanLevy.net

Экспортв ESM: именованный или по умолчанию?

Назвать илине назвать?

Hero image for Экспортв ESM: именованный или по умолчанию?

Стоит ли использовать named или default экспорты в JavaScript?

Нет недостатка в ярко сформулированных статьях на эту тему.

Большинство считает default export «ужасным». Другие настаивают, что default должен побеждать (например, в руководстве стиля AirBnb).

Они часто обвиняют чисто временные вещи: баги автодобавления импортов в IDE, возможности tree‑shaking конкретного бандлера или простую возможность опечатки при именовании импорта.

Не упустили ли мы из виду смысл exportа изначально?

Код — это коммуникация. ✨

Мы посылаем сигнал импортёрам — как пользоваться объектом.

И что мы говорим?

Грубо говоря, в современном JavaScript есть два способа экспортировать вещи:

Разумеется, можно комбинировать оба подхода или использовать разные стратегии в разных частях кодовой базы. Смотрите дополнительные примеры в конце статьи.

Слабые аргументы, чувак

Давайте разберём некоторые из часто встречающихся «временных проблем», с которыми сталкиваются разработчики.

// Вы можете задавать алиасы обоими способами!
import { Knife as Handle } from "./knife.js"; // 🔪
import { default as Handle } from "./knife.js"; // 🔪
import Handle from "./knife.js"; // 🔪

Итоги

Существует множество комбинаций способов экспорта, каждая из которых рассказывает свою историю:

Default (Exports)Named (Exports)Private FnsPatternMeaning
Один default‑экспорт.“Представляем ОДНУ функцию с единственной целью!”
Один именованный экспорт.“Пожалуйста, не переименовывайте меня.”
Default‑экспорт + несколько «приватных» функций без экспорта“Вот связанная логика. И ожидайте поведение, похожее на класс.”
Несколько именованных экспортов, общее имя файла.“Сборная коробка с слабо связанными вещами, без подразумеваемой иерархии.”
Один именованный экспорт, также экспортированный как default.“Вы не сможете ошибиться при импорте.”

На размышление: Что мы подразумеваем, когда имя файла совпадает или не совпадает с одним из его экспортов? (Например, utils.js с множеством функций.)

Заключение

Если код — это коммуникация, пожалуйста, export делайте так, как вы действительно имеете в виду. 💞