Angular — это мощный инструмент для создания сложных веб-приложений. Но, как и в любом другом фреймворке, возникают свои сложности. Одна из таких проблем — это частые перезапуски тяжелых функций в шаблонах, что сильно бьет по производительности. Если приложение начинает тормозить, значит пора задуматься об оптимизации. И здесь на помощь приходит Memoize Pipe, способный спасти ваш интерфейс от лишних вычислений.
Проблема: Повторные вызовы функций
Каждый раз, когда Angular проверяет изменения, он повторно вызывает функции в шаблоне, игнорируя предыдущий результат. Это может стать проблемой, когда дело касается сложных вычислений или обращений к API.
@Component({ ... template: ` {{ heavyComputation(person, index) }} `, }) export class AppComponent { heavyComputation(name: string, index: number) { // Очень тяжелые вычисления } }
Решение: Memoize Pipe для повышения производительности
Создавать отдельный pipe для каждой функции не всегда удобно, особенно если функция больше нигде не используется. Хочется универсального и гибкого решения, и именно это предлагает Memoize Pipe. Он позволяет запоминать результаты функций, избегая их повторного вызова, если входные данные остались неизменными. Это снижает нагрузку на приложение и улучшает производительность.
Пример использования:
Изначально у вас есть шаблон с вызовом функции:
@Component({ ... template: ` {{ heavyComputation(person, index) }} `, }) export class AppComponent { heavyComputation(name: string, index: number) { // Очень тяжелые вычисления } }
Теперь добавим мемоизацию:
Установим библиотеку:
npm i @ngx-rock/memoize-pipe
Затем импортируем FnPipe и используем его в шаблоне:
@Component({ ... template: ` {{ heavyComputation | fn : person : index }} `, }) export class AppComponent { heavyComputation(name: string, index: number) { // Очень тяжелые вычисления } }
Теперь Angular не будет каждый раз пересчитывать функцию, если значения её аргументов не изменились (примитивы и ссылки для массивов и объектов).
Сохранение контекста this
Если ваша функция зависит от переменных компонента, то нужно сохранить контекст. Это можно сделать с помощью стрелочной функции:
@Component(...) export class AppComponent { heavyComputation = (name: string, index: number) => { // Очень тяжелые вычисления } }
Поддержка standalone модулей
Последние версии Memoize Pipe реализованы в виде standalone модулей.
import { FnPipe } from "@ngx-rock/memoize-pipe"; @Component({ ... standalone: true, imports: [ FnPipe, ... ] ... }) export class AppComponent { ... }
Заключение: Простая оптимизация — ощутимый результат
Когда речь идет о производительности, порой самые простые решения оказываются наиболее эффективными. Memoize Pipe — это как раз такое решение: оно помогает уменьшить количество вызовов функций, ускоряя работу приложения. Помимо этого упрощает процесс написания кода.
ссылка на оригинал статьи https://habr.com/ru/articles/845782/
Добавить комментарий