Category : javascript

javascript
Подмена hero на edge по UTM: Cloudflare Pages Functions + HTMLRewriter для React SSG за 200 строк

Проблема. У вас один SSG-лендинг, на который льётся платный трафик из 12 разных рекламных кампаний. Каждая группа объявлений сделана под свою боль ЦА: «AI-сотрудники», «AI-агенты», «стратегическая сессия», «управленческая отчётность». Все ведут на один дефолтный hero «ИИ для бизнеса». Конверсия в заявку проседает на 30–50% по сравнению с разнотемными лендингами под каждую группу. Делать 12 отдельных лендингов — дорого по разработке и убивает SEO. Подменять hero JavaScript-ом на клиенте — FOUC, …

  • вторник, 2 июня 2026 г. в 00:00:19
javascript
Route Handlers как мини-бэкенд внутри Next.js App Router

Когда проект на Next.js только начинается, прямой fetch во внешний API кажется самым коротким путём. Есть страница списка, есть поиск, есть внешний источник данных, значит можно сходить туда напрямую и сразу показать результат.На маленьком экране это работает. Но дальше почти всегда начинаются одинаковые проблемы. Интерфейс начинает зависеть от чужой структуры ответа. Ошибки приходят в форме, которую неудобно показывать пользователю. Параметры запроса приходится валидировать в UI. Потом появляе…

  • вторник, 2 июня 2026 г. в 00:00:17
javascript
Миграция на Vue 3 начинается не с кода: как донести важность и подготовить проект

«Бизнесу это невыгодно!», «Мы не будем вкладывать в это ресурсы», «Зачем, оно и так отлично работает» — какие аргументы можно привести против всех этих высказываний?Миграция на Vue 3 по факту это технический долг, на который обычно выделяют по минимуму времени. Проекты работают, пользователи не жалуются, а небо всё также синее. Можно жить дальше?Можно! Но есть моменты на которые важно обратить внимание и донести бизнесу.В этой статье хочется поговорить про две важные стороны миграции: почему пе…

  • вторник, 2 июня 2026 г. в 00:00:16
javascript
Новый Intl.DurationFormat привел к неожиданной ошибке приложения

Если вы уже используете новый Intl.DurationFormat в совсем проекте, то вам будет полезен мой кейс и поможет вам сэкономить пару часов на дебагинг.Продукт над которым я работаю - это платежная форма. Это стабильное давно работающее приложение и вдруг пользователи стали сообщать об «Unknown error» при попытке провести транзакцию. При этом проблема была только для одного вида транзакций — «Счет».Сначала проверили бэкенд, там все запросы проходят корректно, я стала проверять фронт и к моему удивлен…

  • вторник, 2 июня 2026 г. в 00:00:14
javascript
Lighthouse 100 / 100: как мы повесили GTM, GA4, Яндекс.Метрику и Clarity на статический сайт — и не…

Когда маркетологи хотят всё: сырые данные в GA4, запись сессий в Метрике, хитмапы в Clarity и при этом «Lighthouse 100» в PageSpeed Insights — приходится изобретать. Расскажу, как мы это сделали на небольшом проекте и во что это обошлось по времени и нервам.Проект — нишевый агрегатор российских хостинг-провайдеров. Более 120 страниц в sitemap, 31 статья, десятки категорий услуг, живые цены, сравнения. Стек: Astro 6 + Strapi 5 + Tailwind 4, плюс Partytown, PostgreSQL, Nginx и обычный VPS на Ubun…

  • вторник, 2 июня 2026 г. в 00:00:13
javascript
Как я сделал игру «Найди 250 отличий» на чистом JS и выложил в Яндекс Игры: цифры, грабли и доход

Часть кадр из игры (уровень 39)Можно ли запустить казуальную HTML5-игру на чистом JS в Яндекс Играх, не зная геймдева и верстки? Спойлер: можно, но придется пройти через 2-3 месяца модерации.Под катом — честный постмортем инди-проекта, созданного по вечерам на коленке. Рассказываю про костыли SPA-архитектуры на тегах <div>, продвижение и реальные графики трафика и доходов за первые недели.Если вам не терпится пощупать проект руками и не хочется читать долгие тексты — держите. Ну а для тех…

  • вторник, 2 июня 2026 г. в 00:00:11
javascript
DI в TypeScript без декораторов: почему это будущее

Если вы пишете на TypeScript больше пары лет, то наверняка привыкли к классическому паттерну внедрения зависимостей. Вы создаете класс, помечаете его декоратором @Injectable(), прописываете токеновые декораторы в параметрах конструктора и включаете emitDecoratorMetadata в tsconfig.json. После этого фреймворк берет всю магию на себя.Для 2015 года, когда декораторы только появились, это было отличным решением. Однако сегодняшний TypeScript ушел далеко вперед, превратившись в мощный инструмент с C…

  • вторник, 2 июня 2026 г. в 00:00:05
javascript
Назирокодил утилиту на Kotlin и JavaScript для создания аккордов в любой тональности

Пробовали когда-нибудь сочинять свои аккорды на гитаре, укулеле или на клавишных? Не всякий аккорд подходить к любому другому, так? Например, ре-мажорный аккорд (D) не очень-то ладит с фа-минорным (Fm). То есть просто "слепить" любые аккорды друг с другом в одну последовательность не получится. Тем более, что хочется, чтобы их было больше 2-х. И повторять до бесконечности Am Dm Em не хочется, так?Для решения этой проблемки написал, используя ИИ, утилиту на JavaScript, доступную по URL:h…

  • понедельник, 1 июня 2026 г. в 00:00:10
javascript
Я сделал Vite-плагин, который сохраняет изменения CSS прямо в исходники

Это моя первая статья на Хабре. Буду рад конструктивной критике в комментариях.Каждый раз, когда я хотел поправить отступ или цвет в процессе разработки, я делал одно и то же:открыл DevTools → нашёл элемент → поменял значение → понравилось → скопировал → переключился в редактор → нашёл файл → вставил.Это семь шагов ради однострочного изменения. Я сделал LiveStyleSync, чтобы это был один шаг.Что это такоеLiveStyleSync добавляет небольшую панель поверх вашего Vite-приложения в режиме разработки. …

  • воскресенье, 31 мая 2026 г. в 00:00:07