Отличия между CommonJS и ESM модулями
Не могут использоваться в браузере без сборщика. В Node.js файлы с расширением .js относятся к системе модулей CommonJS, которая применяется в Node.js и предполагает использование require и module.exports:
// импорт модуля CommonJS
const product = require('product');
// экспорт модуля CommonJS
function product() {
console.log('CommonJS');
}
module.exports.product = product;
Могут использоваться в браузере без сборщика. В Node.js файлы с расширением .mjs в свою очередь, связаны с системой модулей ECMAScript Modules (ESM), в основе которой лежат директивы import и export. Система ESM позволяет всесторонне применять статический анализ и приемы оптимизации, такие как tree shaking:
// импорт модуля ESM
import product from 'product';
// экспорт модуля CommonJS
export function product() {
console.log('ESM');
}
Помните о необходимости указания атрибута type="module" для вашего скрипта:
// так подключаются модули без сборщика
<script type="module" src="./your-module.js"></script>
В веб разработке мы используем для CommonJS и ECMAScript Modules (ESM) одно расширение файлов .js, тип указывается package.json в виде параметра type который определяет формат модуля для файлов с расширением ..js:
"type": "module"
Если файл package.json не содержит поля type, то файлы .js рассматриваются как CommonJS.
Значение module в поле type указывает Node.js интерпретировать файлы .js внутри пакета как использующие синтаксис ES.