
V8: скрытые классы и деоптимизация горячих функций
Функция, которую V8 уже скомпилировал в оптимизированный код, может внезапно вернуться к интерпретатору и потерять в скорости в разы. Разбираем, что провоцирует деоптимизацию и как её ловить.

Функция, которую V8 уже скомпилировал в оптимизированный код, может внезапно вернуться к интерпретатору и потерять в скорости в разы. Разбираем, что провоцирует деоптимизацию и как её ловить.

Горячий цикл на Node.js внезапно замедляется в разы после релиза, а профиль показывает время в интерпретаторе вместо JIT. Разбираем, как V8 деоптимизирует функции и что рушит скрытые классы первым.

Один процесс Node упирается в одно ядро и деградирует раньше, чем кончается CPU. Разбираем, что ломается первым при масштабировании через cluster и worker_threads и как это увидеть в метриках.

Один процесс Node.js использует одно ядро. Разбираем, когда спасает cluster, когда worker_threads, а когда ни то ни другое — и чем платите за каждый вариант.

Процесс Node растёт до 1,5 ГБ за сутки, потом падает с heap out of memory. Разбираем, как снять heap snapshot, найти удерживаемые объекты и закрыть типовые источники утечек.

Сервис держит 200 RPS, но при 800 latency p99 подскакивает с 40 мс до 3 секунд, хотя CPU не в потолке. Разбираем, как фазы event loop и очередь микрозадач превращаются в узкое место.

Рефакторинг одного условного типа сломал вывод в трёх местах, но компилятор молчал: код собирался. Разбираем, почему юнит-тесты не ловят такие регрессии и как покрыть типы тестами.

TypeScript проверяет типы на этапе компиляции, но JSON из сети приходит в рантайме и типам не подчиняется. Разбираем, чем и как валидировать данные на входе, во что это обходится по размеру бандла и производительности.

Вы подключаете JS-библиотеку, а TypeScript ругается на отсутствие типов. Разбираем четыре способа дать типы: @types, встроенные .d.ts, свой файл объявлений и module augmentation — с ценой каждого.

Перевод живого JavaScript-проекта на TypeScript почти никогда не идёт по инструкции из README. Разбираем стратегии, цену strict-режима и места, где типизация ломается о реальный код.

Флаг strict превращает молчаливые баги в ошибки компиляции, но включить его в проекте на 200 файлов одним махом нельзя. Разбираем, что делает каждый под-флаг и как мигрировать постепенно.

Partial, Pick, Omit и Record выглядят удобно, но легко превращают типы в мусор. Разбираем, где встроенные утилиты помогают, а где скрывают ошибки и ломают вывод типов.