Заметки разработчика
466 subscribers
735 photos
4 videos
1.22K links
Заметки о Frontend, Backend и немного DevOps. В основном о #PHP, #Laravel, #JavaScript, #HTML, #CSS, тестировании и настройке серверов.

https://www.dev-notes.ru

@snakenf
Download Telegram
👩‍💻 jQuery 4.0.0: релиз к 20-летию библиотеки и ключевые изменения

Команда jQuery выпустила первую за почти 10 лет мажорную версию — jQuery 4.0.0, приуроченную к 20-летию библиотеки. Это масштабное обновление, которое модернизирует код, удаляет устаревшие API и вносит ряд изменений ломающих совместимость.

📅 Сроки поддержки браузеров:

jQuery 4.0 перестаёт поддерживать IE10 и старше, Edge Legacy (не-Chromium), очень старые версии iOS, Firefox и Android Browser. Поддержка IE11 пока остаётся, но будет удалена в jQuery 5.0.

⚡️ Ключевые изменения и улучшения:

1️⃣ Удалены давно устаревшие методы (их следует заменить на нативные аналоги):

🔹 jQuery.isArrayArray.isArray()
🔹 jQuery.parseJSONJSON.parse()
🔹 jQuery.trimString.prototype.trim()
🔹 jQuery.type, jQuery.now, jQuery.isNumeric и другие.
🔹 Это сократило размер библиотеки более чем на 3 КБ в gzip.

2️⃣ Модернизация кодовой базы:

🔹 Исходный код переведён с AMD на ES-модули, что улучшает совместимость с современными сборщиками.
🔹 Добавлена поддержка Trusted Types для безопасной работы с HTML под строгими политиками CSP.

3️⃣ Изменения в поведении:

🔹Порядок событий фокуса (focus, blur, focusin, focusout) теперь соответствует актуальной спецификации W3C, а не старому решению jQuery.
🔹Автоматическое добавление "px" к unitless-значениям в .css() сильно ограничено. Теперь px добавляется только к известному набору свойств.
🔹Slim-сборка стала ещё меньше: из неё удалены модули Deferred и Callbacks (размер ~19.5 КБ в gzip), так как в поддерживаемых браузерах (кроме IE11) можно использовать нативные Promise.

🛠 Как обновляться? Важные шаги:

1️⃣ Внимательно изучите официальное руководство по обновлению до версии 4.0.
2️⃣ Используйте плагин jQuery Migrate для выявления проблем в существующем коде.
3️⃣ Если нужна поддержка удалённых старых браузеров (IE10 и др.) — оставайтесь на ветке 3.x.

💾 Ссылки для скачивания:

Полная версия: https://code.jquery.com/jquery-4.0.0.js
Slim-версия: https://code.jquery.com/jquery-4.0.0.slim.js
Через npm: npm install jquery@4.0.0

Это историческое обновление очищает библиотеку от исторического багажа, делая её более современной и ориентированной на будущее. Для новых проектов стоит рассматривать нативные API браузеров, но для поддержки legacy-кода jQuery 4.0 — отличный путь вперёд.

📱 @dev_notes_ru

#jQuery #JavaScript #Frontend #WebDev #jQuery4
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Ленивые итераторы в JavaScript: руководство с примерами

Знаете ли вы, что классическая цепочка items.filter().map().slice(0,10) обрабатывает тысячи элементов, хотя нужны лишь первые десять? Это как перелопатить тонну песка ради щепотки золота.

В статье разбираем нативное решение — хелперы итераторов (Iterator Helpers). Они позволяют:

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

Это меняет подход к оптимизации в JavaScript. Разбираемся, как их внедрять и каких подводных камней избегать.

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

📱 @dev_notes_ru

#JavaScript #IteratorHelpers
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
В Pull Request #58379 для ветки 12.x было добавлено полезное улучшение в HTTP-клиент Laravel. Теперь в объекте Response можно устанавливать флаги для декодирования JSON.

💡 В чём суть

Раньше метод $response->json() просто парсил JSON с настройками PHP по умолчанию. Это могло приводить к скрытым проблемам:

Тихие ошибки: json_decode() по умолчанию молча возвращает NULL при ошибке в структуре JSON, что усложняет отладку.
Потеря данных: PHP может некорректно обрабатывать очень большие числа (например, transaction_id или Snowflake ID из Discord/X), что ведёт к повреждению данных.

Как теперь можно решить
В метод json() добавлен параметр flags. Это позволяет передавать стандартные константы PHP для управления парсингом.

❗️ Сценарии использования

Защита от потери больших чисел (часто встречается в платежных системах и соц. сетях):

$data = $response->json(flags: JSON_BIGINT_AS_STRING);
Большие целые числа будут возвращены как строки, что гарантирует их сохранность.


Строгий режим для отладки:

$data = $response->json(flags: JSON_THROW_ON_ERROR);


При малейшей ошибке в JSON будет выброшено исключение, а не возвращён NULL.

Комбинированный режим для продакшена:

$data = $response->json(
flags: JSON_BIGINT_AS_STRING | JSON_THROW_ON_ERROR
);


И данные целы, и ошибки не пройдут незамеченными.

⚡️ Что изменилось для разработчика

Раньше для такого контроля нужно было вручную парсить $response->body(). Теперь всё решается одним параметром встроенного метода.

Небольшое изменение, которое устраняет целый класс проблем при интеграции с реальными, неидеальными API.

📱 @dev_notes_ru

#Laravel #Laravel12
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
👩‍💻 Управляйте spread-синтаксисом: Практическое применение Symbol.iterator

Что, если ваш объект мог бы быть и структурой с понятными свойствами, и коллекцией для мгновенного разворачивания через ...? Оказывается, в JavaScript это встроенная возможность через Symbol.iterator.

В статье разбираем на конкретной задаче:
🔹 Как работает spread «под капотом» и почему Map разворачивается парами.
🔹 Решаем дилемму «объект или массив» — пишем утилиту, результат которой можно и читать как fileInit.bytes, и подставить в new File(...fileInit).
🔹 Плюсы, минусы и когда это реально нужно — чтобы не усложнять код без дела.

Инструмент мощный, но требует осмысленного применения.

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

📱 @dev_notes_ru

#JavaScript #SymbolIterator #Symbol
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🤔1
🚀 Быстрая загрузка CSS с помощью словарей сжатия

Устали выбирать между быстрой первой загрузкой и моментальными переходами по сайту? Словари сжатия в HTTP/3 решают эту проблему, сокращая объём передаваемых CSS до минимума.

В статье разбираем:
🔹 Как технология устраняет дублирование кода
🔹 Пошаговая настройка
🔹 Стратегия внедрения с fallback для всех браузеров

Это не теория — метод уже работает в Chromium и готов к использованию в production.

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

📱 @dev_notes_ru

#DevOps #CSS
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤔1
👩‍💻 Git Worktree: изолированная работа с ветками и параллельные задачи

Работаете над фичей, но срочно нужен хотфикс? Не хотите терять контекст и грязные файлы?

🚀 Git Worktree создаёт изолированные рабочие директории для параллельной работы над разными ветками! Теперь можно:

Вносить срочные исправления, не трогая основную ветку
Работать над несколькими задачами одновременно
Экспериментировать без риска для продакшена
Тестировать PR и чужие ветки в чистом окружении

📖 В статье:

🔹 Как создать, переместить и удалить рабочее дерево
🔹 Архитектура и принципы работы
🔹 Когда использовать (а когда не стоит)
🔹 Сравнение с git stash и clone
🔹 Ответы на частые вопросы

🔄 Статья была обновлена

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

📱 @dev_notes_ru

#Git #Worktree
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
🚀 Laravel 12.49.0: исправления, улучшения и новые возможности

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

🛠 Исправления ошибок и улучшения

Pagination без total: Исправлена проблема с пагинацией при использовании метода simplePaginate() в связке с withQueryString().
Изоляция шаблонов Blade: Улучшена изоляция скомпилированных шаблонов при параллельном тестировании, предотвращены потенциальные пересечения данных.
Обработка CORS: Добавлена поддержка заголовка Authorization в Allow-Headers по умолчанию в middleware CORS.
Очистка очереди: Исправлена команда queue:prune-batches — теперь корректно удаляются устаревшие записи в таблице job_batches.
Трансляция событий: Устранена ошибка сериализации при использовании моделей с преобразованными атрибутами в каналах трансляции.
Валидация файлов: Валидатор mimetypes теперь корректно обрабатывает файлы без расширения.
Формы и CSRF: Исправлено поведение CSRF-токенов при использовании форм внутри модальных окон и SPA-сценариев.
Оптимизация памяти: Улучшена работа с памятью при обработке больших коллекций в BelongsToMany отношениях.

Новые возможности

Динамические каналы трансляции: Добавлена поддержка динамических (private/presence) каналов трансляции через новый метод channel() в маршрутах.
Кастомные драйверы очередей: Расширена возможность подключения пользовательских драйверов очередей через метод Queue::extend().
Гибкий поиск в Paginator: В Paginator добавлен метод appendsQueryString(), позволяющий тонко управлять параметрами строки запроса.
Улучшенная типизация: Добавлены строгие типы (type hints) и аннотации PHPDoc в классы Pipeline, Conditionable, ValidatedInput.
Локализация сообщений: В сообщениях об ошибках валидации теперь поддерживаются плейсхолдеры с атрибутами перевода.
Интеграция с Horizon: Добавлены события JobProcessing, JobProcessed, JobFailed для улучшенного мониторинга очередей через Horizon.

⚡️ Прочие улучшения

Производительность: Ускорена загрузка сервис-провайдеров за счёт оптимизации кэширования конфигураций.
Тестирование: В TestResponse добавлены методы assertSessionHasErrorsIn() и assertSessionDoesntHaveErrorsIn() для точной проверки ошибок по ключам.
Артизан-команды: В команде make:model появилась опция --pivot для быстрого создания моделей сводных таблиц.
Документация: Обновлены и дополнены PHPDoc-аннотации в классах HttpClient, DatabaseManager, BladeCompiler.

Полный список изменений можно найти в официальном релизе

📱 @dev_notes_ru

#Laravel #Laravel12
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
👩‍💻 Типизация JavaScript: почему JSDoc — это полноценная альтернатива TypeScript

А вы знали, что можно получить все преимущества TypeScript, оставаясь в рамках чистого JavaScript? Всё благодаря JSDoc — системе типизации, которая работает через комментарии. В обновлённой статье:

Добавили больше практических примеров аннотаций
Расширили сравнение рабочих процессов (workflow)
Включили ответы на частые вопросы из комментариев

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

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

📱 @dev_notes_ru

#JavaScript #JSDoc #TypeScript
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
👩‍💻 Типизация JavaScript через JSDoc: Руководство по настройке TypeScript Compiler

Используете JSDoc только для подсказок в редакторе? Тогда вы теряете главное: сквозную проверку типов от локальной разработки до продакшена.

В свежей статье рассматриваем профессиональную настройку системы типов через TypeScript Compiler:

🔹 Как за 5 минут включить проверку типов во всём проекте.
🔹 Автоматическая генерация .d.ts файлов для ваших библиотек.
🔹 Интеграция строгой проверки в CI/CD — код с ошибками не попадёт в main.

Это не хак, а легитимный подход для больших проектов. Если вы до сих пор просто ставите // @ts-check и думаете, что это всё — вам сюда.

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

📱 @dev_notes_ru

#JavaScript #JSDoc #TypeScript
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
👩‍💻 Директива location в Nginx: Полное руководство с примерами

Эффективная и безопасная конфигурация веб-сервера требует чёткого понимания принципов работы директивы location в Nginx. В новом материале представлено полное руководство, охватывающее ключевые аспекты:

Синтаксис модификаторов и алгоритм выбора блоков
Практическое различие между директивами root и alias
Готовые конфигурации для веб-приложений, API и балансировки нагрузки

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

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

📱 @dev_notes_ru

#Nginx #Angie #location #DevOps
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
👩‍💻 Совет по JavaScript: matchMedia()

Знаешь, как в JavaScript проверить, соответствует ли текущий viewport мобильному виду?

Не нужно городить window.innerWidth и слушать resize вручную.

Используй matchMedia — тот же самый медиа-запрос, что и в CSS:

const mq = matchMedia('(max-width: 550px)');

// Текущее состояние
console.log(mq.matches); // true / false

// Реагируем на изменения
mq.addEventListener('change', e => {
console.log('Мобильный?', e.matches);
});


Работает синхронно
Использует те же условия, что и в стилях
Не нужно самому отслеживать ресайз

📱 @dev_notes_ru

#JavaScript #CSS #Frontend
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
Вышла новая версия PHPStan 2.1.38

Этот релиз продолжает курс проекта на постоянное повышение производительности и приносит очередное значительное ускорение анализа.

🔥 Главная новость: еще быстрее!

Разработчикам удалось добиться еще 5–10% прироста скорости работы статического анализатора. Это улучшение — результат масштабной работы по оптимизации, которая ведется уже несколько релизов.

Основные изменения

Исправления ошибок:

Исправлена обработка экранированного символа # в регулярных выражениях в расширенном режиме.
Устранена ошибка в определении типов (type inference) для замыканий (closures), связанная с сокращенными именами функций (Function Normalization and Shortening Rule, FNSR).

Улучшения:

Убрано ограничение на версию PHP для правил, проверяющих атрибут #[\Override].
Улучшен анализ для выражений с New_ при использовании StaticMethodParameterClosureTypeExtension.
Улучшен вывод типов при сравнении результатов двух функций (FuncCall === FuncCall).
Теперь array_merge() не теряет информацию о типах известных ключей (offset-types) массивов.

Оптимизация производительности (основная часть работы):

Большинство изменений в этом выпуске направлены на повышение скорости. Были оптимизированы:

Наследование phpDoc-комментариев (теперь используется рефлексия).
Работа с шаблонными типами (TemplateTypeHelper), постоянными массивами (ConstantArrayType) и пересечениями типов (IntersectionType).
Логика в ImpossibleCheckTypeHelper, CombinationHelper и MutatingScope.
Кэширование результатов для предотвращения повторных вычислений.

Прочие правки:

Исправление сигнатур функций.
Внутренние улучшения кода и тесты.

Скачать обновление и увидеть все изменения можно как обычно на GitHub.

Обновляйтесь и наслаждайтесь еще более быстрым анализом кода! Если вы заметили какие-либо проблемы, сообщайте о них в трекере проекта.

📱 @dev_notes_ru
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
CSS может убивать.

📱 @dev_notes_ru

#CSS #Joke
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3🤣3😁2
Британский код

📱 @dev_notes_ru

#React #Joke
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣1
👩‍💻 Усиление безопасности Docker: Практическое руководство

Знаете, что чаще всего приводит к взлому Docker-контейнеров? Не 0-day уязвимости, а запуск от root и забытые секреты в образах. В статье рассматривается 11 практических шагов для реального усиления безопасности:

Запуск без прав суперпользователя
Сканирование образов на уязвимости
Файловая система в режиме «только для чтения»
Жёсткие ограничения на ресурсы

В статье — готовые примеры Dockerfile, команды и контрольный список перед деплоем.

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

📱 @dev_notes_ru

#Docker #DevOps
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
👩‍💻 Современный JavaScript: группировка данных

Устали вручную группировать массивы? Теперь это встроенная функция! Object.groupBy() — ваш новый лучший друг для сортировки данных по любому строковому свойству.

const tasks = [
{ description: 'Task 1', tag: 'Tag 1', project: 'Project A' },
{ description: 'Task 2', tag: 'Tag 1', project: 'Project B' },
{ description: 'Task 3', tag: 'Tag 2', project: 'Project A' },
];

const tasksByProject = Object.groupBy(tasks, (task) => task.project);
console.log(tasksByProject);


Результат:

{
'Project A': [
{ description: 'Task 1', tag: 'Tag 1', project: 'Project A' },
{ description: 'Task 3', tag: 'Tag 2', project: 'Project A' },
],
'Project B': [
{ description: 'Task 2', tag: 'Tag 1', project: 'Project B' },
]
}


Поддержка: Все современные браузеры и JS-окружения поддерживают этот метод с марта 2024 года.
Для старых платформ доступен полифил через core-js.

🔑 Ключи любого типа: Если нужно использовать в качестве ключа не только строки, но и объекты, числа и другие типы — используйте Map.groupBy().

📱 @dev_notes_ru

#JavaScript #WebDev #Frontend
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
В Laravel предложили стандартизировать PHP-атрибуты

Тейлор Отвелл выступил с инициативой сделать код Laravel более единообразным и современным. В рамках нового PR (Pull Request) предлагается повсеместно внедрить использование PHP 8 атрибутов в качестве основного способа конфигурации вместо свойств класса.

Что это значит?

Раньше для настройки, например, модели или задачи в очереди, использовались свойства класса (properties). Теперь для этого предлагаются нативные PHP-атрибуты, что делает код чище и современнее.

Что можно будет настраивать через атрибуты?

Eloquent-модели: #[Table('users')], #[PrimaryKey('user_id')], #[Hidden(['password'])]
Задачи в очереди (Jobs): #[Connection('redis')], #[Queue('podcasts')], #[Tries(3)]
Консольные команды: #[Signature('mail:send {user}')]
Form Request, Resources, Factories и другие компоненты.

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

Это предложение — важный шаг к единообразию кодовой базы Laravel и полноценному использованию возможностей PHP 8.

Attributes #58578

📱 @dev_notes_ru

#Laravel #PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
Ошибки безопасности VPS и как их исправить

Знаешь, сколько времени нужно ботам, чтобы начать атаковать новый сервер? Меньше минуты. А дальше — сотни попыток подбора паролей и сканирования портов.

Если ты администрируешь VPS, эта статья — обязательный минимум. Здесь нет теории, только конкретные шаги:

Настройка SSH-ключей и запрет root-доступа
Установка Fail2ban и фаервола UFW
Настройка автономных бэкапов

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

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

📱 @dev_notes_ru

#DevOps #Security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
Семантическая диффузия

Термины со временем могут терять точность и размываться. Изначально четкое понятие обрастает трактовками, смягчается или упрощается для широкого употребления.

Это явление — семантическая диффузия.

Эрик Эванс описал её для DDD (Domain-Driven Design). Концепция "ограниченного контекста" стала трактоваться как просто модуль, а "вездесущий язык" — как глоссарий. Суть терминов теряется.

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

Создатели термина не могут контролировать его использование. Можно попытаться защитить определение через книги и статьи, но это лишь замедляет процесс.

Диффузия имеет два последствия:

1. Сложность общения. Без точных терминов сложно вести глубокие обсуждения.
2. Потеря полезных концепций. Ключевые идеи, стоящие за термином, забываются.

Полезный термин может быть утерян. Иногда его можно вернуть, настойчиво используя в первоначальном смысле и поправляя других. Иногда приходится находить новые слова для старой идеи (например, "рефакторинг (в оригинальном смысле)").

Важно помнить: когда термины становятся модными, их исходное значение часто размывается.

📱 @dev_notes_ru
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
Лицензионный аудит зависимостей

А вы знаете, что безобидная сторонняя библиотека может заставить открыть исходный код всего вашего SaaS? Лицензионные риски в PHP-зависимостях — это не юридическая абстракция, а реальная угроза проекту.

В новой статье разбираем:


• Как автоматически находить «опасные» лицензии (GPL, AGPL, SSPL)
• Готовый скрипт для интеграции проверки в GitHub Actions
• Пошаговый план внедрения политики за один день

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

📱 @dev_notes_ru

#PHP #License
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
Как автоматически генерировать сообщения коммитов с помощью Claude

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

Процесс работы

🔹 Скрипт получает изменения (git diff) для индексированных файлов.
🔹 Дифф передается в API Claude (через Anthropic SDK) с запросом создать краткое, информативное сообщение коммита в conventional commits стиле.
🔹 Полученный ответ используется для выполнения коммита.

Пример скрипта на Python

import subprocess
import anthropic
import os

# 1. Получить дифф
diff_output = subprocess.run(
["git", "diff", "--cached"],
capture_output=True,
text=True
).stdout

# 2. Создать промт и отправить в Claude
client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

message = client.messages.create(
model="claude-3-haiku-20240307",
max_tokens=100,
temperature=0,
system="Сгенерируй краткое, информативное сообщение коммита на основе git diff. Используй формат conventional commits (например, feat:, fix:, chore:).",
messages=[
{"role": "user", "content": f"Создай сообщение коммита для этого diff:\n\n{diff_output}"}
]
)

commit_message = message.content[0].text.strip()

# 3. Выполнить коммит
subprocess.run(["git", "commit", "-m", commit_message])
print(f"Коммит создан: {commit_message}")


Ключевые моменты

🔹 Используйте переменную окружения ANTHROPIC_API_KEY.
🔹 Модель claude-3-haiku быстрая и недорогая для этой задачи.
🔹 Промт инструктирует Claude придерживаться формата conventional commits.

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

Альтернативный подход: Husky + скрипт


Для запуска генерации перед каждым коммитом можно использовать хуки Git (например, через Husky).

🔹 Установите Husky: npm install husky --save-dev.
🔹 Активируйте хуки: npx husky install.
🔹 Создайте хук prepare-commit-msg:

#!/bin/bash
# .husky/prepare-commit-msg

# Выполнить скрипт генерации и записать сообщение в файл
python generate_commit_message.py > "$1"


Использование Claude для генерации сообщений коммитов экономит время и улучшает их качество. Локальный скрипт или интеграция с хуками Git делают процесс seamless. Всегда проверяйте сгенерированные сообщения перед отправкой коммита.

📱 @dev_notes_ru

#Git #Commit
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1