JS Tower
Node.jsМодуль 1: Введение в Node.js

Глобальные объекты

global, process, __dirname и другие

Цель урока

В этом уроке ты научишься:

  • Использовать глобальные объекты Node.js
  • Работать с process
  • Понимать __dirname и __filename

global

В Node.js вместо window используется global:

// В браузере
// window.myVar = 'value';

// В Node.js
global.myVar = 'value';
console.log(global.myVar); // 'value'

// Но лучше избегать глобальных переменных!

Глобально доступные объекты

// Эти объекты доступны без require:
console.log('Hello');           // console
setTimeout(() => {}, 1000);     // setTimeout
setInterval(() => {}, 1000);    // setInterval
setImmediate(() => {});         // setImmediate
Buffer.from('hello');           // Buffer

process

Объект process содержит информацию о текущем процессе Node.js.

Информация о процессе

console.log('PID:', process.pid);
console.log('Версия Node:', process.version);
console.log('Платформа:', process.platform);
console.log('Архитектура:', process.arch);
console.log('Текущая директория:', process.cwd());
console.log('Время работы:', process.uptime(), 'секунд');

Аргументы командной строки

// node app.js --name=John --age=25

console.log(process.argv);
// [
//   '/usr/bin/node',
//   '/path/to/app.js',
//   '--name=John',
//   '--age=25'
// ]

// Получение аргументов
const args = process.argv.slice(2);
console.log(args); // ['--name=John', '--age=25']

Переменные окружения

// Установка в терминале:
// export NODE_ENV=production
// или в Windows: set NODE_ENV=production

console.log(process.env.NODE_ENV);  // 'production'
console.log(process.env.PATH);      // системный PATH
console.log(process.env.HOME);      // домашняя директория

// Установка в коде
process.env.MY_VAR = 'value';

Стандартные потоки

// Стандартный вывод
process.stdout.write('Hello\n');

// Стандартный ввод
process.stdin.on('data', (data) => {
  console.log('Ввод:', data.toString());
});

// Стандартный поток ошибок
process.stderr.write('Ошибка!\n');

Завершение процесса

// Завершение с кодом 0 (успех)
process.exit(0);

// Завершение с кодом 1 (ошибка)
process.exit(1);

// Обработка завершения
process.on('exit', (code) => {
  console.log('Процесс завершается с кодом:', code);
});

// Обработка SIGINT (Ctrl+C)
process.on('SIGINT', () => {
  console.log('Получен SIGINT');
  process.exit(0);
});

Использование памяти

const used = process.memoryUsage();

console.log('Память:');
console.log('  RSS:', Math.round(used.rss / 1024 / 1024), 'MB');
console.log('  Heap Total:', Math.round(used.heapTotal / 1024 / 1024), 'MB');
console.log('  Heap Used:', Math.round(used.heapUsed / 1024 / 1024), 'MB');

__dirname и __filename

CommonJS

// В CommonJS модулях
console.log(__dirname);  // /path/to/directory
console.log(__filename); // /path/to/directory/file.js

ES Modules

// В ES Modules нужно получить вручную
import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

console.log(__dirname);
console.log(__filename);

Buffer

Buffer — для работы с бинарными данными:

// Создание
const buf1 = Buffer.from('Hello');
const buf2 = Buffer.alloc(10);  // 10 байт, заполненных нулями
const buf3 = Buffer.allocUnsafe(10);  // 10 байт, не инициализированных

// Запись
buf2.write('Hi');

// Чтение
console.log(buf1.toString());       // 'Hello'
console.log(buf1.toString('hex'));  // '48656c6c6f'
console.log(buf1.toString('base64')); // 'SGVsbG8='

// Длина
console.log(buf1.length); // 5 байт

// Конкатенация
const combined = Buffer.concat([buf1, Buffer.from(' World')]);
console.log(combined.toString()); // 'Hello World'

console

Расширенные методы console:

// Базовые
console.log('Информация');
console.error('Ошибка');
console.warn('Предупреждение');

// Таблица
console.table([
  { name: 'Иван', age: 25 },
  { name: 'Мария', age: 22 }
]);

// Время выполнения
console.time('операция');
// ... какой-то код
console.timeEnd('операция'); // операция: 123.456ms

// Группировка
console.group('Группа');
console.log('Элемент 1');
console.log('Элемент 2');
console.groupEnd();

// Трассировка
console.trace('Стек вызовов');

// Условный вывод
console.assert(1 === 2, 'Это не равно!');

// Очистка
console.clear();

Таймеры

// setTimeout — один раз
const timeoutId = setTimeout(() => {
  console.log('Через 1 секунду');
}, 1000);

// Отмена
clearTimeout(timeoutId);

// setInterval — повторяющийся
let count = 0;
const intervalId = setInterval(() => {
  count++;
  console.log('Счётчик:', count);
  if (count >= 5) {
    clearInterval(intervalId);
  }
}, 1000);

// setImmediate — после текущего цикла
setImmediate(() => {
  console.log('Немедленно (после I/O)');
});

Практика

Задание 1: Аргументы CLI

Задача: Создай скрипт, который принимает имя из командной строки.

node greet.js Иван
# Привет, Иван!

Решение:

// greet.js
const name = process.argv[2] || 'Мир';
console.log(`Привет, ${name}!`);

Задание 2: Переменные окружения

Задача: Выведи режим работы приложения.

// Если NODE_ENV не установлен, используй 'development'

Решение:

const mode = process.env.NODE_ENV || 'development';
console.log(`Режим: ${mode}`);

Задание 3: Мониторинг памяти

Задача: Выводи использование памяти каждую секунду.

Решение:

setInterval(() => {
  const used = process.memoryUsage();
  console.log(`Heap: ${Math.round(used.heapUsed / 1024 / 1024)} MB`);
}, 1000);

Проверь себя

  1. Чем global отличается от window?
  2. Как получить аргументы командной строки?
  3. Что такое __dirname?