← Усі теми

Питання на співбесіді з Node.js з відповідями

Event loop і асинхронність, модулі, streams і Buffer, файлова система та HTTP, Express і Fastify, безпека, worker threads і масштабування Node.js-сервісів.

225 запитань для співбесіди з теми Node.js з відповідями й поясненнями - рівні Junior, Middle і Senior. Приклади запитань, онлайн-тести й задачі на код.

Запитання за рівнями

Приклади запитань

Кілька запитань із кожного рівня з правильною відповіддю й поясненням.

Node.js · Junior

  1. Що таке Node.js?

    Правильна відповідь: Середовище виконання JavaScript на рушії V8, яке запускає JavaScript поза браузером

    Node.js бере рушій V8 із Chrome і додає API для файлової системи, мережі, процесів тощо. На ньому пишуть сервери, CLI, інструменти збирання та скрипти.

  2. Який рушій JavaScript використовує Node.js?

    Правильна відповідь: V8

    V8 - рушій від Google, той самий, що в Chrome. SpiderMonkey працює у Firefox, JavaScriptCore - у Safari. Деякі інші середовища, наприклад Bun, використовують JavaScriptCore.

  3. Яку модель використовує Node.js, щоб обслуговувати багато з'єднань одночасно?

    Правильна відповідь: Однопотоковий event loop з неблокувальним вводом-виводом

    JavaScript виконується в одному головному потоці. Ввід-вивід, як-от читання файлів чи мережеві запити, передається системі та libuv, а колбек виконується пізніше, тож один процес обслуговує тисячі з'єднань.

  4. Що з цього НЕ доступне в Node.js за замовчуванням?

    Правильна відповідь: document і DOM

    У Node.js немає сторінки, тож немає document і window. Натомість є модулі fs, http, process. Таймери та console існують в обох середовищах.

Усі 75 запитань з відповідями →

Node.js · Middle

  1. Який список показує основні фази event loop у Node.js у правильному порядку?

    Правильна відповідь: timers → pending callbacks → poll → check → close callbacks

    Timers виконує колбеки setTimeout/setInterval, poll чекає на ввід-вивід і виконує його колбеки, check - setImmediate, close - події close. Кроку render немає: це поняття браузера.

  2. Чим небезпечні рекурсивні виклики process.nextTick?

    Правильна відповідь: Черга nextTick вичерпується повністю, перш ніж цикл продовжиться, тож нескінченні nextTick морять голодом ввід-вивід

    Те саме стосується нескінченного ланцюжка мікрозадач. setImmediate дає event loop обробити ввід-вивід між ітераціями.

  3. Що за замовчуванням обробляє пул потоків libuv?

    Правильна відповідь: Операції файлової системи, dns.lookup, частину crypto (як-от pbkdf2, scrypt) і роботу zlib

    Мережеві сокети використовують асинхронні механізми ОС (epoll, kqueue, IOCP) і пул їм не потрібен. У пулі за замовчуванням 4 потоки, кількість задається через UV_THREADPOOL_SIZE.

  4. Обробник запиту 2 секунди виконує важкий для CPU цикл. Що відбувається з іншими запитами?

    Правильна відповідь: Вони чекають: поки JavaScript працює в головному потоці, event loop не може обробляти нічого іншого

    Виносьте важку роботу в worker_threads, окремий сервіс або чергу задач, або розбивайте її на дрібні частини з setImmediate між ними.

Усі 75 запитань з відповідями →

Node.js · Senior

  1. Як організована купа V8 для збирання сміття?

    Правильна відповідь: Молоде покоління (нові об'єкти, часто прибираються швидким scavenger) і старе покоління (довгоживучі об'єкти, прибираються mark-sweep-compact)

    Більшість об'єктів гине молодими, тож часті дешеві scavenge їх швидко прибирають. Ті, що вижили, переходять у старе покоління, яке прибирається рідше й дорожче, хоча здебільшого конкурентно та інкрементально.

  2. Контейнер має 2 ГБ пам'яті, але процес Node.js падає з «JavaScript heap out of memory» десь на 1,4 ГБ. Що перевірити?

    Правильна відповідь: Ліміт old space у V8: задати --max-old-space-size під контейнер, лишивши місце для Buffer і нативної пам'яті

    Нові версії Node.js визначають розмір купи за лімітом пам'яті контейнера, але купа - це не вся пам'ять: Buffer, нативний код і стеки потоків живуть поза нею. Лишайте запас.

  3. Який шаблон - класична причина витоку пам'яті в Node.js-сервері?

    Правильна відповідь: Map на рівні модуля як кеш, який поповнюється на кожен запит і ніколи не очищується

    Усе, що досяжне з об'єкта на рівні модуля, живе вічно. Використовуйте обмежений LRU-кеш із TTL, WeakMap з ключами-об'єктами або зовнішній кеш, як-от Redis.

  4. Як знайти, що саме витікає в процесі Node.js?

    Правильна відповідь: Зробити кілька знімків купи з інтервалом (v8.writeHeapSnapshot() або DevTools) і порівняти, кількість яких об'єктів постійно зростає

    Режим порівняння показує об'єкти, створені між знімками, а шляхи утримувачів - що тримає їх живими. --heapsnapshot-near-heap-limit може зробити знімок прямо перед падінням.

Усі 75 запитань з відповідями →

Задачі на код

Напишіть рішення просто в браузері - тести перевірять його одразу. Класика співбесід на JavaScript (debounce, deepClone, Promise.all, LRU-кеш) і на React: компоненти й хуки на кшталт списку справ, вкладок, useDebounce та useInterval.

Відкрити задачі →