В JavaScript вы можете использовать либо модули ECMAScript 6 (ES6), либо модули CommonJs в своем проекте, и между ними есть несколько различий, которые влияют на то, как загружаются ваши программные модули. В этой статье я исследую, как работает каждый из них и как он может повлиять на выполнение вашей программы.

Модули CommonJs.

CommonJs – это исходная модульная система Node.js по умолчанию, в которой используются require и module.exports. Ниже приведен пример.

// Importing modules
const fs = require('fs');
const fileDelete = require('./fileDeleter');
const fileName = require('./fileNamer');
const writeFile = (data) => {
  return fs.writeFileSync(fileName, data);
}
// Exporting writeFile module
modules.exports = writeFile;

С помощью require вы не можете выборочно загружать только те модули, которые вам нужны. Это означает, что даже модуль fileDelete из приведенного выше примера будет импортирован, даже если он нигде не нужен или не используется. Кроме того, импорт модулей является синхронным, что означает, что модуль fileName не может быть импортирован до того, как будут импортированы модули fs и fileDelete, и сбой для импорта fileDelete вызовет ошибки во время выполнения, даже если он нигде не используется в нашей программе. Модули CommonJS — лучший выбор для сервера node.js.

Модули ECMAScript

Модули ECMAScript относительно новее и используют импорт и экспорт. Ниже приведено преобразование нашего примера CommonJs из приведенного выше в ESM.

// Importing modules
import fs from 'fs';
import fileDelete from './fileDeleter';
import fileName from './fileNamer';
const writeFile = (data) => {
  return fs.writeFileSync(fileName, data);
}
// Exporting writeFile module
export default function writeFile;

При импорте вы загружаете только те модули, которые вам нужны. Например, модуль fileDelete из приведенного выше не будет импортирован, так как он нигде не используется. Кроме того, импорт модулей является асинхронным, что означает, что и fs, и fileName импортируются одновременно. Обычно вы хотите использовать ESM для своих новых проектов.

… как насчет .cjs и .mjs?

.cjs — это расширение файла для модулей CommonJS, а .mjs — это расширение файла для модуля ECMAScript. Node.js по умолчанию рассматривает файлы .js как модули CommonJS. Вы можете изменить это, добавив "type": "module" в свой файл package.json, чтобы вы могли использовать модули ECMAScript (в ваших файлах .mjs) в среде Node.js. Это то, что рекомендует Google Chrome V8.

Я надеюсь, что это было полезно для вас, и для дальнейшего чтения сделайте заказ Модули JavaScript.

Удачного кодирования!