Почему мы отказались от использования экспорта по умолчанию в JavaScript, и почему вы должны сделать то же самое.

Hydrock
Front Stories
Published in
2 min readDec 1, 2017

Перевод статьи от Krzysztof Kaczor

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

ESM является частью ES6 (ES2015)

Лучший DX

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

Классно, не правда ли?

Рефакторинг

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

// в файле exports.js
export default function () {...}
// в файле import1.js
import doSomething from "./exports.js"
// в файле import2.js
import doSmth from "./exports.js"

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

Лучший tree shaking

Иногда у вас может возникнуть соблазн экспортировать один огромный объект со многими свойствами в качестве экспорта по умолчанию. Это анти-шаблон и делает невозможным правильный tree shaking:

// не пытайтесь повторить это дома
export default {
propertyA: "A",
propertyB: "B",
}
// делайте так
export const propertyA = "A";
export const propertyB = "B";

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

Итог

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

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

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

Примечание от переводчика

Я не совсем согласен из этой статьи. Нативный экспорт модулей не заменяет все то, что уже придумали. Но при правильном использовании, он может стать мощным инструментом разработчика.

--

--