Перейти к содержимому

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)); // 5
console.log(math.multiply(4, 5)); // 20
console.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) { ... };
// ❌ НЕ делай так — перезаписывает весь exports
exports = { greet }; // Не работает!

Node.js поставляется с набором встроенных модулей. Их не нужно устанавливать:

const fs = require('fs'); // Файловая система
const path = require('path'); // Работа с путями
const os = require('os'); // Информация об ОС
const http = require('http'); // HTTP сервер
const https = require('https'); // HTTPS
const crypto = require('crypto'); // Шифрование
const events = require('events'); // Event emitter
const url = require('url'); // Разбор URL
const util = require('util'); // Утилиты
const child_process = require('child_process'); // Запуск процессов
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')); // .html
console.log(path.extname('photo.jpg')); // .jpg
// Имя файла без пути
console.log(path.basename('/home/user/file.txt')); // file.txt
console.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
const os = require('os');
console.log(os.platform()); // linux / darwin / win32
console.log(os.arch()); // x64 / arm64
console.log(os.hostname()); // имя компьютера
console.log(os.homedir()); // /home/user
console.log(os.tmpdir()); // /tmp
console.log(os.cpus().length); // количество ядер
console.log(os.totalmem()); // общая RAM в байтах
console.log(os.freemem()); // свободная RAM в байтах
// Удобочитаемый вывод RAM
const totalGB = (os.totalmem() / 1024 / 1024 / 1024).toFixed(2);
console.log(`RAM: ${totalGB} GB`);
// Когда ты пишешь:
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() не перечитывает файл!
a.js
const b = require('./b');
console.log('a загружен, b.name =', b.name);
module.exports = { name: 'A' };
// b.js
const a = require('./a');
console.log('b загружен, a.name =', a.name); // undefined! (a ещё не экспортирован)
module.exports = { name: 'B' };

Циклические зависимости — признак плохой архитектуры. Избегай их.

  1. Создай модуль utils/string.js с функциями: capitalize(str), truncate(str, len), slugify(str)
  2. Используй модуль в main.js через require
  3. Создай модуль config.js, который экспортирует настройки приложения
  4. Выведи информацию о системе через модуль os
  5. Попрактикуйся с path.join() — создай пути к разным файлам проекта