Кілька тижнів тому команда Filament звернулася до спільноти з проханням протестувати бета-версії v4 та v5, що мали суттєво підвищити продуктивність складних застосунків. Завдяки вашій допомозі ці оновлення вже доступні у стабільних релізах v4.12.6 та v5.7.6.
Окрім оптимізації, ми випустили оновлення безпеки, що усувають кілька CVE. Якщо ви використовуєте Filament v4 або v5, наполегливо рекомендуємо оновитися, щоб захистити свій застосунок.
А тепер перейдемо до найцікавішого — продуктивності.
# Масштабне підвищення швидкості
Головні герої цього релізу — пакети forms та tables, які отримали колосальний приріст швидкості роботи.
# Forms
Команда провела глибоку оптимізацію рендерингу полів. Результати внутрішніх тестів нас вразили:
| Component | Попередня версія | Поточна версія | Зміни |
|---|---|---|---|
TextInput |
0.559 ms | 0.044 ms | ~на 92% швидше |
Select |
0.634 ms | 0.052 ms | ~на 92% швидше |
FileUpload |
0.586 ms | 0.083 ms | ~на 86% швидше |
Repeater (10 елементів, 2 поля) |
28.077 ms | 2.885 ms | ~на 90% швидше |
Checkbox |
0.314 ms | 0.033 ms | ~на 90% швидше |
Особливу увагу привертає Repeater: прискорення рендерингу на 90% дозволить працювати з великими формами без жодних затримок, навіть якщо кількість елементів постійно зростає.
Як нам це вдалося? Ми замінили значну частину циклів рендерингу Blade-компонентів на прямий виклик через PHP-теги (<?php). Це суттєво зменшило накладні витрати фреймворку для кожного поля та компонента схеми. Детальніше зміни можна вивчити у цьому PR.
Зауважте: наведені цифри — це результати внутрішніх бенчмарків. Реальна швидкість залежить від особливостей вашого проєкту.
# Tables
Ми вже покращували продуктивність таблиць раніше, але у версіях v4 та v5 вирішили піти ще далі. Оновлені таблиці стали ще «чуйнішими»:
| Сценарій | Попередня версія | Поточна версія | Зміни |
|---|---|---|---|
50 рядків, 5 TextColumn, 3 Action на рядок |
27.53 ms | 13.11 ms | ~на 52% швидше |
50 рядків, 5 TextColumn, 1 ActionGroup (3 дії) на рядок |
33.09 ms | 16.73 ms | ~на 49% швидше |
На відміну від форм, де ми відмовилися від частини Blade-компонентів, тут оптимізація тонша. Ми додали легші шляхи рендерингу для типових дій, оптимізували роботу з атрибутами та впровадили кешування прав доступу (authorization) та умов видимості для кожного запису. Повний список змін — у цьому PR.
Найбільший профіт отримають застосунки з великою кількістю рядків, колонок та складними правилами доступу.
# Інші оновлення
Окрім продуктивності, ми підготували кілька корисних функцій для безпеки та зручності розробки.
# Продуктивність
# Обмеження для Query Builder
Нові методи maxRules() та maxNestingDepth() дозволяють лімітувати кількість умов у запитах. Це захищає сервер від надмірного навантаження на CPU та пам'ять, що раніше могло призводити до збоїв при обробці занадто складних фільтрів.
# Безпека
# Очищення CSS-кольорів
Додано хелпер Str::sanitizeCssColor(). Він запобігає ін'єкціям зайвих атрибутів при вставці даних користувача в HTML-атрибут style="".
# Захист від CSV-ін'єкцій
Тепер можна увімкнути автоматичне додавання префікса " до комірок, що починаються з символів =, -, + тощо. Це не дає Excel чи іншим табличним процесорам інтерпретувати текст як формулу. Функція є опціональною, щоб не спотворювати дані на кшталт номерів телефонів.
# Зручність (Quality of Life)
# Групування меню користувача та тенента
Тепер пункти меню можна розділяти на групи для кращої читабельності. Крім того, Filament тепер запам'ятовує (memoize) ці дії в межах одного запиту, що трохи додає швидкості.
# Скасування батьківських дій при закритті модального вікна
Метод modalDismissesParentActions() дозволяє при закритті вкладеного модального вікна автоматично скасовувати весь ланцюжок дій. Це ідеально підходить для багатокрокових процесів, де потрібно перервати весь флоу одним кліком.
# Empty states для віджетів графіків
Тепер для Chart Widgets можна налаштовувати кастомні стани для порожніх даних. Це робить дашборди професійнішими, чітко розділяючи помилку та просто відсутність інформації.
# Дрібні, але корисні покращення
- Click-through модальні вікна — тепер можна взаємодіяти з контентом під модальним вікном або Slide-over.
- Стабільні ключі навігації — прив’язка до батьківських елементів тепер можлива через стабільні ключі, а не лише за назвою, що спрощує переклад та ренеймінг.
- Керування розділенням пошукових термінів — налаштовується окремо для кожної колонки.
- Динамічне приховування колонок при експорті — через closure під час виконання.
- Налаштування XLSX writer — можливість конфігурувати файл (наприклад, додавати заголовки) одразу після відкриття.
- Динамічна ширина панелі та сайдбару — можливість змінювати
maxContentWidth()та ширину Sidebar через closure. - Гнучке керування темною темою — налаштування доступності та перемикача теми в runtime.
# Підсумок
Ми в захваті від цього релізу! Це мінорне оновлення, яке не ламає зворотну сумісність, але приносить величезний приріст продуктивності та купу корисних фіч.
Дякуємо спільноті за допомогу в тестуванні. Разом ми робимо Filament кращим!