TGViewer
Channel Public Channel
Заметки разработчика

Заметки разработчика

@dev_notes_ru

Заметки о Frontend, Backend и немного DevOps. В основном о #PHP, #Laravel, #JavaScript, #HTML, #CSS, тестировании и настройке серверов.

https://www.dev-notes.ru

@snakenf
Subscribers
458
Photos
740
Videos
4
Links
1.2K
Recent Posts 20 shown
Post #1747 332
Уникальный индекс при мягком удалении: решаем проблему дубликатов

При использовании мягкого удаления стандартный уникальный индекс перестаёт выполнять свою функцию: запись помечена как удалённая, но её данные по-прежнему участвуют в проверке уникальности. Результат — пользователь не может восстановить аккаунт на прежний e-mail.

В новом материале рассмотрены два способа решения этой архитектурной задачи:

✅ Частичные индексы в PostgreSQL — условие WHERE deleted_at IS NULL прямо в определении индекса.
✅ Генерируемые столбцы в MySQL — использование семантики NULL в составном уникальном ключе.

Оба метода разобраны с готовыми миграциями для Laravel и интеграционными тестами. Также затронуты вопросы производительности, восстановления записей и соответствия GDPR.

🖥 Читать статью

📱 @dev_notes_ru

#SoftDelete #Laravel #Eloquent #PostrgeSQL #MySQL
  • 👍 1
Post #1746 349
Статические переменные в PHP: использование static внутри функций

По данным исследования Exakat, конструкция static $var в теле функции встречается в каждой третьей PHP-кодовой базе. Несмотря на удобство реализации ленивой инициализации и мемоизации, этот подход сопряжён с рядом архитектурных ограничений.

В статье рассмотрены:

✅ Критерии допустимости использования в CLI-скриптах и средах с постоянными воркерами.
✅ Изменение поведения статических переменных при наследовании методов в PHP 8.1.
✅ Возможность динамической инициализации выражениями в PHP 8.3.

Практическое применение метода и альтернативы.

🖥 Читать статью

📱 @dev_notes_ru

#php #php8
Post #1745 290
Валидация массивов в Laravel без N+1: Form Request как построитель контекста

Применение правила exists к массивам в Form Request порождает проблему N+1 запросов: каждый идентификатор проверяется отдельным SQL-запросом. При росте количества элементов это создает неоправданную нагрузку на базу данных и увеличивает время ответа.

В статье рассматривается метод решения этой проблемы с помощью prepareForValidation(). Подход позволяет заменить серию отдельных запросов одним whereIn, сохранив при этом возможность точного указания ошибочного поля в ответе валидатора.

Основные темы:
— Анализ затрат стандартного правила exists для массивов.
— Ограничения метода after() в контексте сохранения структуры ошибок.
— Реализация предзагрузки допустимых значений и легитимность расширения ответственности Form Request.

🖥 Читать статью

📱 @dev_notes_ru

#Laravel #PHP #Backend #ВалидацияДанных
Post #1744 296
JSON в браузере: import или fetch — руководство по выбору

Спойлер: import из JSON — это не замена fetch()

Кажется, что новый синтаксис import data from './file.json' with { type: 'json' } проще и современнее. Но у него есть три жёстких ограничения:

🔹 Пожизненное кеширование — данные останутся в памяти на всю сессию
🔹 Нет отмены запроса — AbortController не подключается
🔹 Минимум информации об ошибках — не поймёшь, 404 это или CORS

В статье сравнили оба подхода по безопасности, кешу, стримингу и контролю. В конце — готовый чек-лист: когда брать import, а когда только fetch с проверкой Content-Type.

🖥 Читать статью

📱 @dev_notes_ru

#JavaScript #JSON #import #fetch
  • 👍 3
  • ❤ 1
  • 🔥 1
Post #1743 309
Проксирование fetch() в серверном JavaScript

Стандарт Fetch не специфицирует проксирование HTTP-запросов, поэтому каждый серверный JavaScript-рантайм реализует эту возможность по-своему. В результате разработчики сталкиваются с несовместимостью решений при смене среды исполнения.

В статье рассматриваются следующие подходы:

✅ Bun и Deno — встроенная поддержка прокси через опции fetch()
✅ Node.js — два пути: глобальные переменные окружения или пакет undici для per-request настройки
⚠️ Cloudflare Workers — отсутствие нативной поддержки и три архитектурных альтернативы (Docker-контейнер, TCP-сокеты, вынос логики в отдельный микросервис)

Также приведён чек-лист для проверки, действительно ли трафик идёт через прокси, и разбор типовых ошибок.

🖥 Читать статью

📱 @dev_notes_ru

#JavaScript #Nodejs
  • 👍 1
Post #1742 316
Taskfile: Когда пора отказаться от Makefile (а когда — нет)

Makefile — инструмент с почти полувековой историей, который продолжает оставаться стандартом во многих проектах. Однако его синтаксис, ориентированный на shell-сценарии, не всегда удобен при решении современных задач: кросс-платформенная работа, интерактивные запросы, модульная организация кода.

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

В статье рассматриваются ключевые различия между двумя подходами:

✅ документация и навигация по задачам;
✅ работа на разных операционных системах;
✅ инкрементальные сборки и контроль изменений;
✅ интерактивные сценарии и валидация;
✅ модульность и переиспользование конфигураций.

Также приводится три стратегии внедрения Taskfile в существующие проекты — от нового проекта до постепенного рефакторинга проблемных мест.

🖥 Читать статью

📱 @dev_notes_ru

#Taskfile #Makefile #DevOps #автоматизация #инструменты
Post #1741 238
Практическое руководство по элементу <img>: от основ до LCP

Смещение контента при загрузке страницы, избыточный трафик на мобильных устройствах, потерянные баллы Core Web Vitals — всё это часто следствие недооценки возможностей элемента <img>.

В новом руководстве рассматриваются ключевые аспекты работы с изображениями в HTML:

✅ указание width и height для предотвращения смещения макета (CLS);
✅ адаптивность через srcset и sizes — как браузер выбирает нужный размер;
✅ поддержка современных форматов (AVIF, WebP) с помощью <picture>;
✅ управление приоритетами загрузки: loading, decoding, fetchpriority;
✅ стратегия для LCP с предварительной загрузкой адаптивных изображений.

В финале — сравнение ручного подхода и использования Image CDN с акцентом на практическую целесообразность.


🖥 Читать статью

📱 @dev_notes_ru

#HTML #LCP #CoreWebVitals
  • 👍 1
Post #1740 231
Быстрый совет: не используйте <abbr>

Элемент <abbr> предназначен для обозначения аббревиатуры. Идея в том, что вы вставляете сокращение, а затем с помощью атрибута title показываете его полную расшифровку.

<p>Без <abbr title="Cascading Style Sheets">CSS</abbr> любая HTML-страница будет выглядеть как простой текстовый документ из 90-х.</p>


Проблема в том, что <abbr> — не интерактивный элемент. На него нельзя переключиться по табуляции. Он будет прочитан точно так же, как любое другое слово в предложении. Если навести мышь на элемент, вы увидите подсказку title. Но если вы используете клавиатуру — нет никакого способа её отобразить.

Далее, скринридеры. Большинство скринридеров не озвучивают атрибут title.

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

#a11y #HTML
  • 👌 4
Post #1739 329
Приёмы работы с PostgreSQL, меняющие архитектуру решений

Когда речь заходит о проверке целостности данных, например, запрете пересекающихся интервалов бронирования, возникает вопрос: где разместить эту логику? В коде приложения или на стороне базы данных? PostgreSQL предоставляет инструменты, которые позволяют делегировать такие проверки уровню СУБД, снижая нагрузку на прикладной код и минимизируя риски состояний гонки.

В статье рассматриваются:

✅Ограничение EXCLUDE — декларативный способ запретить пересечение интервалов без дополнительных проверок в коде.
✅Генерируемые колонки (GENERATED) — вычисление производных значений непосредственно в базе.
✅Рекурсивные CTE — обход иерархий и графов в несколько строк вместо императивных конструкций.
✅JSONB и композитные типы — сравнение подходов к моделированию гибких структур данных.

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

🖥 Читать статью

📱 @dev_notes_ru

#PostgreSQL #SQL #Database
Post #1736 284
Как сделать Laravel-контроллер тестируемым и перестать бояться рефакторинга

Вы уверены, что ваши тесты действительно что-то тестируют? 🤔

Представьте: вы случайно (ну, бывает) закомментировали ключевой вызов сервиса в контроллере подписки. Прогоняете тесты — все зеленое! Отличная работа, можно деплоить. А подписчики в это время не подписываются. Знакомое чувство ложной безопасности?

Статья как раз об этой проблеме: когда тесты проверяют ответ, но игнорируют поведение. Разобрал на живом примере, как один new в контроллере делает ваш код непроверяемым.

Что внутри:

🔹 Почему создание сервисов через new — путь к хрупким тестам.
🔹 Как внедрение зависимости (Dependency Injection) спасает ситуацию.
🔹 Прием с resolve() для "легаси-кода", когда менять сигнатуру метода нельзя.
🔹 Сравнение $this->mock() и чистого Mockery — чувствуем разницу.

Если хотите писать тесты, которые находят проблемы, а не просто «проходят», — заглядывайте.

🖥 Читать статью

📱 @dev_notes_ru

#Laravel #TDD #PHP
Post #1735 399
Soft Delete в Laravel: Как настроить, использовать и восстанавливать данные

Soft delete часто воспринимается как простая тема, однако на практике возникает множество вопросов: как правильно тестировать эту функциональность, учитывать требования GDPR, настраивать привязку к маршрутам и автоматически очищать устаревшие записи.

В статье последовательно разобраны следующие темы:

✅ Настройка SoftDeletes и создание миграции
✅ Работа с методами withTrashed(), onlyTrashed() и restore()
✅ Применение Prunable для автоматической очистки базы данных
✅ Тестирование soft delete с использованием встроенных assertion-методов

Материал будет полезен как для внедрения мягкого удаления в новых проектах, так и для рефакторинга существующего кода.

🖥 Читать статью

📱 @dev_notes_ru

#Laravel #Eloquent #PHP #SoftDelete
Post #1734 256
Вайб-кодер пытается объяснить функциональность и архитектуру своего приложения

📱 @dev_notes_ru

#Joke
  • 😁 1
Post #1732 254
📰 Ежемесячный дайджест Baseline: январь 2026

Привет! Встречайте первый в этом году выпуск Baseline Digest. Мы собрали для вас все важные новинки веб-платформы, которые в январе достигли новых этапов в проекте Baseline. Поехали! 🚀

✅ Новое в категории Newly Available

Эти функции теперь стабильно работают во всех основных браузерах.

1. Псевдокласс :active-view-transition
Позволяет стилизовать корневой элемент документа во время перехода между состояниями страницы (View Transition). Это дает тонкий контроль над анимацией смены контента.

2. JavaScript-модули в Service Workers
Теперь и в Service Worker можно использовать стандартные import/export! Просто добавьте { type: 'module' } при регистрации. Это упрощает организацию кода и управление зависимостями.

3. Navigation API
Современная замена устаревшему History API, созданная специально для Single Page Applications (SPA). Дает единый способ управления навигацией, включая кнопки «назад/вперед», с меньшим количеством шаблонного кода.

4. Новые CSS-единицы (относительно root):
rcap: Высота заглавных букв корневого элемента. Идеально для точной типографики.
rch: Ширина символа 0 в шрифте корневого элемента.
rex: Высота строчных букв (ex) корневого элемента. Полезно для вертикального выравнивания.
ric: Ширина/высота иероглифа (CJK) корневого элемента. Незаменимо для многоязычных интерфейсов.

🌐 Новое в категории (Widely Available

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

1. Двухзначное свойство display
Вместо inline-flex можно писать display: inline flex. Это разделяет «внешний» (как элемент взаимодействует с потоком) и «внутренний» (как ведут себя дочерние элементы) типы отображения. Более логично и гибко.

2. Свойство animation-composition
Определяет, как накладываются друг на друга несколько анимаций, влияющих на одно и то же свойство. Доступны режимы: replace (заменить), add (добавить) и accumulate (накопить).

3. Иммутабельные методы массивов
toReversed(), toSorted() и toSpliced() — новые методы, которые возвращают новый массив с изменениями, не трогая исходный. Это шаг к более чистому и предсказуемому функциональному программированию на JavaScript.

🖥 January 2026 Baseline monthly digest

📱 @dev_notes_ru

#Baseline #Frontend
Post #1731 218
Понижаем приоритет группы CSS-правил с помощью @layer

Управление приоритетами CSS-правил — одна из ключевых задач при поддержке проекта любого масштаба. Традиционные методы (контроль порядка подключения, повышение специфичности) не всегда эффективны, особенно при работе со сторонними библиотеками или унаследованным кодом.

Альтернативный подход — использование каскадных слоёв (@layer). Помещение "базовых" стилей (например, reset.css) в отдельный слой гарантирует, что они будут уступать основным правилам проекта, написанным вне слоя.

В статье рассматриваются:

✅ Три типовых сценария для применения этой техники.
✅ Особенности интеграции слоёв в существующую архитектуру.
✅ Специфика работы !important внутри каскадного слоя.

Будет полезно всем, кто стремится выстроить чистую и предсказуемую CSS-архитектуру.

🖥 Читать статью

📱 @dev_notes_ru

#CSS #Frontend
  • 🔥 1
Post #1730 222
Зачем нужен figcaption, если есть alt

При верстке изображений у разработчиков часто возникает вопрос: чем отличается атрибут alt от элемента <figcaption> и можно ли их использовать взаимозаменяемо? На первый взгляд оба элемента отвечают за описание, но их функции принципиально различаются.

О чем статья:

✅ alt — это замена изображения для тех, кто не может его увидеть (пользователи скринридеров, отключенные изображения).
✅ <figcaption> — это видимая подпись, поясняющая роль изображения в тексте для всех читателей.
✅ Простой тест, который поможет определить, нужна ли изображению подпись или достаточно грамотно заполненного alt.

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

🖥 Читать статью

📱 @dev_notes_ru

#A11y #HTML #Frontend
  • 👍 1
  • 🔥 1
Post #1729 228
Атрибуты и свойства HTML: в чём разница

Распространённая ситуация: разработчик пытается прочитать значение поля ввода через getAttribute('value'), но получает не актуальные данные, введённые пользователем, а первоначальное значение из HTML-разметки.

Это не ошибка JavaScript, а следствие фундаментального различия между атрибутами и свойствами DOM. Атрибуты — это исходные параметры, заданные в HTML (чертёж элемента). Свойства — это текущее состояние DOM-объекта в памяти браузера (реальность). И они могут расходиться.

В новой статье детально разбирается:

✅ Почему input.value и getAttribute('value') ведут себя по-разному.
✅ Как работает defaultValue и для чего он нужен.
✅ Особенности логических атрибутов (checked, disabled).
✅ Что важно знать о свойствах и атрибутах разработчикам на React.

Материал будет полезен как начинающим, так и опытным разработчикам, желающим систематизировать знания о DOM.

🖥 Читать статью

📱 @dev_notes_ru

#HTML #JavaScript #DOM #Frontend
  • 🔥 2
  • 👍 1
Post #1728 257
URL Pattern API: Руководство по нативной маршрутизации в JavaScript

Обработка URL — одна из типовых задач как на клиенте, так и на сервере. Традиционный подход с ручным разбором строк быстро становится громоздким при появлении опциональных параметров или вложенных путей.

С сентября 2025 года у JavaScript-разработчиков появился встроенный инструмент для этой задачи — URL Pattern API. Он предоставляет единый синтаксис для валидации URL и извлечения параметров, который работает во всех современных браузерах и в Node.js/Deno/Bun.

В статье подробно разбираются:

✅ Синтаксис шаблонов: именованные группы, модификаторы, регулярные выражения.
✅ API: методы test() для проверки соответствия и exec() для извлечения данных.
✅ Практика: примеры использования в Service Worker, SPA и серверном приложении.

Также в материале затронуты вопросы производительности и ограничения использования API для высоконагруженных серверных проектов.

🖥 Читать статью

📱 @dev_notes_ru

#JavaScript #WebAPI
  • 🔥 2
  • 👍 1
Older posts →

About this channel

How can I read @dev_notes_ru without a Telegram account?
TGViewer shows the public web preview Telegram publishes for Заметки разработчика: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does Заметки разработчика have?
Заметки разработчика (@dev_notes_ru) has 458 subscribers on Telegram, refreshed roughly every 30 minutes.
Does Заметки разработчика know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →