ES2015 стал самым важным улучшением Javascript за многие годы. Среди множества замечательных функций он принес совершенно новую модульную систему - Ecma Script Modules, которая, наконец, решила проблему совместного использования кода между файлами (модулями) на уровне языка. Это был огромный шаг вперед, но он должен был работать с уже существующими модулями, особенно с CommonJS, используемым узлом (require). Поэтому потребовались некоторые компромиссы, один из которых - наличие экспорта по умолчанию. В этой статье я хочу объяснить, почему здесь, в Neufund, мы решили запретить экспорт по умолчанию и использовать только именованные.

Лучше DX

Экспорт по умолчанию не экспортирует никакого имени, т.е. символ, который можно легко связать с экспортируемым значением. Именованный экспорт, с другой стороны, должен иметь имя (довольно очевидно, верно). Это позволяет средам IDE автоматически находить и импортировать зависимости, что значительно повышает производительность.

Рефакторинг

Экспорт по умолчанию делает невозможным крупномасштабный рефакторинг, поскольку каждый сайт импорта может называть импорт по умолчанию по-разному (включая опечатки).

// in file exports.js
export default function () {...}
// in file import1.js
import doSomething from "./exports.js"
// in file import2.js
import doSmth from "./exports.js"

Напротив, именованный экспорт делает такой рефакторинг тривиальным.

Лучше дрожь от дерева

Иногда у вас может возникнуть соблазн экспортировать один огромный объект со многими свойствами в качестве экспорта по умолчанию. Это антипаттерн, запрещающий правильное встряхивание дерева:

// do not try this at home
export default {
  propertyA: "A",
  propertyB: "B",
}
// do this instead
export const propertyA = "A";
export const propertyB = "B";

Использование именованного экспорта может уменьшить размер вашего пакета, если вы не используете все экспортированные значения (особенно полезно при сборке библиотек).

Резюме

Экспорт по умолчанию был введен в основном для облегчения взаимодействия с тысячами модулей CommonJS, которые экспортировали отдельные значения, например:

module.exports = function() {...}

Они не приносят особых преимуществ при использовании внутри вашей кодовой базы, поэтому, пожалуйста, избегайте их и тем самым сделайте мир лучше 😁

Чтобы узнать больше новостей, советов и рекомендаций о Typescript, Javascript и блокчейне, подписывайтесь на меня в Twitter!

Кшиштоф Качор - ведущий разработчик блокчейнов в Neufund, платформе для сбора средств, принадлежащей сообществу, соединяющей миры инвестиций в акционерный капитал и блокчейн.

Чтобы узнать больше, посетите страницу МБР Neufund или технический документ для более глубокого нырять. Вопросов? Спросите нас о чем угодно в Twitter и Telegram!