Какие синхронные операции знаешь в Node.js?

«Какие синхронные операции знаешь в Node.js?» — вопрос из категории Асинхронность, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Node.js, несмотря на асинхронную природу, существует ряд синхронных API, которые блокируют Event Loop. Их использование в основном оправдано в скриптах инициализации или CLI-утилитах, но не в серверном коде, обрабатывающем запросы.

Основные синхронные операции:

  1. Файловая система (fs): Модуль fs предоставляет синхронные версии большинства методов.

    const fs = require('fs');
    const data = fs.readFileSync('./config.json', 'utf8');
    fs.writeFileSync('./output.log', data);
  2. Дочерние процессы (child_process): Для синхронного выполнения внешних команд.

    const { execSync } = require('child_process');
    const gitVersion = execSync('git --version').toString();
  3. Криптография (crypto): Некоторые хеширующие и шифрующие методы работают синхронно.

    const crypto = require('crypto');
    const hash = crypto.createHash('sha256').update('someData').digest('hex');
  4. Сжатие (zlib): Синхронные методы для deflate/gzip.

    const zlib = require('zlib');
    const compressed = zlib.gzipSync(Buffer.from('data to compress'));
  5. Встроенные операции: Некоторые операции в ядре V8, такие как JSON.parse() или crypto.randomBytes(), также являются синхронными и блокирующими.

Ключевой недостаток: Любая синхронная операция блокирует главный поток, делая приложение неотзывчивым. Например, fs.readFileSync на большом файле остановит обработку всех входящих HTTP-запросов до своего завершения.