Питання на співбесіді з Node.js з відповідями
Event loop і асинхронність, модулі, streams і Buffer, файлова система та HTTP, Express і Fastify, безпека, worker threads і масштабування Node.js-сервісів.
225 запитань для співбесіди з теми Node.js з відповідями й поясненнями - рівні Junior, Middle і Senior. Приклади запитань, онлайн-тести й задачі на код.
- Event loop
- Streams
- Express
- Security
- Worker threads
Запитання за рівнями
Junior
Базові поняття та синтаксис · 50 запитань
Middle
Практика, нюанси й оптимізація · 50 запитань
Senior
Архітектура, внутрішня будова, edge cases · 50 запитань
Приклади запитань
Кілька запитань із кожного рівня з правильною відповіддю й поясненням.
Node.js · Junior
- Що таке Node.js?
Правильна відповідь: Середовище виконання JavaScript на рушії V8, яке запускає JavaScript поза браузером
Node.js бере рушій V8 із Chrome і додає API для файлової системи, мережі, процесів тощо. На ньому пишуть сервери, CLI, інструменти збирання та скрипти.
- Який рушій JavaScript використовує Node.js?
Правильна відповідь: V8
V8 - рушій від Google, той самий, що в Chrome. SpiderMonkey працює у Firefox, JavaScriptCore - у Safari. Деякі інші середовища, наприклад Bun, використовують JavaScriptCore.
- Яку модель використовує Node.js, щоб обслуговувати багато з'єднань одночасно?
Правильна відповідь: Однопотоковий event loop з неблокувальним вводом-виводом
JavaScript виконується в одному головному потоці. Ввід-вивід, як-от читання файлів чи мережеві запити, передається системі та libuv, а колбек виконується пізніше, тож один процес обслуговує тисячі з'єднань.
- Що з цього НЕ доступне в Node.js за замовчуванням?
Правильна відповідь:
documentі DOMУ Node.js немає сторінки, тож немає
documentіwindow. Натомість є модуліfs,http,process. Таймери таconsoleіснують в обох середовищах.
Node.js · Middle
- Який список показує основні фази event loop у Node.js у правильному порядку?
Правильна відповідь: timers → pending callbacks → poll → check → close callbacks
Timers виконує колбеки
setTimeout/setInterval, poll чекає на ввід-вивід і виконує його колбеки, check -setImmediate, close - подіїclose. Кроку render немає: це поняття браузера. - Чим небезпечні рекурсивні виклики
process.nextTick?Правильна відповідь: Черга nextTick вичерпується повністю, перш ніж цикл продовжиться, тож нескінченні nextTick морять голодом ввід-вивід
Те саме стосується нескінченного ланцюжка мікрозадач.
setImmediateдає event loop обробити ввід-вивід між ітераціями. - Що за замовчуванням обробляє пул потоків libuv?
Правильна відповідь: Операції файлової системи,
dns.lookup, частинуcrypto(як-отpbkdf2,scrypt) і роботуzlibМережеві сокети використовують асинхронні механізми ОС (epoll, kqueue, IOCP) і пул їм не потрібен. У пулі за замовчуванням 4 потоки, кількість задається через
UV_THREADPOOL_SIZE. - Обробник запиту 2 секунди виконує важкий для CPU цикл. Що відбувається з іншими запитами?
Правильна відповідь: Вони чекають: поки JavaScript працює в головному потоці, event loop не може обробляти нічого іншого
Виносьте важку роботу в
worker_threads, окремий сервіс або чергу задач, або розбивайте її на дрібні частини зsetImmediateміж ними.
Node.js · Senior
- Як організована купа V8 для збирання сміття?
Правильна відповідь: Молоде покоління (нові об'єкти, часто прибираються швидким scavenger) і старе покоління (довгоживучі об'єкти, прибираються mark-sweep-compact)
Більшість об'єктів гине молодими, тож часті дешеві scavenge їх швидко прибирають. Ті, що вижили, переходять у старе покоління, яке прибирається рідше й дорожче, хоча здебільшого конкурентно та інкрементально.
- Контейнер має 2 ГБ пам'яті, але процес Node.js падає з «JavaScript heap out of memory» десь на 1,4 ГБ. Що перевірити?
Правильна відповідь: Ліміт old space у V8: задати
--max-old-space-sizeпід контейнер, лишивши місце для Buffer і нативної пам'ятіНові версії Node.js визначають розмір купи за лімітом пам'яті контейнера, але купа - це не вся пам'ять: Buffer, нативний код і стеки потоків живуть поза нею. Лишайте запас.
- Який шаблон - класична причина витоку пам'яті в Node.js-сервері?
Правильна відповідь:
Mapна рівні модуля як кеш, який поповнюється на кожен запит і ніколи не очищуєтьсяУсе, що досяжне з об'єкта на рівні модуля, живе вічно. Використовуйте обмежений LRU-кеш із TTL,
WeakMapз ключами-об'єктами або зовнішній кеш, як-от Redis. - Як знайти, що саме витікає в процесі Node.js?
Правильна відповідь: Зробити кілька знімків купи з інтервалом (
v8.writeHeapSnapshot()або DevTools) і порівняти, кількість яких об'єктів постійно зростаєРежим порівняння показує об'єкти, створені між знімками, а шляхи утримувачів - що тримає їх живими.
--heapsnapshot-near-heap-limitможе зробити знімок прямо перед падінням.
Задачі на код
Напишіть рішення просто в браузері - тести перевірять його одразу. Класика співбесід на JavaScript (debounce, deepClone, Promise.all, LRU-кеш) і на React: компоненти й хуки на кшталт списку справ, вкладок, useDebounce та useInterval.
Відкрити задачі →