Использование exports/require в CommonJS и export/import в EcmaScript 2015

Начиная с ECMAScript 2015 (ES6), JavaScript имеет концепцию модулей. Модули выполняются в своей собственной области, а не в глобальной области.

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

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

Модули декларативные, а отношения между модулями определяются в терминах импорта и экспорта на уровне файлов с кодом, которые именуются модулями.

Как это используют в CommonJS? Модули импортируют друг друга, используя загрузчик модулей. Во время выполнения загрузчик модуля отвечает за поиск и выполнение всех зависимостей модуля перед его выполнением. Хорошо известные загрузчики модулей, используемые в JavaScript — это загрузчик Node.js для модулей CommonJS и загрузчик RequireJS для модулей AMD в веб-приложениях.

Как это используют в ECMAScript 2015? Любой файл, содержащий импорт или экспорт верхнего уровня, считается модулем. И наоборот, файл без каких-либо объявлений импорта или экспорта верхнего уровня обрабатывается как сценарий, содержимое которого доступно в глобальной области.

Различие в использовании модулей CommonJS и ES6

Что предпочтительнее использовать?

Вопрос, относительно использовании модулей ES6 против CommonJS не однозначен. Первые универсальны, последние в основном используются в Node.js, но также поддерживаются сборщиками Webpack и другими компоновщиками, поэтому в приложениях на подобии React, Angular или Vue могут потенциально использоваться как import, так и require.