Обновить
256K+

Веб-разработка *

Делаем веб лучше

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

i18n в Next.js без SEO-дублей, locale в маршрутах, metadata и hreflang

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

Перевод интерфейса меняет текст, но сам по себе не создаёт отдельную языковую страницу. Один адрес /search/music может показать английский или русский интерфейс в зависимости от client state, cookie или настроек браузера. URL при этом остаётся тем же.

Для поисковой индексации языковые версии удобнее разделить адресами:

Читать далее

Новости

Картинка загрузилась, но API вернул images: [] — ловушка relationship в SQLAlchemy

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

Это моя вторая статья. После первой я посмотрел на статистику и понял простую вещь: начинать издалека и пытаться рассказать сразу обо всём — плохая идея. Поэтому сейчас будет одна задача, один странный баг и одна строка, которая его исправила.

Я добавлял в админку сайта портфолио. У проекта есть заголовок, описание и несколько изображений. После загрузки файла API должен вернуть обновлённый проект, чтобы интерфейс сразу показал новую картинку.

Файл сохранялся. Строка появлялась в базе. Повторный GET тоже находил изображение. Но ответ самого запроса загрузки выглядел так:

Читать далее

Разработчик в Казахстане стоит на 22% дороже, если он ИП

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

Классическая ситуация: компания ищет мидла на бэкенд, находит хорошего человека в Казахстане, договаривается о вилке, зовет бухгалтера оформлять. Бухгалтер спрашивает: он ИП или физлицо? Вроде, вопрос формальный. На деле от ответа зависит, будет ли проект стоить на 22% дороже.

Разбираем, откуда берутся эти 22%, почему НДФЛ с казахстанца платить не надо, но налоговым агентом вы все равно остаетесь, и какая формулировка в договоре превращает экономию в доначисление.

Дисклеймер: это не универсальный рецепт. Ситуации бывают разные, и решение под конкретный проект стоит согласовать с юристом. Дальше по тексту описан типовой случай: разработчик живет в Казахстане, физически там же и работает, в Россию не приезжает.

Читать далее

«Ссылка недействительна» с первой попытки: её открыли до пользователя

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

В нашем сервисе появились обращения, которые не складывались в картину: человек запрашивает сброс пароля, получает письмо, нажимает на ссылку и видит «ссылка недействительна или устарела». Запрашивает второй раз - то же самое. Пятый раз - то же самое.

Первое, что я проверил, - срок жизни токена. Срок - час, время на серверах синхронизировано, при генерации токен пишется в базу с отметкой времени, при переходе она сверяется. Всё сходилось. Потом я посмотрел не на создание токена, а на его использование, и увидел, что токен уже израсходован. Израсходован за несколько секунд до того, как пользователь вообще открыл письмо.

Читать далее

Cordis: плагинная архитектура как новый слой композиции JS/TS-приложений

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

Что изменится, если плагин станет не дополнением, а основной единицей архитектуры приложения? На примере Cordis и DeepSeek Harness разберём, как среда композиции управляет зависимостями, эффектами и жизненным циклом компонентов.

Сравним три способа доставки клиентских плагинов: виртуальные модули в общем графе сборки, Module Federation и собственную модульную систему DSH. Сопоставим Cordis с микросервисами и Kubernetes, обсудим его ограничения и роль в разработке, которую ведут независимые команды и AI-агенты. Затронем также метатеорию, лежащую в основе Cordis, и спекулятивную архитектуру, в которой сама композиция приложения становится предметом эксперимента.

Статья будет полезна архитекторам, техлидам и JS/TS-разработчикам, которые проектируют модульные продукты, плагинные платформы или системы с динамически подключаемыми AI-компонентами.

Читать далее

withComponentInputBinding: уменьшаем связанность, инвертируем зависимости

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

В Angular проектах часто можно увидеть использование routed-компонентов, выполняющих оркестрирующую роль для своего роута. Они инжектят ActivatedRoute, достают из него параметры и по ним выполняют инициализацию с помощью доменных сервисов. Это кажется естественным и такой компонент принято считать smart container, «умным».

Но действительно ли ему необходимо знать про ActivatedRoute и про конкретный сервис?

В статье рассказываю, как с помощью фичи withComponentInputBinding и резолверов можно инвертировать зависимости для routed-компонентов и уменьшить их связанность.

Читать далее

Как получить OV-сертификат Минцифры для HTTPS в 2026 году

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

Как получить бесплатный HTTPS сертификат от Минцифры для своего сайта на 365 дней. Смотрим, с какими сложностями предстоит столкнуться.

Читать далее

Я попросил Claude Code собрать макеты сайтов и выяснил, на что уходят токены

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

В конце марта 2026 года Figma открыла канвас для AI-агентов. Claude Code, Codex и подобные инструменты получили возможность создавать и редактировать макеты через MCP-сервер Figma.

Я решил проверить, насколько хорошо Claude Code сможет перенести дизайн сайтов в макет и сколько это будет стоить. Для этого я выбрал несколько лендингов и попросил агента перенести их на канвас - пробовал давать ему либо скриншот, либо ссылку на сайт. Каждый раз я смотрел, какие шаги выполняет агент, сколько раз обращается к инструментам и сколько токенов (то есть денег) тратит.

Читать далее

Защита сайта от ботов: 6 лет практики фильтрации трафика

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

Практический разбор шести лет работы с автоматизированным трафиком: от первых поведенческих ботов и ручных правил Cloudflare до собственной многоуровневой системы фильтрации и кластерной аналитики.

Читать далее

Один пользователь зарегистрировался у вас четыре раза, и все четыре легально

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

Коллеги жаловались на дубли в базе пользователей: людей меньше, чем учётных записей, а откуда берётся расхождение - непонятно. Объяснилось оно одной строкой в коде, которая сравнивает адреса посимвольно.

В базе четыре учётные записи: Ivan.Petrov@gmail.com, ivanpetrov@gmail.com, ivan.petrov+shop@gmail.com, IVAN.PETROV@gmail.com. С точки зрения кода это четыре разных строки. С точки зрения почты - один и тот же ящик, все письма придут в одно место.

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

Читать далее

Vanilla Disintegrate — современные и эффектные анимации для веба

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

Какие обычно бывают анимации в вебе? Появление, исчезновение, небольшой сдвиг, масштабирование. Они не обязательно плохие: чаще всего интерфейсу действительно не нужно ничего сложнее. Иногда лучшее решение — вообще не добавлять анимацию. Так интерфейс остаётся быстрым, понятным и не отвлекает от основной задачи. Но иногда хочется сделать один небольшой момент запоминающимся. Не длинную заставку и не тяжёлый спецэффект на весь экран, а короткую реакцию на действие пользователя. Меньше секунды — и удаление карточки, появление элемента или отмена действия уже ощущаются совсем иначе.

Читать далее

Как мы внедрили Knip в Angular-проект: от настройки до CI/CD

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

Привет! Я Незар, фронтенд-разработчик в Т-Банке. Наш Angular-проект достаточно крупный, и со временем в нем накопился неиспользуемый код. Это замедляет разработку, усложняет рефакторинг и вводит в заблуждение новых членов команды. А ручная очистка такого «мертвого» кода требует огромных трудозатрат и быстро перестает быть эффективной.

Поэтому мы решили автоматизировать этот процесс с помощью Knip — статического анализатора для TypeScript. В статье я расскажу, как мы его настроили, интегрировали в pre‑commit и CI/CD и какие результаты получили.

Читать далее

Разработчики больше не нужны для релиза. Нужны JSON Schema и Monaco

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

У нас было около сотни репозиториев-форков одного виджета — по одному на клиента, каждый на своей версии ядра, со своим CI и своим Nginx. Подключение клиента занимало две недели и разработчика. Сейчас — больше 800 брендингов на одной сборке, и новый клиент — это строка в базе. Рассказываю, как TypeScript-тип стал контрактом, JSON Schema — его исполняемой формой, а Monaco Editor — админкой для продажников. С кодом, цифрами из прода и рецептом на неделю.

Читать далее

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

В чем разница между мобильными профилями, эмуляторами и облачными ARM?

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

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

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

Читать про разницу мобильных профилей

Как DevSpace ускорил проверку микрофронтендов

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

Чтобы проверить небольшую правку в микрофронтенде вместе с настоящим хостом, мне приходилось либо ждать полный CD-пайплайн, либо локально конфигурировать и поднимать хост, разводить порты, прописывать домены. Оба варианта меня не устраивали.

В статье рассказываю, как оставил всё окружение в Kubernetes, а локальную сборку начал синхронизировать прямо в pod через DevSpace.

Читать далее

V8 startup snapshot: как правильно запустить JS-код на сервере

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

Представьте типичную ситуацию. У вас есть сервер на каком-то языке (сейчас какой именно для нас не важно, но допустим, это Rust). И в нём по каким-то причинам нужно исполнить JavaScript-код. Например, фронтенд написан на React, и вы хотите рендерить HTML на сервере (SSR). Или есть бизнес-логика, которая проще пишется на JS. Или библиотека, которая существует только в npm, и переписывать её на Rust нет ни сил, ни желания. Таких примеров можно привести множество: markdown, dompurify, highlight.js и т.д.

Читать далее

Разработчик и маркетинговое сальто

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

Огромное количество разработчиков мечтают создать свой проект, который будет приносить им доход поверх зарплаты на основной работе.

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

В дату релиза проект деплоится в прод. Но почему-то там все также один пользователь — сам создатель.

Ты вроде и понимаешь почему, логично ведь, что без рекламы и маркетинга пользователей не будет, но пока пишешь код - делаешь, что умеешь, а маркетинг это что-то неизвестное и непонятно. На самом деле маркетингом нужно было заниматься с первого дня, даже раньше, чем пришла идея.Но пока вернемся к нашему наивному разработчику.

Он сидит, смотрит на свой проект и прям чувствует, как энтузиазм сходит на нет. Приходит понимание, что нужно как-то привлекать пользователей, но как? На самом деле на этом этапе уже многие так и остаются, и проект просто попадает на так называемое «кладбище пет-проектов».

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

Читать далее

Четыре копии проекта и одно лабораторное чудовище. Как научить ИИ-агента писать код по правилам дизайн-системы

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

На экране всё выглядело почти живым. Модель за несколько минут собрала страницу с карточками, статусами и бейджами. Казалось, мне можно закинуть ногу на ногу и допить кофе. Но затем код дошел до ревью. Под аккуратным интерфейсом скрывались styled.div, HEX-цвета и пропсы, которых в нашей дизайн-системе никогда не существовало. Получилось то самое лабораторное чудовище, которое хрипло дышит, но в проекте жить не может.

Поэтому я поставил эксперимент с одной фронтенд-задачей, одной моделью и четырьмя одинаковыми копиями проекта. В первом случае оставил агента без подсказок, во втором дал ему скилл с правилами проекта, в третьем подключил MCP с документацией дизайн-системы, а в четвертом совместил всё сразу. Мне хотелось узнать, какая комбинация превратит генерацию кода в эликсир скорости, а какая породит еще одно чудовище, не способное пережить встречу с typecheck и build.

Читать далее

В JWT кладут отдел, роль и почту сотрудника, считая, что токен зашифрован. Он не зашифрован

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

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

Токен выглядит как шифротекст: длинная строка из букв, цифр и дефисов, глазами не читается. Отсюда и распространённое допущение — раз не читается, значит, закрыто, и внутрь можно положить что угодно полезное.

На самом деле это base64. Читается одной командой, ключ для этого не нужен, и содержимое видно всем, через кого проходит токен: браузеру пользователя, расширениям в нём, промежуточным прокси, системам логирования.

Читать далее

Centrifugal. Fluid UI для создания standalone веб‑приложений

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

Всем привет! Меня зовут Евгений, я фронтенд‑инженер с большой экспертизой в разработке современных веб‑приложений. Сегодня хочу рассказать про свой очередной open‑source проект для построения веб‑приложений на основе Angular.

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

Итак, встречайте Centrifugal. Посмотрите официальный сайт проекта, там очень много крутых примеров использования!

Проект разрабатывался изначально, чтобы создать набор высокопроизводительных, гибких инструментов и компонентов для построения веб‑приложений. Но на одной из итераций разработки я решил обеспечить поддержку для построения All‑in‑One интерфейсов, то есть добавил режим standalone‑приложений с отображением собственной виртуальной клавиатуры, которую можно полностью кастомизировать. Тем самым обеспечил полноценную поддержку создания пользовательских интерфейсов, например, под киоски самообслуживания и тому подобное.

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