Настоящий JavaScript (@true_js) — Telegram-канал | Telegram Dialogs
Все каналы
Настоящий JavaScript

Настоящий JavaScript

@true_js

6.1K подписчиков технологии

Тот самый канал по JavaScript. Личный блог автора - @just_genych По вопросам рекламы или разработки: @g_abashkin

Последние публикации

Настоящий 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 требует предварительной очистки строк и явного выделения только необходимых компонентов, иначе неявные ошибки и деградация производительности неизбежны.
Чат поддержки
Ответим здесь же, обычно быстро
Здравствуйте! Напишите ваш вопрос — оператор ответит в этом чате.