Frontender's notes [ru]
Ведущий канал о современном фронтенде: статьи, новости, практики, вайбкодинг и автоматизация фронта ИИ-агентами. Личный блог автора - @just_genych По вопросам рекламы или разработки - @g_abashkin
Больше📈 Аналитический обзор Telegram-канала Frontender's notes [ru]
Канал Frontender's notes [ru] (@frontendnoteschannel_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 32 513 подписчиков, занимая 4 228 место в категории Технологии и приложения и 20 097 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 32 513 подписчиков.
Согласно последним данным от 09 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -173, а за последние 24 часа — -3, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 8.57%. В первые 24 часа после публикации контент обычно набирает 6.01% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 2 785 просмотров. В течение первых суток публикация набирает 1 955 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 22.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как браузер, api, css, интерфейс, загрузка.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Ведущий канал о современном фронтенде: статьи, новости, практики, вайбкодинг и автоматизация фронта ИИ-агентами.
Личный блог автора - @just_genych
По вопросам рекламы или разработки - @g_abashkin”
Благодаря высокой частоте обновлений (последние данные получены 10 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
Приходилось писать overload на overload и дублировать типы вручную.Как было раньше Обычно появлялись: 👉 overload на overload 👉 ручные tuple-типы 👉 тонны дублирования Типы быстро превращались в нечитаемую простыню. Что изменили variadic tuples С их появлением стало намного проще работать с остаточными аргументами на уровне типов. Например:
type Fn<T extends unknown[]> =
(...args: [...T]) => void
Или собирать сигнатуры:
type Append<Args extends unknown[], Arg> = [...Args, Arg]
Типы наконец научились нормально работать с «переменным количеством аргументов».Почему это важно На практике это одна из тех TS-фич, которые реально упростили жизнь библиотекам. Без variadic tuples: 👉 Redux middleware typings 👉 router APIs 👉 compose/curry utilities были бы ещё страшнее. Где начинается тёмная магия Проблемы начинаются, когда variadic tuples комбинируют с: 👉
infer
👉 recursive types
👉 conditional types
Типовая система очень быстро превращается в тёмный лес.IDE начинает тормозить, ошибки становятся нечитаемыми, а compile time — расти. Главная мысль Variadic tuple types — это действительно мощная фича.
Главное — вовремя остановиться и не превратить типы в отдельный язык программирования.
ECMAScript 2025 (ES2025) разработчики получили возможность напрямую импортировать JSON-файлы как модули в JavaScript-коде. Это упрощает работу с конфигурационными данными и другими статическими ресурсами, представленными в формате JSON.
Синтаксис импорта JSON-модулей
Для импорта JSON-файла используется ключевое слово import с указанием атрибута with { type: 'json' }. Это гарантирует, что импортируемый файл будет обработан как JSON-модуль.
Пример использования
Рассмотрим пример импорта конфигурационного файла config.json и обращения к его свойствам в коде.
import config from './config.json' with { type: 'json' }; .log(config.apiUrl); // Выводит значение свойства apiUrl из config.json console.log(config.timeout); // Выводит значение свойства timeout из config.json❗️Добавление поддержки импорта JSON-файлов как модулей в
ES2025 упрощает работу с данными в формате JSON, делая код более чистым и понятным.
Источники
JSON Modules Can Now Be Imported in JavaScript in All Modern Browsers, CSS Modules to Follow.
New Features in ES2025 – BooleanBuffer.Особенно когда начинаются рекурсивные типы.Например: 👉 глубокий
DeepPartial
👉 парсинг строк на уровне типов
👉 сложные conditional types
👉 infer внутри infer
На маленьком примере всё работает.
В реальном проекте IDE внезапно начинает думать по 5 секунд.Почему так происходит TypeScript не вычисляет типы «бесплатно». Каждый: 👉 conditional type 👉 union 👉 recursive шаг нужно реально посчитать. А если тип разворачивается слишком глубоко, компилятор упирается в лимиты. Отсюда знакомое:
Type instantiation is excessively deep and possibly infinite
И это не всегда баг TypeScript.Часто это сигнал, что типовая модель стала слишком умной. Где обычно всё ломается Особенно опасны: 👉 рекурсивные mapped types 👉 огромные union’ы 👉 type-level parser’ы 👉 deeply nested generics 👉 utility types поверх utility types
Типы начинают взрываться комбинаторно.Что обычно помогает 👉 не делать type-level акробатику без нужды 👉 ограничивать глубину рекурсии 👉 разбивать типы на более простые 👉 добавлять явные промежуточные типы 👉 не тащить сложные generic-типы в публичный API Почему это важно Сложные типы бьют не только по компиляции. Они ухудшают: 👉 autocomplete 👉 responsiveness IDE 👉 читаемость кода 👉 onboarding новых людей
Иногда самый дорогой runtime — это compile time.Главная мысль Хороший TypeScript — это не когда типы поражают воображение.
Хороший TypeScript — это когда их можно понять через полгода, а IDE при этом не превращается в обогреватель.
isolatedDeclarations.
Он нужен не для красоты типов, а для скорости.Проблема простая: в больших monorepo генерация
.d.ts
может становиться узким местом.
TypeScript часто должен анализировать соседние файлы,
чтобы понять, какие декларации вывести.
На маленьком проекте это почти незаметно.
На большом — начинает болеть.Что делает isolatedDeclarations
isolatedDeclarations заставляет писать код так,
чтобы декларации можно было генерировать
по файлам независимо.
Из-за этого TypeScript чаще требует явные типы.
Было:
export function getUser() {
return { id: 1, name: 'Alex' }
}
Лучше так:
type User = {
id: number
name: string
}
export function getUser(): User {
return { id: 1, name: 'Alex' }
}
Меньше магии для компилятора — быстрее и предсказуемее сборка.Почему это важно Когда проект растёт: 👉 TypeScript начинает сильнее зависеть от соседних файлов 👉 инкрементальная сборка замедляется 👉 генерация типов становится дорогой
Изоляция помогает компилятору работать параллельно и проще.Где это особенно полезно 👉 большие monorepo 👉 библиотеки 👉 project references 👉 параллельная сборка 👉 CI, где каждая минута стоит денег Главный trade-off Ты немного платишь: 👉 более явными типами 👉 меньшим type inference 👉 дополнительным boilerplate Но взамен получаешь: 👉 более быстрые сборки 👉 стабильный compile pipeline 👉 меньше скрытой сложности Главная мысль
Это хороший пример взрослого engineering trade-off: чуть больше явности в коде ради скорости и предсказуемости системы.
@starting-style.
Он решает старую проблему: анимацию появления элемента, который только что добавили в DOM.Раньше для этого обычно: 👉 делали
setTimeout
👉 дёргали классы через JS
👉 ловили reflow-хаки
Теперь можно нативно:
.modal {
opacity: 1;
transition: opacity .2s;
}
@starting-style {
.modal {
opacity: 0;
}
}
Элемент появляется сразу с анимацией. Без двойного рендера и JS-костылей.Почему это важно Раньше браузер не успевал увидеть начальное состояние элемента. Из-за этого приходилось: 👉 форсить reflow 👉 откладывать изменение класса 👉 городить лишнюю логику Теперь CSS сам понимает: 👉 с какого состояния начинать transition Где особенно полезно 👉
dialog
👉 popover
👉 conditional rendering
👉 enter animations в UI
Почему это ощущается приятно
Анимации становятся:
👉 чище
👉 предсказуемее
👉 без лишнего JS
CSS постепенно забирает себе всё, что раньше приходилось городить через JavaScript.
Promise.withResolvers().
Штука маленькая, но код с Promise реально становится чище.Раньше обычно писали так:
let resolve
let reject
const promise = new Promise((res, rej) => {
resolve = res
reject = rej
})
Работает,
но выглядит странно.
Особенно это:
«вынесем resolve наружу»Теперь можно нормально:
const { promise, resolve, reject } =
Promise.withResolvers()
👉 без лишнего конструктора
👉 без мутаций переменных
👉 без промежуточного boilerplate
Где это особенно полезно
👉 очереди
👉 event-based логика
👉 deferred pattern
👉 кастомные async abstractions
Почему это приятно
Раньше приходилось:
👉 создавать Promise вручную
👉 тащить resolve/reject наружу
👉 писать шаблонный код снова и снова
Теперь API делает это нативно.
Мелочь, а ощущается как функция, которая давно должна была появиться.
useState достаточно
👉 зачем усложнять
👉 у нас же «просто форма»
Проблема в том, что «простой state» очень быстро перестаёт быть простым.Почему обычный state начинает ломаться Пока состояний мало — всё выглядит нормально:
const [loading, setLoading] = useState(false)
const [error, setError] = useState(null)
const [success, setSuccess] = useState(false)
Но потом появляются вопросы:
👉 может ли быть одновременно loading и success?
👉 что делать при retry?
👉 можно ли отправить форму повторно?
👉 что если запрос отменился?
Количество комбинаций начинает расти взрывным образом.В чём идея state machine State machine заставляет явно описывать: 👉 какие состояния существуют 👉 какие переходы между ними разрешены Например:
idle → loading → success idle → loading → error error → loading
Невалидные состояния просто невозможно получить.Почему это мощно Логика становится предсказуемой Вместо набора флагов — у тебя конечный автомат. Не: 👉
loading = false
👉 success = true
👉 error = ???
А:
👉 приложение находится в состоянии success
Меньше impossible states
Обычный state легко приводит к странным комбинациям:
👉 loading + error
👉 success + loading
👉 success без данных
State machine убирает целый класс багов.Проще масштабировать Когда сценариев становится больше: 👉 retries 👉 optimistic updates 👉 multi-step flows 👉 async transitions обычный state начинает разваливаться. FSM переносит сложность из хаоса в структуру. Но есть trade-off State machine — это дополнительная абстракция. Для: 👉 modal с двумя состояниями 👉 простого toggle 👉 маленького local state это может быть overengineering. Где state machine особенно полезна 👉 формы с несколькими шагами 👉 async flows 👉 onboarding 👉 complex UI states 👉 websocket / realtime UI 👉 payment flows Там, где логика переходов важнее самих данных. Главная мысль Проблема обычного state не в том, что он плохой.
А в том, что набор boolean-флагов не масштабируется вместе со сложностью UI.State machine — это способ сделать сложные состояния явными и контролируемыми.
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
