Понятие модуля: IIFE, CommonJS, AMD, ES Modules
Почему модули — это суперсила разработчика? 💪
Представьте: вы пишете код, но он превращается в слона 🐘 — огромный, неповоротливый и сложный. Модули — это способ разбить его на лёгкие, логичные кусочки, как конструктор LEGO!
Изначально в JavaScript не было модулей, но разработчики придумали умные обходные пути, а позже появились стандарты. Сегодня разберём:
- IIFE — старый, но хитрый способ изоляции кода.
- CommonJS — модули для Node.js.
- AMD — асинхронные модули для браузеров.
- ES Modules — современный стандарт (наше всё!).
Готовы разложить всё по полочкам? Поехали! 🚀
IIFE: Магия самовызывающихся функций 🎩
До модулей разработчики использовали Immediately Invoked Function Expression (IIFE) — функцию, которая выполняется сразу после создания.
(function() {
const secret = "Я скрыт внутри!";
console.log(secret); // "Я скрыт внутри!"
})();
console.log(secret); // Ошибка! secret не виден снаружи.
Как это работает?
- Функция обёрнута в скобки
(function() { ... }), чтобы JS понял, что это выражение. ()в конце вызывает её немедленно.- Всё внутри изолировано — переменные не «протекают» в глобальную область.
🔥 Совет: IIFE всё ещё встречается в старых проектах. Знать его полезно, но в новых проектах лучше использовать современные модули.
CommonJS: Модули для Node.js 🖥️
CommonJS — стандарт, который принёс модули в Node.js.
Экспорт
// math.js
const sum = (a, b) => a + b;
module.exports = sum;
Импорт
// app.js
const sum = require('./math.js');
console.log(sum(2, 3)); // 5
Особенности:
module.exports— экспортирует что угодно (функцию, объект, число).require()— загружает модуль синхронно (подходит для серверного кода).- Используется в Node.js, но не в браузерах (без сборщиков вроде Webpack).
💡 Забавный факт: Если написать
exports = sum;(безmodule.), экспорт не сработает! Подробнее — у Данилы Бежина: youtube.com/@DanilaBezhin.
AMD: Асинхронные модули для браузеров 🌐
Asynchronous Module Definition (AMD) создан для загрузки модулей в браузере без блокировки рендеринга.
// Определяем модуль с require.js
define(['dependency'], function(dependency) {
return {
greet: () => console.log("Привет, модуль!")
};
});
// Загружаем модуль
require(['module'], function(module) {
module.greet(); // "Привет, модуль!"
});
Плюсы:
- Работает асинхронно — страница не «висит» при загрузке.
- Позволяет указывать зависимости явно.
Минусы:
- Сложный синтаксис.
- Устарел с появлением ES Modules и сборщиков.
ES Modules: Стандарт будущего 🚀
ES Modules (ESM) — современный стандарт, работающий и в браузерах, и в Node.js.
Экспорт
// math.js
export const sum = (a, b) => a + b;
export const PI = 3.14;
// ИЛИ одним объектом
const utils = { sum, PI };
export default utils;
Импорт
// app.js
import { sum, PI } from './math.js';
import utils from './math.js'; // default-импорт
console.log(sum(2, 3)); // 5
console.log(PI); // 3.14
Важные отличия от CommonJS:
- Синтаксис —
import/exportвместоrequire/module.exports. - Статический анализ — импорты обрабатываются до выполнения кода.
- Поддержка браузеров — работает с
<script type="module">.
⚡ Важно: В Node.js ES Modules включаются флагом
"type": "module"вpackage.jsonили расширением.mjs.
Что выбрать? 🤔
| Система | Где работает | Синхронность | Синтаксис |
|---|---|---|---|
| IIFE | Браузеры | Синхронный | (function() {})() |
| CommonJS | Node.js | Синхронный | require/module.exports |
| AMD | Браузеры | Асинхронный | define/require |
| ESM | Браузеры + Node.js | Асинхронный | import/export |
Современный выбор:
- Для браузеров — ES Modules + сборщик (Vite, Webpack).
- Для Node.js — ES Modules (если можно) или CommonJS (в легаси-проектах).
Итог: Модули — это просто!
Теперь вы знаете эволюцию модулей в JavaScript:
- От IIFE (изоляция кода) → CommonJS (Node.js) → AMD (браузеры) → ES Modules (универсальный стандарт).
Попробуйте написать модуль на ESM или поиграть с require в Node.js — и вы почувствуете, насколько это удобно!
А если хотите глубже разобрать тему, посмотрите разборы Данилы Бежина — он отлично объясняет сложные концепции: YouTube.
Код — как музыка. Пусть ваши модули звучат гармонично! 🎵