Н
Настоящий JavaScript
17.07.2026 15:43 · 👁 101
И вы знаете
Поэтому просто ещё раз обозначим, что промокод NETSIL скинет 5000 рублей при бронировании жилья на Яндекс Путешествиях.
Забронировать
#реклама
travel.yandex.ru
О рекламодателе
Н
Настоящий JavaScript
17.07.2026 13:07 · 👁 149
Point0 — tRPC на стероидах, только без выноса мозга
Смотрю на Point0 и tRPC, и да, есть за что зацепиться. Квери и мутации в Point0 выглядят почти так же, как в tRPC, по ощущениям от разработки. Но вот фишка в том, что Point0 — это фреймворк, а не библиотека. А значит, у него есть суперсилы, которые библиотеке даже не снились.
Что он умеет:
— Квери и серверный код можно объявлять прямо в клиентских файлах. Или наоборот.
— При SSR автоматом гидрирует и дегидрирует квери на клиенте.
— В мутациях сам превращает файлы в FormData и обратно — без лишних телодвижений.
— У каждой квери и мутации стабильный личный URL.
— Редактор кода не тормозит, когда эндпоинтов становится дофига.
— С сервера на клиент прилетают целые серверные компоненты или интерактивные острова.
— Состояниями загрузки на страницах и в компонентах можно рулить прямо.
Это не всё, что умеет Point0, остальное — в других статьях. А пока фокус на сравнении с tRPC. Читать дальше
👉 JS
Н
Настоящий JavaScript
17.07.2026 09:07 · 👁 161
Map.groupBy в production: неожиданные мутации групповых ключей и утечки памяти при использовании Symbol-ключей с WeakRef
Map.groupBy удобен для временной группировки, но в production легко наткнуться на два подводных камня, о которых документация умалчивает. Ошибки связаны с мутабельностью ключей и сборкой мусора при использовании Symbol.
Проблема 1: Мутация групповых ключей
Когда ключи группировки — объекты, Map.groupBy возвращает Map, где ключи — ссылки на те же объекты. Любое изменение исходного объекта ломает соответствие в группах. Например, сгруппировали пользователей по объекту с ролью, а потом поменяли роль — grouped.get(тот же объект) покажет старые данные.
const users = [{role: 'admin'}];
const grouped = Map.groupBy(users, u => u.role);
users[0].role = 'guest'; // мутация
grouped.get('guest'); // undefined, ключ 'admin' остался
Совет: используй только строки, числа или копии объектов, либо заморозь объекты через Object.freeze перед groupBy.
Проблема 2: Утечка памяти с Symbol-ключами и WeakRef
Symbol уникален и живёт, пока есть хоть одна ссылка. Если использовать Symbol как ключ в Map.groupBy, а потом потерять внешнюю ссылку — Symbol остаётся в Map, память не освобождается. WeakRef на Symbol не работает как слабая ссылка, так как Symbol не является объектом.
const key = Symbol('temp');
const grouped = Map.groupBy([1], () => key);
// ключ утечёт, даже после удаления внешней ссылки
Ошибка: полагаться на WeakRef для Symbol-ключей в production. Выход — использовать WeakMap с объектными ключами для краткосрочной группировки, либо явно чистить Map через delete.
Вывод: Map.groupBy в production требует контроля над мутациями ключей и управления памятью через примитивные ключи или явную очистку, иначе рискуешь получить неконсистентные данные и утечки.
Н
Настоящий JavaScript
17.07.2026 06:43 · 👁 175
Яндекс Музыка до 360 дней бесплатно
Яндекс Музыка для вас и 3-х ваших близких.
Кинопоиск и Яндекс Книги тоже в мультиподписке Плюс.
Попробуйте бесплатно❤️
Слушать
#реклама 18+
music.yandex.ru
О рекламодателе
Н
Настоящий JavaScript
16.07.2026 17:07 · 👁 194
Команда Далее раскатала историю: взяли тупую игрушку-тренажер по кибербезопасности и выкатили из нее самостоятельный продукт. Три отдельные консоли, редактор сценариев, боты для проверки и аудиочат на WebRTC — всё прикрутили.
Подробности на Хабре: Читать далее
👉 JS
Н
Настоящий JavaScript
16.07.2026 14:43 · 👁 195
Митап DataLens про BI и AI
23 июля обсудим реальные сценарии BI для крупных компаний. Встречаемся офлайн в Москве.
📊 В программе:
• облачная аналитика, on-premises и гибридные архитектуры;
• внедрение DataLens в закрытом контуре;
• GenAI и AI-агенты для аналитики;
• кейсы Lamoda, Skyeng и финансового сектора;
• дискуссия о том, почему AI в BI не всегда даёт ожидаемый эффект.
Для BI-лидов, архитекторов, CDO и владельцев BI-платформ.
Регистрируйтесь на сайте
Зарегистрироваться
#реклама 16+
yandex.cloud
О рекламодателе
Н
Настоящий JavaScript
16.07.2026 13:07 · 👁 168
Atomics.pause() в спин-локах: когда хинт процессору превращается в баг кэш-когерентности
На первый взгляд, Atomics.pause() выглядит как безобидная микро-оптимизация: подсказываем процессору, что поток в спин-локе, и он сам оптимизирует кэш. В production с Worker-пулами на 8+ потоках и SharedArrayBuffer эта иллюзия разбивается о когерентность кэша и деградацию производительности.
Ложное пробуждение и протокол MESI
Atomics.pause() не даёт реальной задержки — процессор просто крутит микро-циклы. Когда десяток воркеров висят на Atomics.load() с прикрученным pause(), протокол когерентности (MESI) начинает бешено спамить состоянием Shared->Invalid. Кэш-промахи растут, latency скачет до 100 микросекунд. Типичная ошибка: думать, что pause() автоматически синхронизирует кэш — это не так, он лишь сообщает планировщику о намерении.
Дедлоки из-за локального кэша
Если пишешь цикл спин-лока только через Atomics.load() + pause(), без Atomics.wait(), то длительность паузы неопределённая. Поток может застрять на устаревшем значении в локальном L1-кэше из-за отсутствия барьера памяти. Пример из практики: в API-клиенте с shared очередь запросов на Node.js подняли буст, но через 30 секунд 25% запросов ушли в таймаут — поток просто не видел обновлённый флаг.
while (Atomics.load(flag, 0) !== DONE) {
Atomics.pause(); // баг: нет гарантии выхода
// счётчик ложноных выходов растёт
}
Практический совет: ограничь число итераций. Первые 10 — один pause(), до 100 — два, потом — Atomics.wait() с таймаутом. Иначе спин-лок съедает все такты ЦП.
NUMA-архитектуры и прыжки задержки
На AMD EPYC или Intel Xeon каждый pause() триггерит инвалидацию L1/L2, затем обновление через QPI или Infinity Fabric. Задержка скачет в 10-100 раз. В Worker-пуле, разбросанном по разным ядрам, это убивает пропускную способность. Решение — привязка воркеров к сокету через navigator.hardwareConcurrency (браузер) или os.setPriority (Node.js) с группировкой по архитектуре.
Предупреждение: не используй Atomics.pause() сам по себе в высоконагруженных пулах — это прямая дорога к деградации кэша и скачкам памяти. Тестируй под конкретный процессор.
Вывод: Atomics.pause() — это хинт, а не панацея, и в реальных спин-локах без комбинации с экспоненциальным backoff и Atomics.wait() он приносит больше вреда, чем пользы.
Н
Настоящий JavaScript
16.07.2026 09:07 · 👁 193
npm 12, TypeScript 7, и Bun на Rust
Зарелизили npm 12 — теперь скриптовые жизненные циклы выключены по дефолту. Это реально жирный апдейт, куча breaking-изменений. Лучше перед тем, как обновляться, воткнуть версию 11.18.0.
TypeScript 7.0 наконец-то дополз до финала: компилятор на Go реально шустрее — «в 10 раз быстрее». Но полного API пока нет, так что многим советуют сидеть на версии 6.0.
Автор Bun рассказал, как переписал свой JavaScript-рантайм с Zig на Rust. В процессе участвовала куча инстансов Claude Code, а API-доллар улетело ~$165k. Rust-версия станет базой для Bun 1.4, её ждут со дня на день.
Остальное: в выпуске #794.
👉 JS
Н
Настоящий JavaScript
16.07.2026 06:43 · 👁 198
Работа на Вашем авто в Яндекс Такси. Оставьте заявку!
Таксопарк «Свои» - федеральный партнер Яндекс.Такси.
Работаем круглосуточно, даже при ограничениях - мы в «белых списках». Подключаем без посещения офиса.
Большой выбор тарифов: для самозанятых и ИП, для физ. лиц.
Тарифы: Процентный 3%. Суточный 70₽. С заказа 10₽.
Максимальный приоритет.
Дополнительный заработок для водителей:
Еженедельные цели от таксопарка, а так же от Яндекс Такси за выполненные заказы - до 19000₽.
Бонус при подключении 300₽.
Доход за привлеченного друга.
Возможность подключения доставки.
Промокоды для водителей — уточняйте при подключении!
Предложение ограничено - оставьте заявку сейчас📱
Подать заявку
#реклама
taxi-svoi.ru
О рекламодателе
Н
Настоящий JavaScript
15.07.2026 13:07 · 👁 205
Temporal.PlainDate.from под нагрузкой: високосные секунды и таймзоны, о которых молчит спецификация
Парсинг ISO-строк через Temporal в high-load системах может стать источником неочевидных багов и деградации производительности. Особенно когда в production приходят данные от устаревших сенсоров, логов или внешних API с високосными секундами или произвольными часовыми поясами. Частая ошибка — использовать Temporal.PlainDate.from напрямую с полной строкой, не учитывая, что парсер тратит ресурсы на разбор сущностей, которые затем игнорирует.
Високосные секунды и скрытые ошибки
Спецификация Temporal требует, чтобы PlainDate игнорировал временную часть, но при наличии 23:59:60 в строке V8 может выбросить RangeError. В production на Node 20+ мы зафиксировали 15% рост ошибок при обработке логов GPS-датчиков, передающих 2024-06-30T23:59:60Z. При этом сама дата 2024-06-30 корректна.
// Ошибка: RangeError из-за високосной секунды
const date = Temporal.PlainDate.from("2024-06-30T23:59:60Z");
// Рабочий вариант: отсекаем время до парсинга
const safe = Temporal.PlainDate.from("2024-06-30");
Производительность парсинга с таймзонами
Когда строка содержит полный offset и идентификатор зоны вроде +05:30[Asia/Kolkata], PlainDate.from вынужден разбирать всю строку до конца, хотя результат — только дата. Профилирование в Node 22 показало: 40% времени тратится на парсинг timezone, который затем отбрасывается. При 50k RPS latency на один вызов растёт в 3.5x по сравнению с обрезкой строки.
Практические меры защиты
В production стоит внедрить два правила. Первое: всегда обрезать строку до даты перед передачей в PlainDate.from — str.split('T')[0] даёт стабильное ускорение. Второе: валидировать високосные секунды на входе, отлавливая поле 60 в секундах. Использовать PlainDate.from только с форматом YYYY-MM-DD, если не требуется временная точность.
Вывод: При высоких нагрузках парсинг дат через Temporal требует предварительной очистки строк и явного выделения только необходимых компонентов, иначе неявные ошибки и деградация производительности неизбежны.