Настоящий 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-разработчика
Зарплата стоит, скучные задачи день за днем, календарь забит созвонами, которые не влияют вообще ни на что.
Откликаешься на вакансии, а в ответ тишина либо какие-то мутные конторы. На собесах вместо нормальной оценки навыков цирк с алгоритмами на скорость, как будто ты на олимпиаде, а не работу ищешь.
И самое неприятное, пока ты варишься в этом болоте, кто-то спокойно проходит собесы и уходит в Яндекс, VK или на хорошую Валютную удаленку без лишней драмы.
Есть классные проекты и сильные команды, где разработчиков действительно ценят, дают расти, поддерживают развитие и платят достойно и ты можешь туда попасть!👋 Меня зовут Тихон, привет! Я — действующий Frontend-разработчик и ментор. Я за руку довожу до оффера на хорошую позицию в Big Tech и сопровождаю на испытательном сроке. Также из учеников я собираю комьюнити, где уже более 220 frontend-разработчиков🫂 А в своем канале: 👉Объясняю, как проходить HR-фильтр и превращать отклики в реальные приглашения 👉Помогаю найти мотивацию, борюсь убеждениями, которые мешают развиваться 👉На примерах объясняю, как проходить собеседования, включая техничку 👉Разбираю резюме и делюсь лайфхаками, например как аккуратно “пинговать” рекрутеров А еще регулярно публикую полезные материалы: ▪️Задачи, на которых валяться кандидаты ▪️База по микрофронтам ▪️Подборка из 100+ каналов с вакансиями для разработчиков ▪️100 вопросов, которые точно помогут тебе на собеседовании ▪️Чек лист проверки своего резюме А еще у меня множество успешных кейсов и отзывов, найти их можно в канале. Реклама, erid: 2W5zFJeWaNd ИП Галактионов Тихон Витальевич, ИНН 771618975809
| 2 | 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-процессе
Это важно для 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» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны курсы, книги, полезные инструменты и практические тренажёры для всех разработчиков
🎓 Практические курсы и задания
🪽 Книги и статьи известных авторов
😮💨 Полезные инструменты и ресурсы
🌟 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(), 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-фотосессии, генерация изображений и контента
💠 новости искусственного интеллекта без лишнего шума
💠 применение AI в работе, бизнесе и повседневной жизни
💠 Python, JavaScript, Data Science и системный анализ
💠 вакансии и возможности для специалистов в IT
Посмотреть и подписаться тут 👉 https://t.me/addlist/c_rbhnzprbAwMmFi
💌 Добавить свой канал в папку | 284 |
| 9 | Страшная тайна российского айти
✖️ xCode Journal | 430 |
| 10 | Хватит гадать — 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 в Telegram
@jobs_js_fronted для фронтов
@jobs_js_back для бека
Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram. | 320 |
| 13 | Стажировки и вакансии для JavaScript разработчиков
- Вакансии которых нет на джоб-агрегаторах
- Только прямые контакты HR в Telegram
@jobs_js_fronted для фронтов
@jobs_js_back для бека
Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram. | 235 |
| 14 | Привет, друзья! Собрали с коллегами новую папку с каналами
Здесь AI-новости, нейросети, полезные инструменты, примеры внедрения ИИ в крупный бизнес, разработка, JS, Node.js, frontend, QA, Data Science, кибербезопасность и IT-вакансии.
Посмотреть и подписаться можно тут 👉 https://t.me/addlist/XttiKDt6lhUwMzEy
💌 записаться в папку | 275 |
| 15 | На 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 | 789 |
| 18 | Кошмар вайбкодера
✖️ 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-направления: системный анализ, Python, JavaScript, frontend, тестирование
+ технологии и инструменты: всё, что ускоряет работу и рост в IT
+ AI для карьеры и бизнеса: как использовать нейросети, чтобы зарабатывать
+ обзор нейросетей: что сейчас работает и что стоит изучать
+ промты: готовые решения + логика создания своих
подписаться🎁 https://t.me/addlist/uyDjlf_VhiNjNWNi
💌 записать свой канал в папку тут | 0 |
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
