2. CommonJS модули

CommonJS — это система модулей, которая была стандартом в Node.js с самого начала. Используй require() и module.exports.
Зачем нужны модули?
Заголовок раздела «Зачем нужны модули?»Без модулей весь код — в одном файле. С модулями:
- Код разбит на логические части
- Повторное использование функций
- Изоляция (нет конфликтов имён)
- Понятная архитектура
Экспорт и импорт
Заголовок раздела «Экспорт и импорт»// math.js — модуль с функциямиfunction add(a, b) { return a + b;}
function multiply(a, b) { return a * b;}
const PI = 3.14159;
// Экспортируем — делаем доступным извнеmodule.exports = { add, multiply, PI };// main.js — используем модульconst math = require('./math');
console.log(math.add(2, 3)); // 5console.log(math.multiply(4, 5)); // 20console.log(math.PI); // 3.14159
// Деструктуризация при импортеconst { add, PI } = require('./math');console.log(add(10, 5)); // 15Варианты экспорта
Заголовок раздела «Варианты экспорта»// 1. Экспорт объекта (самый частый способ)module.exports = { funcA, funcB, CONST };
// 2. Экспорт одной функции/классаmodule.exports = function greet(name) { return `Привет, ${name}!`;};
// 3. Добавление к exports (альтернатива)exports.greet = function(name) { ... };exports.farewell = function(name) { ... };
// ❌ НЕ делай так — перезаписывает весь exportsexports = { greet }; // Не работает!Встроенные модули Node.js
Заголовок раздела «Встроенные модули Node.js»Node.js поставляется с набором встроенных модулей. Их не нужно устанавливать:
const fs = require('fs'); // Файловая системаconst path = require('path'); // Работа с путямиconst os = require('os'); // Информация об ОСconst http = require('http'); // HTTP серверconst https = require('https'); // HTTPSconst crypto = require('crypto'); // Шифрованиеconst events = require('events'); // Event emitterconst url = require('url'); // Разбор URLconst util = require('util'); // Утилитыconst child_process = require('child_process'); // Запуск процессовМодуль path — работа с путями
Заголовок раздела «Модуль path — работа с путями»const path = require('path');
// Объединение путей (правильно — через path.join!)const filePath = path.join(__dirname, 'data', 'users.json');// Не так: __dirname + '/data/users.json' — ошибка на Windows!
// Расширение файлаconsole.log(path.extname('index.html')); // .htmlconsole.log(path.extname('photo.jpg')); // .jpg
// Имя файла без путиconsole.log(path.basename('/home/user/file.txt')); // file.txtconsole.log(path.basename('/home/user/file.txt', '.txt')); // file
// Директория файлаconsole.log(path.dirname('/home/user/file.txt')); // /home/user
// Разбор путиconst parsed = path.parse('/home/user/file.txt');// { root: '/', dir: '/home/user', base: 'file.txt', ext: '.txt', name: 'file' }
// Абсолютный путь из относительногоconsole.log(path.resolve('src', 'index.js'));// /текущая/директория/src/index.jsМодуль os — информация о системе
Заголовок раздела «Модуль os — информация о системе»const os = require('os');
console.log(os.platform()); // linux / darwin / win32console.log(os.arch()); // x64 / arm64console.log(os.hostname()); // имя компьютераconsole.log(os.homedir()); // /home/userconsole.log(os.tmpdir()); // /tmpconsole.log(os.cpus().length); // количество ядерconsole.log(os.totalmem()); // общая RAM в байтахconsole.log(os.freemem()); // свободная RAM в байтах
// Удобочитаемый вывод RAMconst totalGB = (os.totalmem() / 1024 / 1024 / 1024).toFixed(2);console.log(`RAM: ${totalGB} GB`);Как работает require() под капотом
Заголовок раздела «Как работает require() под капотом»// Когда ты пишешь:const math = require('./math');
// Node.js делает:// 1. Ищет файл ./math.js (или ./math/index.js)// 2. Загружает файл и оборачивает в функцию:(function(exports, require, module, __filename, __dirname) { // твой код модуля здесь});// 3. Выполняет функцию// 4. Возвращает module.exports// 5. КЭШИРУЕТ результат — повторный require() не перечитывает файл!Циклические зависимости
Заголовок раздела «Циклические зависимости»const b = require('./b');console.log('a загружен, b.name =', b.name);module.exports = { name: 'A' };
// b.jsconst a = require('./a');console.log('b загружен, a.name =', a.name); // undefined! (a ещё не экспортирован)module.exports = { name: 'B' };Циклические зависимости — признак плохой архитектуры. Избегай их.
Практика
Заголовок раздела «Практика»- Создай модуль
utils/string.jsс функциями:capitalize(str),truncate(str, len),slugify(str) - Используй модуль в
main.jsчерез require - Создай модуль
config.js, который экспортирует настройки приложения - Выведи информацию о системе через модуль
os - Попрактикуйся с
path.join()— создай пути к разным файлам проекта