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'); // Bufferprocess
Объект 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.jsES 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);Проверь себя
- Чем
globalотличается отwindow? - Как получить аргументы командной строки?
- Что такое
__dirname?