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

Настоящий JavaScript

前往频道在 Telegram

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

显示更多
6 300
订阅者
-1224 小时
+647
+7230
吸引订阅者
六月 '26
六月 '26
+102
在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个频道中
日期
订阅者增长
提及
频道
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-разработчика Зарплата стоит, скучные задачи день за днем, календарь забит созвонами, которые не влияют во
День сурка frontend-разработчика Зарплата стоит, скучные задачи день за днем, календарь забит созвонами, которые не влияют вообще ни на что. Откликаешься на вакансии, а в ответ тишина либо какие-то мутные конторы. На собесах вместо нормальной оценки навыков цирк с алгоритмами на скорость, как будто ты на олимпиаде, а не работу ищешь. И самое неприятное, пока ты варишься в этом болоте, кто-то спокойно проходит собесы и уходит в Яндекс, VK или на хорошую Валютную удаленку без лишней драмы.
Есть классные проекты и сильные команды, где разработчиков действительно ценят, дают расти, поддерживают развитие и платят достойно и ты можешь туда попасть!
👋 Меня зовут Тихон, привет! Я — действующий Frontend-разработчик и ментор. Я за руку довожу до оффера на хорошую позицию в Big Tech и сопровождаю на испытательном сроке. Также из учеников я собираю комьюнити, где уже более 220 frontend-разработчиков🫂 А в своем канале: 👉Объясняю, как проходить HR-фильтр и превращать отклики в реальные приглашения 👉Помогаю найти мотивацию, борюсь убеждениями, которые мешают развиваться 👉На примерах объясняю, как проходить собеседования, включая техничку 👉Разбираю резюме и делюсь лайфхаками, например как аккуратно “пинговать” рекрутеров А еще регулярно публикую полезные материалы: ▪️Задачи, на которых валяться кандидаты ▪️База по микрофронтам ▪️Подборка из 100+ каналов с вакансиями для разработчиков ▪️100 вопросов, которые точно помогут тебе на собеседовании ▪️Чек лист проверки своего резюме А еще у меня множество успешных кейсов и отзывов, найти их можно в канале. Реклама, erid: 2W5zFJeWaNd ИП Галактионов Тихон Витальевич, ИНН 771618975809

2
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 и очистка ресурсов.
134
3
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, а не две сгенерированные копии реализации.
213
4
Совет на ближайшие годы — изучайте ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запуск
Совет на ближайшие годы — изучайте ВАЙБ-КОДИНГ ИИ уже пишет код, чинит баги, генерирует тесты, документацию и помогает запускать продукты быстрее, чем это делали классические команды разработки. И это уже не "будущее когда-нибудь", а реальность, которая меняет рынок уже сегодня И те, кто научится вайбкодить сейчас, будут увереннее конкурировать на рынке и зарабатывать больше тех, кто по-прежнему делает всё вручную. Стартовать с нуля поможет канал Вайб-кодинг. Там ребята круглосуточно мониторят более 320 российских и зарубежных источников и публикуют только главное: релизы, инструменты, гайды, курсы и практические кейсы. Подписывайтесь, нас уже 45 тысяч: @vibecoding_tg
241
5
⁣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, но не размывает явные границы бизнес-логики.
260
6
АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ сборник курсов, инструментов и книг Проект «TERMINAL» стал крупнейшей библиотекой бесплатного о
АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ сборник курсов, инструментов и книг Проект «TERMINAL» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны курсы, книги, полезные инструменты и практические тренажёры для всех разработчиков 🎓 Практические курсы и задания 🪽 Книги и статьи известных авторов 😮‍💨 Полезные инструменты и ресурсы 🌟 IT-новости и инсайды Обучение по всем направлениям: SQL, Python, Frontend, PHP, C++, Golang, GIT, Linux, QA, Java, Vibe-coding, Infosec и др. Ценишь знания, подпишись: Terminal_tg
281
7
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 на краю системы.
315
8
Нейросети, IT и AI — в одной папке 💬 С коллегами собрали новые каналы про: 💠 промпты для нейросетей и готовые решения 💠 AI
Нейросети, IT и AI — в одной папке 💬 С коллегами собрали новые каналы про: 💠 промпты для нейросетей и готовые решения 💠 AI-фотосессии, генерация изображений и контента 💠 новости искусственного интеллекта без лишнего шума 💠 применение AI в работе, бизнесе и повседневной жизни 💠 Python, JavaScript, Data Science и системный анализ 💠 вакансии и возможности для специалистов в IT Посмотреть и подписаться тут 👉 https://t.me/addlist/c_rbhnzprbAwMmFi 💌 Добавить свой канал в папку
284
9
Страшная тайна российского айти ✖️ xCode Journal
Страшная тайна российского айти ✖️ xCode Journal
430
10
Хватит гадать — DeepSeek за тебя уже всё решил 🐳 * Сейчас все только про Claude, но я перешёл на DeepSeek и не жалею. Беспла
Хватит гадать — DeepSeek за тебя уже всё решил 🐳 * Сейчас все только про Claude, но я перешёл на DeepSeek и не жалею. Бесплатно, контекст 1 млн токенов — закинул целую книгу, помнит всё. Код пишет отлично, а рассуждения (Reasoning) выдают логику, как у архитектора. Решил протестировать агентский режим на задаче, которую вечно откладывал — собрать чистое инфополе с нуля. Чтобы не перебирать паблики вручную, зашёл через функцию похожих каналов в Telegram. Скормил DeepSeek ссылки на качественных авторов по IT и AI, которых читаю сам, и попросил проанализировать сотни рекомендаций. Агент изучил контент на каналах и оставил только тех, кто делится практическим опытом по: AI-воркфлоу, автоматизации, вайб-кодингу, промт-инжинирингу, RAG-syst. нейрогенерации и др. DeepSeek собрал полезную подборку экспертов в одну папку. Делюсь списком — внутри только полезный контент про IT & AI. 🔗Забирай в один клик: 👉 https://t.me/addlist/FYyQj91I8jJiMzg0
376
11
⁣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 — это действительно мощная фича. Главное — вовремя остановиться и не превратить типы в отдельный язык программирования.
406
12
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в T
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram @jobs_js_fronted для фронтов @jobs_js_back для бека Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
320
13
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в T
Стажировки и вакансии для JavaScript разработчиков - Вакансии которых нет на джоб-агрегаторах - Только прямые контакты HR в Telegram @jobs_js_fronted для фронтов @jobs_js_back для бека Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
235
14
Привет, друзья! Собрали с коллегами новую папку с каналами Здесь AI-новости, нейросети, полезные инструменты, примеры внедрен
Привет, друзья! Собрали с коллегами новую папку с каналами Здесь AI-новости, нейросети, полезные инструменты, примеры внедрения ИИ в крупный бизнес, разработка, JS, Node.js, frontend, QA, Data Science, кибербезопасность и IT-вакансии. Посмотреть и подписаться можно тут 👉 https://t.me/addlist/XttiKDt6lhUwMzEy 💌 записаться в папку
275
15
На Stepik запустили мощный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем» В программе только важны
На Stepik запустили мощный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем» В программе только важные аспекты: — troubleshooting Docker и образов — диагностика сетевых проблем — настройка readiness/liveness probes — отладка pod’ов, деплоев и ingress — анализ логов контейнеров и кластера — разбор ошибок CrashLoopBackOff, OOMKilled, ImagePullBackOff и других Собеседования на DevOps/SRE сейчас всё чаще строятся вокруг реальных инцидентов. Данный курс фокусируется именно на таких сценариях и помогает в подготовке к практическим вопросам 48 часов доступен со скидкой 25% ↗️ Пройти курс на Stepik
339
16
⁉️ Устал искать интересные каналы с новостями про искусственный интеллект? 📁 СОХРАНИ СЕБЕ ЧТОБЫ НЕ ПОТЕРЯТЬ В этой папке соб
⁉️ Устал искать интересные каналы с новостями про искусственный интеллект? 📁 СОХРАНИ СЕБЕ ЧТОБЫ НЕ ПОТЕРЯТЬ В этой папке собраны каналы про ИИ, которые помогают быстрее разобраться в сфере, находить идеи и экономить время на поиске информации. 😏 ЗАБИРАЙ ПАПКУ ТУТ ⏰ Папка действует 72 часа. 🤩 Организаторы: Green.Papka
826
17
🤣 Инновации подъехали, забирайте ✖️ xCode Journal
🤣 Инновации подъехали, забирайте ✖️ xCode Journal
789
18
Кошмар вайбкодера ✖️ xCode Journal
Кошмар вайбкодера ✖️ xCode Journal
1 120
19
⁣CSP, CORS и security headers — что фронтендер обязан понимать глубже Принято считать, что безопасность — это зона бэкенда. Фронтенд «просто отправляет запросы и рендерит UI». На практике фронтенд напрямую влияет на то, будет приложение безопасным или нет. CORS — это не про «разрешить запрос» CORS часто воспринимают как настройку: «чтобы запросы не падали из браузера». Но по сути это механизм, который говорит: кто имеет право читать ответ. Важно понимать: 👉 сервер может обработать запрос 👉 но браузер может не дать прочитать ответ Именно поэтому: 👉 Access-Control-Allow-Origin: * — не «фикс», а потенциальная дыра 👉 credentials + wildcard — запрещённая комбинация CORS — это про контроль доступа, а не про обход ошибок. CSP — ваш последний рубеж Content Security Policy — это защита от XSS, даже если у вас уже есть уязвимость. Пример: Content-Security-Policy: default-src 'self'; script-src 'self' Что это даёт: 👉 запрещает выполнение inline-скриптов 👉 блокирует загрузку скриптов с чужих доменов 👉 режет целый класс атак Но есть нюанс. Если CSP выглядит так: script-src * 'unsafe-inline' 'unsafe-eval' Это не защита. Это иллюзия. Security headers, которые реально важны 👉 X-Content-Type-Options: nosniff Браузер не пытается угадать тип файла. Меньше атак через подмену. 👉 X-Frame-Options / frame-ancestors Защита от clickjacking. 👉 Strict-Transport-Security (HSTS) Принудительный HTTPS. Без вариантов. 👉 Referrer-Policy Контроль того, какие данные уходят при переходах. Где фронтендер влияет напрямую 👉 какие скрипты подключаются 👉 есть ли inline JS 👉 используются ли eval-подобные вещи 👉 как работают сторонние виджеты 👉 как обрабатываются пользовательские данные Можно иметь идеальный бэкенд и сломать всё на уровне UI. Частая ошибка «Мы включили CSP — значит всё ок». Но: 👉 нет nonce / hash 👉 разрешены любые источники 👉 подключены сторонние скрипты без контроля В итоге защита есть только на бумаге. Главная мысль CSP, CORS и заголовки — это не чекбокс в настройках. Это часть архитектуры. Если фронтенд не понимает, как они работают, безопасность становится случайностью.
810
20
ТВОЙ БУСТ В IT И AI Собрали с коллегами обновленную папку с каналами, которые реально прокачивают навыки и дают актуальные ин
ТВОЙ БУСТ В IT И AI Собрали с коллегами обновленную папку с каналами, которые реально прокачивают навыки и дают актуальные инструменты: + IT-направления: системный анализ, Python, JavaScript, frontend, тестирование + технологии и инструменты: всё, что ускоряет работу и рост в IT + AI для карьеры и бизнеса: как использовать нейросети, чтобы зарабатывать + обзор нейросетей: что сейчас работает и что стоит изучать + промты: готовые решения + логика создания своих подписаться🎁 https://t.me/addlist/uyDjlf_VhiNjNWNi 💌 записать свой канал в папку тут
0