ch
Feedback
Настоящий JavaScript

Настоящий JavaScript

前往频道在 Telegram

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

显示更多
6 295
订阅者
-224 小时
+707
+6530
吸引订阅者
六月 '26
六月 '26
+103
在0个频道中
五月 '26
+384
在0个频道中
Get PRO
四月 '26
+83
在0个频道中
Get PRO
三月 '26
+71
在0个频道中
Get PRO
二月 '26
+23
在0个频道中
Get PRO
一月 '26
+18
在0个频道中
Get PRO
十二月 '25
+13
在0个频道中
Get PRO
十一月 '25
+24
在0个频道中
Get PRO
十月 '25
+22
在0个频道中
Get PRO
九月 '25
+21
在0个频道中
Get PRO
八月 '25
+20
在0个频道中
Get PRO
七月 '25
+38
在0个频道中
Get PRO
六月 '25
+52
在0个频道中
Get PRO
五月 '25
+121
在0个频道中
Get PRO
四月 '25
+88
在0个频道中
Get PRO
三月 '25
+363
在20个频道中
Get PRO
二月 '25
+30
在0个频道中
Get PRO
一月 '25
+38
在0个频道中
Get PRO
十二月 '24
+41
在0个频道中
Get PRO
十一月 '24
+64
在2个频道中
Get PRO
十月 '24
+70
在1个频道中
Get PRO
九月 '24
+84
在2个频道中
Get PRO
八月 '24
+70
在0个频道中
Get PRO
七月 '24
+115
在0个频道中
Get PRO
六月 '24
+89
在4个频道中
Get PRO
五月 '24
+101
在0个频道中
Get PRO
四月 '24
+121
在0个频道中
Get PRO
三月 '24
+132
在0个频道中
Get PRO
二月 '24
+101
在0个频道中
Get PRO
一月 '24
+86
在0个频道中
Get PRO
十二月 '23
+90
在0个频道中
Get PRO
十一月 '23
+16
在0个频道中
Get PRO
十月 '23
+15
在0个频道中
Get PRO
九月 '23
+16
在0个频道中
Get PRO
八月 '23
+24
在0个频道中
Get PRO
七月 '23
+35
在0个频道中
Get PRO
六月 '23
+20
在0个频道中
Get PRO
五月 '23
+15
在0个频道中
Get PRO
四月 '23
+264
在0个频道中
Get PRO
三月 '23
+17
在0个频道中
Get PRO
二月 '23
+207
在0个频道中
Get PRO
一月 '23
+40
在0个频道中
Get PRO
十二月 '22
+478
在0个频道中
Get PRO
十一月 '22
+1 627
在0个频道中
Get PRO
十月 '22
+45
在0个频道中
Get PRO
九月 '22
+451
在0个频道中
Get PRO
八月 '22
+459
在0个频道中
Get PRO
七月 '22
+1 991
在0个频道中
Get PRO
六月 '22
+1 567
在0个频道中
Get PRO
五月 '22
+1 769
在0个频道中
Get PRO
四月 '22
+97
在0个频道中
Get PRO
三月 '22
+2 701
在0个频道中
日期
订阅者增长
提及
频道
16 六月+1
15 六月+1
14 六月+2
13 六月+2
12 六月+11
11 六月+39
10 六月+24
09 六月+17
08 六月0
07 六月0
06 六月0
05 六月+2
04 六月0
03 六月0
02 六月+2
01 六月+2
频道帖子
🔍Тестовое собеседование с руководителем Frontend-разработки в этот четверг 18 июня(в четверг!) в 19:00 по мск приходи онлайн
🔍Тестовое собеседование с руководителем Frontend-разработки в этот четверг 18 июня(в четверг!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Frontend-разработчика. Как это будет: 📂 Виталий Черков, руководитель группы Frontend разработки с опытом 8+ лет, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Виталий будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Виталию Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Frontend-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_front_bot Реклама. О рекламодателе.

2
Web Locks API в браузере: cross-tab mutex для refresh token, миграций и защиты от гонок Когда одна сессия открыта в нескольки
Web Locks API в браузере: cross-tab mutex для refresh token, миграций и защиты от гонок Когда одна сессия открыта в нескольких вкладках, frontend, SPA, SSR-клиенты и SDK начинают делить auth state, storage и кэш. Частая ошибка - защищать refresh token только in-memory single-flight: между вкладками он не работает. Refresh token как критическая секция Если 5 вкладок одновременно получили 401, они могут отправить несколько refresh-запросов одним token, получить invalid_grant и перетереть свежие токены старыми. Web Locks API дает mutex на один origin: type Tokens = { accessToken: string; refreshToken: string; }; const LOCK = 'auth:refresh-token'; async function ensureAccessToken(): Promise<string> { return navigator.locks.request(LOCK, async () => { const latest: Tokens = await loadTokens(); if (!isExpiring(latest)) { return latest.accessToken; } const next = await refreshTokens(latest.refreshToken); await saveTokens(next); return next.accessToken; }); } Важный паттерн После входа в lock нужно перечитать storage. Пока вкладка ждала, другая уже могла обновить токены. Практический совет: внутри критической секции всегда делайте double-check precondition, а не запускайте refresh сразу после ожидания. Где еще полезно Web Locks хорошо ложится на миграции IndexedDB/localStorage, одноразовую инициализацию кэша, защиту записи в общий browser storage и координацию фоновых задач между вкладками. Ограничения Lock работает только в пределах origin. Это не distributed lock и не замена серверной идемпотентности. Критическая секция должна быть короткой; для сетевого refresh ставьте timeout. Если navigator.locks нет, нужен fallback через BroadcastChannel, storage lease или серверную защиту. Вывод: Web Locks API полезен там, где несколько вкладок делят runtime-состояние: он снижает риск гонок, но не отменяет серверные гарантии.
218
3
День сурка frontend-разработчика Зарплата стоит, скучные задачи день за днем, календарь забит созвонами, которые не влияют во
День сурка frontend-разработчика Зарплата стоит, скучные задачи день за днем, календарь забит созвонами, которые не влияют вообще ни на что. Откликаешься на вакансии, а в ответ тишина либо какие-то мутные конторы. На собесах вместо нормальной оценки навыков цирк с алгоритмами на скорость, как будто ты на олимпиаде, а не работу ищешь. И самое неприятное, пока ты варишься в этом болоте, кто-то спокойно проходит собесы и уходит в Яндекс, VK или на хорошую Валютную удаленку без лишней драмы. Есть классные проекты и сильные команды, где разработчиков действительно ценят, дают расти, поддерживают развитие и платят достойно и ты можешь туда попасть! 👋 Меня зовут Тихон, привет! Я — действующий Frontend-разработчик и ментор. Я за руку довожу до оффера на хорошую позицию в Big Tech и сопровождаю на испытательном сроке. Также из учеников я собираю комьюнити, где уже более 220 frontend-разработчиков🫂 А в своем канале: 👉Объясняю, как проходить HR-фильтр и превращать отклики в реальные приглашения 👉Помогаю найти мотивацию, борюсь убеждениями, которые мешают развиваться 👉На примерах объясняю, как проходить собеседования, включая техничку 👉Разбираю резюме и делюсь лайфхаками, например как аккуратно “пинговать” рекрутеров А еще регулярно публикую полезные материалы: ▪️Задачи, на которых валяться кандидаты ▪️База по микрофронтам ▪️Подборка из 100+ каналов с вакансиями для разработчиков ▪️100 вопросов, которые точно помогут тебе на собеседовании ▪️Чек лист проверки своего резюме А еще у меня множество успешных кейсов и отзывов, найти их можно в канале. Реклама, erid: 2W5zFJeWaNd ИП Галактионов Тихон Витальевич, ИНН 771618975809
229
4
Promise.withResolvers() в production: ручное завершение промисов без deferred-антипаттернов и утечек Promise.withResolvers()
Promise.withResolvers() в production: ручное завершение промисов без deferred-антипаттернов и утечек Promise.withResolvers() полезен на границе event-based API и async/await: WebSocket, Worker, IPC, SDK, API clients, Node.js-сервисы. Частая ошибка - считать его безопасной заменой любому deferred и хранить resolve/reject где попало. Что это даёт const { promise, resolve, reject } = Promise.withResolvers<T>(); Это тот же внешний resolve/reject, но без let, definite assignment и самодельного executor-шаблона. API стал чище, но lifecycle всё ещё ваша ответственность. Где применять * ожидание одного события; * bridge callback/event API в Promise; * request/response поверх WebSocket, Worker или IPC; * внутренняя очередь producer/consumer. Не стоит передавать resolve через слои, класть его в глобальное состояние или создавать promise без timeout/cancel path. Production-паттерн type Message = { id: string; payload: unknown }; type Waiter = { resolve: (m: Message) => void; reject: (e: Error) => void; timeout: ReturnType<typeof setTimeout>; }; const pending = new Map<string, Waiter>(); function waitForMessage(id: string, ms = 5000) { const { promise, resolve, reject } = Promise.withResolvers<Message>(); const timeout = setTimeout(() => { pending.delete(id); reject(new Error(Message timeout: ${id})); }, ms); pending.set(id, { resolve, reject, timeout }); return promise.finally(() => { clearTimeout(timeout); pending.delete(id); }); } Что важно У promise есть owner - waitForMessage(). Есть timeout, очистка через finally(), а resolve/reject не утекают наружу. Иначе Map будет удерживать замыкания, таймеры и payload. Практический совет: если у вызывающего кода есть свой lifecycle, добавьте AbortSignal и снимайте listener в finally(). Вывод: Promise.withResolvers() стоит использовать только там, где явно определены owner, timeout/cancel path и очистка ресурсов.
204
5
Dual package hazard в ESM/CJS: conditional exports без двух копий singleton-состояния в одном Node.js-процессе Это важно для
Dual package hazard в ESM/CJS: conditional exports без двух копий singleton-состояния в одном Node.js-процессе Это важно для SDK, API clients, SSR, Node.js-сервисов и shared libraries. Частая ошибка - считать, что одинаковый TS-код в .mjs и .cjs даст общий runtime. Где ломается const cjs = require('@acme/sdk') const esm = await import('@acme/sdk') Если require попал в dist/index.cjs, а import - в dist/index.mjs, Node загрузит два разных модуля. Итог: * два singleton-инстанса * две registry/cache/map * разные подключения * сломанный instanceof * расходящееся состояние Рабочая схема Один runtime source of truth, второй формат - только фасад. Например, состояние живет в core.cjs, а ESM лишь импортирует его: // package.json "exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.mjs", "require": "./dist/core.cjs" } } // core.cjs const registry = new Registry() module.exports = { Registry, registry } // index.mjs import api from './core.cjs' export const Registry = api.Registry export const registry = api.registry export default api Теперь require и import смотрят на один singleton: cjs.registry === esm.registry // true cjs.Registry === esm.Registry // true Типичная ошибка Не делайте две независимые реализации: "import": "./dist/index.mjs", "require": "./dist/index.cjs" Если оба файла содержат состояние, hazard почти гарантирован. Conditional exports только маршрутизируют загрузку, но не объединяют объекты в памяти. Практический чеклист * закрывайте deep imports вроде @acme/sdk/dist/index.mjs * для каждого subpath, например @acme/sdk/cache, повторяйте ту же схему * для чистых функций риск ниже, для DI, логгеров, метрик, БД-клиентов и кэшей - критичен Вывод: Dual ESM/CJS-пакету нужен один общий runtime-модуль и фасадные entrypoint, а не две сгенерированные копии реализации.
250
6
Совет на ближайшие годы — изучайте ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запуск
Совет на ближайшие годы — изучайте ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запускать продукты быстрее, чем это делали классические команды разработки. И это уже не "будущее когда-нибудь", а реальность, которая меняет рынок уже сегодня И те, кто научится вайбкодить сейчас, будут увереннее конкурировать на рынке и зарабатывать больше тех, кто по-прежнему делает всё вручную. Стартовать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы. Подписывайтесь, нас уже 45 тысяч: @vibecoding_tg
269
7
⁣AsyncLocalStorage в Node.js: request-scoped контекст для логов, трассировки и транзакций без prop drilling В production это нужно в Node.js-сервисах, SSR, API integration и backend-for-frontend слоях, где requestId, traceId, tenant или транзакция должны проходить через async-код. Частая ошибка - протаскивать ctx через десятки методов или, наоборот, прятать в нём бизнес-состояние. Как это выглядит AsyncLocalStorage использует async_hooks и привязывает store к async execution flow: promise, timeout, I/O callback и большинству стандартных API Node.js. type Ctx = { requestId: string; traceId?: string; tx?: unknown }; const als = new AsyncLocalStorage<Ctx>(); app.use((req, _res, next) => { als.run({ requestId: req.headers['x-request-id']?.toString() ?? randomUUID(), traceId: req.headers.traceparent?.toString(), }, next); }); const getCtx = () => als.getStore(); function logInfo(msg: string, meta = {}) { const c = getCtx(); logger.info({ requestId: c?.requestId, traceId: c?.traceId, ...meta, }, msg); } Теперь сервисный код не знает про HTTP middleware и req, но логи автоматически получают correlation metadata. Транзакции без протаскивания tx Для DB слоя можно делать withTransaction(), который запускает als.run({ ...ctx, tx }, fn), а getDbExecutor() возвращает ctx.tx ?? db. Trade-off хороший: меньше шума в API сервисов, но граница ответственности остаётся инфраструктурной, а не бизнесовой. Где границы * не заменяйте аргументы функции: бизнес-данные передавайте явно; * не кладите в store req, res, большие payload или ORM graph; * context не пересекает process boundary: worker threads, очереди, cron jobs и другие сервисы требуют явной передачи ids; * нестандартные callback-based библиотеки могут разорвать async chain. Практическое правило: используйте AsyncLocalStorage для логов, tracing, tenant/user metadata, аудита и текущей транзакции, а не для скрытого глобального состояния. Вывод: AsyncLocalStorage полезен, когда request-scoped инфраструктурный контекст улучшает observability и DX, но не размывает явные границы бизнес-логики.
290
8
АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ сборник курсов, инструментов и книг Проект «TERMINAL» стал крупнейшей библиотекой бесплатного о
АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ сборник курсов, инструментов и книг Проект «TERMINAL» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны курсы, книги, полезные инструменты и практические тренажёры для всех разработчиков 🎓 Практические курсы и задания 🪽 Книги и статьи известных авторов 😮‍💨 Полезные инструменты и ресурсы 🌟 IT-новости и инсайды Обучение по всем направлениям: SQL, Python, Frontend, PHP, C++, Golang, GIT, Linux, QA, Java, Vibe-coding, Infosec и др. Ценишь знания, подпишись: Terminal_tg
281
9
AbortSignal.any() и AbortSignal.timeout(): единая отмена fetch, таймеров и async-операций в production Promise.race([fetch(),
AbortSignal.any() и AbortSignal.timeout(): единая отмена fetch, таймеров и async-операций в production Promise.race([fetch(), timeout]) часто маскирует проблему: ждать перестали, но работа могла не остановиться. В SPA, SSR, Node.js-сервисах, SDK и API clients это приводит к висящим запросам, таймерам и retry/backoff ниже по стеку. Собирайте отмену вокруг AbortSignal AbortSignal.timeout(ms) сам отменится по таймауту. AbortSignal.any([...signals]) отменится, когда отменится любой входной signal. Так в один контракт попадают: * caller отменил операцию * истек timeout * клиент закрыл соединение * сервис уходит в graceful shutdown const shutdown = new AbortController(); async function loadUser(id: string, opts: { signal?: AbortSignal } = {}) { const signal = AbortSignal.any([ AbortSignal.timeout(1500), shutdown.signal, ...(opts.signal ? [opts.signal] : []), ]); signal.throwIfAborted(); const res = await fetch(`https://api.example.com/users/${id}`, { signal }); await sleep(100, signal); // backoff тоже отменяем const data = await res.json(); signal.throwIfAborted(); return data; } Типичная ошибка Не останавливайтесь на fetch. Один и тот же signal стоит передавать в retry, polling, очереди, sleep/timer helpers и свои async-функции. Иначе верхний слой "отменился", а нижний продолжает держать ресурсы. Практические нюансы * AbortSignal одноразовый: если aborted === true, нужен новый controller или timeout * AbortSignal.any() - это fan-in, а не fan-out: он не отменяет исходные контроллеры * смотрите на reason: timeout часто дает TimeoutError, abort - AbortError или ваш reason * при обертках над setTimeout, stream, listener или socket чистите ресурсы при abort Вывод: Отмена должна быть частью контракта async-функции, а не локальным Promise.race на краю системы.
352
10
Нейросети, IT и AI — в одной папке 💬 С коллегами собрали новые каналы про: 💠 промпты для нейросетей и готовые решения 💠 AI
Нейросети, IT и AI — в одной папке 💬 С коллегами собрали новые каналы про: 💠 промпты для нейросетей и готовые решения 💠 AI-фотосессии, генерация изображений и контента 💠 новости искусственного интеллекта без лишнего шума 💠 применение AI в работе, бизнесе и повседневной жизни 💠 Python, JavaScript, Data Science и системный анализ 💠 вакансии и возможности для специалистов в IT Посмотреть и подписаться тут 👉 https://t.me/addlist/c_rbhnzprbAwMmFi 💌 Добавить свой канал в папку
284
11
Страшная тайна российского айти ✖️ xCode Journal
Страшная тайна российского айти ✖️ xCode Journal
467
12
Хватит гадать — DeepSeek за тебя уже всё решил 🐳 * Сейчас все только про Claude, но я перешёл на DeepSeek и не жалею. Беспла
Хватит гадать — DeepSeek за тебя уже всё решил 🐳 * Сейчас все только про Claude, но я перешёл на DeepSeek и не жалею. Бесплатно, контекст 1 млн токенов — закинул целую книгу, помнит всё. Код пишет отлично, а рассуждения (Reasoning) выдают логику, как у архитектора. Решил протестировать агентский режим на задаче, которую вечно откладывал — собрать чистое инфополе с нуля. Чтобы не перебирать паблики вручную, зашёл через функцию похожих каналов в Telegram. Скормил DeepSeek ссылки на качественных авторов по IT и AI, которых читаю сам, и попросил проанализировать сотни рекомендаций. Агент изучил контент на каналах и оставил только тех, кто делится практическим опытом по: AI-воркфлоу, автоматизации, вайб-кодингу, промт-инжинирингу, RAG-syst. нейрогенерации и др. DeepSeek собрал полезную подборку экспертов в одну папку. Делюсь списком — внутри только полезный контент про IT & AI. 🔗Забирай в один клик: 👉 https://t.me/addlist/FYyQj91I8jJiMzg0
376
13
⁣Variadic tuple types — сложные сигнатуры без боли До variadic tuple types многие сложные сигнатуры в TypeScript выглядели как наказание. Особенно: 👉 curry 👉 compose 👉 middleware 👉 typed event emitter 👉 любые функции с «прокинь аргументы дальше» Приходилось писать 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 — это действительно мощная фича. Главное — вовремя остановиться и не превратить типы в отдельный язык программирования.
470
14
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в T
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram @jobs_js_fronted для фронтов @jobs_js_back для бека Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
320
15
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в T
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram @jobs_js_fronted для фронтов @jobs_js_back для бека Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
235
16
Привет, друзья! Собрали с коллегами новую папку с каналами Здесь AI-новости, нейросети, полезные инструменты, примеры внедрен
Привет, друзья! Собрали с коллегами новую папку с каналами Здесь AI-новости, нейросети, полезные инструменты, примеры внедрения ИИ в крупный бизнес, разработка, JS, Node.js, frontend, QA, Data Science, кибербезопасность и IT-вакансии. Посмотреть и подписаться можно тут 👉 https://t.me/addlist/XttiKDt6lhUwMzEy 💌 записаться в папку
275
17
На Stepik запустили мощный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем» В программе только важны
На Stepik запустили мощный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем» В программе только важные аспекты: — troubleshooting Docker и образов — диагностика сетевых проблем — настройка readiness/liveness probes — отладка pod’ов, деплоев и ingress — анализ логов контейнеров и кластера — разбор ошибок CrashLoopBackOff, OOMKilled, ImagePullBackOff и других Собеседования на DevOps/SRE сейчас всё чаще строятся вокруг реальных инцидентов. Данный курс фокусируется именно на таких сценариях и помогает в подготовке к практическим вопросам 48 часов доступен со скидкой 25% ↗️ Пройти курс на Stepik
339
18
⁉️ Устал искать интересные каналы с новостями про искусственный интеллект? 📁 СОХРАНИ СЕБЕ ЧТОБЫ НЕ ПОТЕРЯТЬ В этой папке соб
⁉️ Устал искать интересные каналы с новостями про искусственный интеллект? 📁 СОХРАНИ СЕБЕ ЧТОБЫ НЕ ПОТЕРЯТЬ В этой папке собраны каналы про ИИ, которые помогают быстрее разобраться в сфере, находить идеи и экономить время на поиске информации. 😏 ЗАБИРАЙ ПАПКУ ТУТ ⏰ Папка действует 72 часа. 🤩 Организаторы: Green.Papka
826
19
🤣 Инновации подъехали, забирайте ✖️ xCode Journal
🤣 Инновации подъехали, забирайте ✖️ xCode Journal
823
20
Кошмар вайбкодера ✖️ xCode Journal
Кошмар вайбкодера ✖️ xCode Journal
1 120