Inferno — это высокопроизводительный JavaScript-фреймворк, ориентированный на максимальную скорость обновления виртуального DOM и минимизацию операций с реальным DOM. Одной из ключевых стратегий повышения производительности является мемоизация компонентов и оптимизация рендеринга.
Мемоизация — это техника, позволяющая кэшировать результаты функций для предотвращения повторных вычислений с одинаковыми входными данными. В контексте Inferno мемоизация используется для:
В Inferno для мемоизации компонентов применяются два подхода:
Inferno.memo и
useMemo для функциональных
компонентов.
Inferno.memoInferno.memo позволяет обернуть функциональный
компонент, чтобы он ререндерился только при изменении его props.
Синтаксис выглядит так:
import { memo } from 'inferno';
const ExpensiveComponent = ({ data }) => {
console.log('Ререндер ExpensiveComponent');
return <div>{data}</div>;
};
const MemoizedComponent = memo(ExpensiveComponent);
MemoizedComponent
перерисуется только тогда, когда объект data
изменится.shallow comparison) props. Для
глубокого сравнения можно передать кастомную функцию:const MemoizedComponent = memo(
ExpensiveComponent,
(prevProps, nextProps) => prevProps.data.id === nextProps.data.id
);
Это позволяет избежать ререндеров при изменении незначимых полей объекта.
useMemo и
useCallbackДля вычислений внутри компонента и оптимизации создания функций
используются хуки useMemo и useCallback.
useMemo кэширует результат вычислений:
import { useMemo } from 'inferno';
const Component = ({ items }) => {
const expensiveCalculation = useMemo(() => {
return items.reduce((acc, item) => acc + item.value, 0);
}, [items]);
return <div>{expensiveCalculation}</div>;
};
useCallback мемоизирует функции, чтобы избежать их пересоздания при каждом рендере:
import { useCallback } from 'inferno';
const Component = ({ onClick }) => {
const handleClick = useCallback(() => {
console.log('Клик!');
}, []);
return <button onCl ick={handleClick}>Нажми</button>;
};
Использование useCallback снижает вероятность ненужных
ререндеров дочерних компонентов, которым передаются эти функции как
props.
При рендеринге массивов элементов важно использовать корректные
ключи (key). Inferno использует алгоритм
диффинга, который зависит от ключей для минимизации изменений в DOM:
const List = ({ items }) => (
<ul>
{items.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
id) — оптимальный вариант.Для крупных приложений важно разделять код на части и загружать компоненты по мере необходимости:
import { lazy } from 'inferno';
const LazyComponent = lazy(() => import('./HeavyComponent'));
const App = () => <LazyComponent />;
memo для предотвращения повторных
ререндеров после загрузки.Для анализа рендеринга компонентов в Inferno применяются:
Inferno.options.findDOMNode и консольные логирования
ререндеров.Визуальное отслеживание ререндеров помогает определить узкие места и выбрать правильную стратегию мемоизации.
memo.Эффективное сочетание мемоизации и оптимизации рендеринга в Inferno позволяет создавать высокопроизводительные интерфейсы, минимизировать операции с реальным DOM и обеспечивать отзывчивость приложения даже при больших объемах данных.