Обновить
128K+

JavaScript *

Прототипно-ориентированный язык программирования

252,51
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

LLM уверенно называет шахматные ходы, которых на доске нет. Как я проверяю каждый ее ответ кодом

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели783

Движок знает ответ, но говорит числами. Модель говорит словами, но врет. Рассказываю, как проверяю каждый ход из ответа LLM кодом и почему просьба в промпте тут не работает.

Читать далее

Новости

YApi заброшен с 2022 года. Я продолжил его и нашёл токены, которые может подделать любой участник проекта

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели6.3K

YApi — платформа документации API, мок-сервера и тестов с 27 тысячами звёзд — не обновлялась с 2022 года. На новом Node.js у неё ломаются токены, клиент не собирается, нужное ей расширение браузера больше не работает в Chrome, а мок-скрипты позволяют выполнить код на сервере.

Я продолжил проект и по дороге нашёл, что без настройки passsalt токены проектов шифруются общеизвестным ключом — участник проекта может выдать себя за другого пользователя. В статье — как это исправлено без поломки старых токенов, песочница для скриптов на isolated-vm, своё расширение на Manifest V3 и тест обновления на настоящей базе YApi.

Читать дальше

Сонар-управление + Asteroids. Игра на 50 КБ, которой нужен флагманский смартфон

Время на прочтение3 мин
Охват и читатели4.6K

Телефон лежит на столе. Сбоку от него в воздухе ладонь. Поднимаешь её — корабль на экране поднимается, опускаешь — опускается. Экрана не касаешься. Камера не нужна: телефон пищит ультразвуком и слушает эхо своим микрофоном.

Играть: sonaroids.app (лучше на iPhone). Код: github.com/neokrasav4ik/sonaroids, MIT.

Читать далее

Удалить что угодно со страницы одним кликом: как устроен «пипеточный» блокировщик на Manifest V3

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели5.2K

Бывает, что блокировщик рекламы не справляется: всплывающее окно подписки, баннер «мы используем cookies», чат-виджет в углу, липкая шапка на пол-экрана. Для этого было маленькое расширение ekill: жмёшь кнопку, наводишь на элемент, кликаешь — элемент исчез. Оно не обновлялось с 2019 года и перестало работать в Chrome, когда Google отключил Manifest V2.

Я переписал его под Manifest V3 для Firefox, Chrome и Edge. Получился SkullClick (GitHub). Задача кажется тривиальной, но у неё неожиданно много граней:

Разберём по порядку

Кризис идентичности, или как Vue-разработчик мигрировал enterprise-проект на Angular 18

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели5.3K

Всем привет! Меня зовут Павел Барсуков, я frontend-разработчик в компании «Программный Продукт».

Основной мой стек – Vue, Nuxt и все рядом лежащее. Angular до недавнего времени я видел в основном в курсах на Youtube, пару раз на фрилансе, где особо с ним не взаимодействовал, и в мемах про исключительность Angular разработчиков и очень частые обновления версий. И тем не менее, мне была поставлена задача мигрировать проект со старой версии на более новую, и я взялся за это.

Погружаемся

Как мы дописываем оборванные ответы языковой модели и почему склейка оказалась сложнее, чем кажется

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели7.5K

Мы делаем сервис с несколькими языковыми моделями в одном чате. Однажды модель начала отвечать списком из ста пунктов и оборвалась на середине слова, без ошибок и предупреждений. Рассказываю, почему так бывает, как мы дописываем ответ по finish_reason и почему склеить куски без артефактов оказалось сложнее, чем кажется: три ловушки и функция, которая их обходит.

Читать далее

Заметки в своём GitHub без сервера: как я оживил BatNoter и написал синхронизацию на Git Data API

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели5.9K

Мне давно нравится идея хранить заметки обычными Markdown-файлами в своём репозитории на GitHub. Файлы остаются твоими, их можно открыть на github.com или в любом редакторе, а история изменений достаётся даром: это просто коммиты.

Был проект BatNoter, который делал ровно это, но ему нужен был собственный сервер для входа через GitHub. В конце 2022 года сервер перестал отвечать, и приложение умерло.

Я переписал его так, чтобы сервер был не нужен вовсе. Получился Notewing: браузер сам ходит в GitHub API, изменения копятся офлайн и отправляются одним коммитом, а конфликтующие правки не теряются. В статье расскажу, как устроена синхронизация через Git Data API, где были подводные камни и как всё это тестировать, не трогая настоящий GitHub.

Как устроена синхронизация

От localStorage к HttpOnly Cookie. Как меняется архитектура авторизации в SPA

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели5.6K

В большинстве SPA-авторизация до сих пор строится вокруг JWT, localStorage и заголовка Authorization. Такой подход прост и удобен, но он заставляет клиентское приложение самостоятельно управлять credential и пользовательской сессией.

В этой статье разберём, что меняется при переходе на HttpOnly Cookie и серверные сессии: как браузер хранит и отправляет Cookie, зачем нужны HttpOnly, Secure, SameSite, Domain и Path, и почему вместе с Cookie приходится по-новому смотреть на CSRF и CORS.

Отдельно разберём разницу между JWT и session ID внутри Cookie, а в практической части посмотрим, как такая архитектура меняет React-приложение с Axios и MobX.

Читать далее

Калькулятор плитки: фото вместо цвета и 3D, который наконец не бесит

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели5.1K

Всем привет, это третья часть, в которой пилю калькулятор плитки - tilely.ru. Получился довольно крупный патч, в основном вокруг 3D-режима, и там оказалось прилично багов. Многое пришлось переделывать из того, что сначала казалось логичным, а на практике оказалось вообще неудобным.

Перед самим 3D - то, что допилил ещё раньше в очереди. Теперь можно загружать фото плитки, чтобы не смотреть на однотипные прямоугольники одного цвета. Есть кнопка «применить ко всем комнатам». Если у вас, скажем, санузел и кухня одной плиткой идут, не надо грузить фото дважды. Так же теперь можно выбирать цвет швов, а то они были всегда одного цвета, и картинка порой сливалась.

Читать далее

Компонент перерисовался. Почему? Пишем инструмент для Vue и трижды ломаем чужой прод

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели5.2K

Есть Vue DevTools с галкой «Highlight updates». Есть react-scan в соседней экосистеме. Оба показывают одно и то же: вот этот компонент перерисовался.

Проблема в том, что знание «перерисовался» само по себе бесполезно. Ты и так видишь, что страница дёргается. Вопрос всегда другой: что именно изменилось. Какой проп, какой реф, какое поле стора. Без этого ты сидишь и комментируешь куски шаблона, пока не найдёшь виновника методом половинного деления.

В React иначе и нельзя: реактивность там на уровне «перерисовался компонент», причину приходится реконструировать диффом пропсов. А во Vue реактивность точечная — фреймворк знает, какая именно зависимость дёрнула рендер.

И он её отдаёт.

Читать далее

Карта чёрная, в консоли ни одной ошибки. Три бага одной подложки

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели7.2K

Мы переводили карту парковок с растровой подложки на векторные тайлы и получили чёрный экран. Без единой ошибки в консоли: ни исключения, ни предупреждения, идеально чистый лог. Единственной уликой оказалось отсутствие запросов за тайлами — воркер MapLibre не попал в сборку, потому что Rollup не умеет разбирать шаблонную строку в new URL(…, import.meta.url). Разбираем этот баг и ещё два из той же серии: как смена города убивала Leaflet и почему событие load у карты не наступает никогда.

Читать далее

Публикуйте инструменты, а не пиксели: собираем WebMCP‑магазин на React и считаем грабли

Уровень сложностиПростой
Время на прочтение23 мин
Охват и читатели6.5K

Представим обычный интернет-магазин. Пользователь открывает каталог, вводит «наушники» в поиск, включает фильтр наличия, задаёт цену до 10 000 рублей, открывает карточку и добавляет товар в корзину. Шесть вполне понятных действий. Если их выполняет человек, всё хорошо. Если за дело берётся AI-агент, начинается небольшой квест: прочитать страницу, найти поле, угадать назначение переключателя, нажать кнопку, проверить результат и не купить случайно кофеварку вместо наушников.

А что, если сайт сам скажет агенту: «Я умею искать товары, показывать карточку и добавлять позицию в корзину. Вот названия функций, вот параметры, вот ограничения»? Эту задачу решает WebMCP — экспериментальный браузерный API, который позволяет странице объявлять инструменты для AI-агентов прямо из JavaScript или HTML-формы. Черновик и обсуждение стандарта открыты в репозитории Web Machine Learning Community Group.

Меня зовут Денис Смирнов, я ведущий .NET-разработчик, в профессии больше пяти лет. Это не пересказ новости. Соберу небольшой магазин электроники на React, добавлю три инструмента, прогоню проверки и покажу четверо граблей, на которые наступил. Грабли оказались интереснее рабочего примера.

Читать далее

Промпт — не контракт: замерил, как часто модель нарушает жёсткие правила, и вынес их в код

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели5.5K

У меня в проде работает ИИ-консультант на сайте. У него есть два правила, которые нарушать нельзя вообще: не называть цены и не называть клиентов, которые под NDA. Оба правила были написаны в системном промпте капслоком, с объяснением почему.

Я замерил, как они соблюдаются. Получилось так:

Читать далее

Ближайшие события

Полезные новшества ECMAScript 2026

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели9.8K

JavaScript получает новый стандарт языка каждый год. Некоторые редакции представляют синтаксис, который меняет то, как программы пишутся или как они выполняются. Версия ECMAScript 2026 (ES17) представила набор полезных возможностей, которые мы рассмотрим в этой статье. Эти возможности добавляют API для задач, которые сейчас решаются с помощью небольших утилит, повторяющихся проверок или обходных путей, подверженных ошибкам.

Читать далее

Субтитры с переводом в расширении Chrome: звук вкладки в MV3, один поток вместо двух сервисов

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели6.6K

Расширение Chrome показывает субтитры с переводом поверх созвона в браузере, бот в звонок не заходит. Разбираю три места, где ушло больше всего времени: захват звука вкладки в Manifest V3, переход с двух сервисов на один поток с транскрипцией и переводом, и ошибку в счётчике минут, из-за которой время списывалось в тишине.

Читать далее

История npm‑библиотеки morphing‑scroll

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели8.8K

Хочу рассказать о своей npm‑библиотеке — это мой второй и самый сложный npm‑проект на момент написания статьи.
Библиотека решает ряд проблем и ограничений связанных с дефолтным поведением браузерного элемента скролл.

Глубоко в код погружаться не буду — поделюсь историей создания и мотивацией.✨

Читать далее →

React 19.3

Уровень сложностиПростой
Время на прочтение14 мин
Охват и читатели7.7K

React 19.3 уже доступен в npm!

В прошлом году мы представили View Transitions и Fragment Refs как новые экспериментальные API, которые готовились к появлению в React. Теперь оба API получили стабильный статус в React 19.3.

В этой статье разберём, как они работают, а также рассмотрим другие заметные изменения в этом релизе.

Читать далее

Про то, как я научил своего аватара снимать ролики по сценарию без ИИ‑генерации видео (часть 2)

Уровень сложностиПростой
Время на прочтение39 мин
Охват и читатели7.7K

Продолжение истории о том, как я делаю собственного цифрового аватара для видеоблога — без нейросетевой генерации видео и необходимости самому появляться перед камерой.

В первой версии движок уже умел анимировать аватара, синхронизировать губы с речью и расставлять субтитры. Казалось, с монтажом разобрался. Но за спиной персонажа оставался пустой фон, который приходилось вручную заполнять.

В этой статье — о том, что я успел доделать за два месяца.

Добавил больше двадцати генераторов слайдов, научил движок строить динамический фон из произнесённых слов, вставлять в него эмодзи и GIF-реакции, раскрывать карточки на весь экран и автоматически расставлять переходы.

Потом у моего цифрового двойника появился соведущий — робот аЙгорь. Пришлось разбираться уже с двумя персонажами, голосами, расположением, мимикой и жестами.

Показываю, как всё устроено: реальные фрагменты JSX и сценариев, схемы, интерфейс программы и много-много GIF.

В конце — первые результаты публикаций, наблюдения о Shorts и планы перехода на горизонтальный формат.

Читать далее

Кнопка нажата, а ответа нет: как не потерять действие пользователя и не наделать дублей

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели9.8K

Пользователь нажал кнопку, сеть пропала, а браузер не знает, дошёл ли запрос до сервера. Повторите запрос — можно получить дубль. Не повторяйте — потеряете действие.

Показываю схему, которая решает обе проблемы: API без toggle, ключ идемпотентности в PostgreSQL, очередь в IndexedDB, Service Worker и проверка офлайна в Playwright. Это не полный offline-first — только защита действий в момент обрыва связи.

Разобраться с повторами

Telegram Serverless: теперь бота можно запустить вообще без своего сервера

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели21K

Недавно в BotFather у меня появилось сообщение о раннем доступе к Telegram Serverless. Telegram предлагает запускать код ботов прямо на своей инфраструктуре — без отдельного VPS, Docker, nginx и даже внешней базы данных.

Решил разобраться, что именно они сделали, как выглядит разработка и можно ли теперь действительно собрать Telegram‑бота, у которого вообще нет своего сервера.

Сразу оговорюсь: пока это early access. Есть ограничения, а привычный Python + aiogram туда просто так не перенести. Но сама идея получилась довольно интересной.

Читать далее
1
23 ...