Советы и примеры по улучшению производительности приложения React Native.

Кэш изображений

В React Native у нас есть «Изображение» в качестве основного компонента. Мы можем использовать этот компонент для отображения изображения, но он страдает от нескольких проблем, таких как:

  • Мерцание.
  • Кэш промахивается.
  • Низкопроизводительная загрузка из кеша.
  • Низкая производительность в целом.

Все это может повредить пользовательскому опыту. В этих случаях мы можем получить помощь от «react-native-fast-image». Эта библиотека доступна для всех платформ и работает как по волшебству.

Примечание. Вы должны использовать React Native 0.60.0 или более позднюю версию, чтобы использовать самую последнюю версию react-native-fast-image.

Пример

Шаг 1: Установите библиотеку.

yarn add react-native-fast-image
cd ios && pod install

Шаг 2: Импортируйте и используйте библиотеку.

import FastImage from 'react-native-fast-image'
const YourImage = () => (
    <FastImage
        style={{ width: 200, height: 200 }}
        source={{
            uri: 'https://unsplash.it/400/400?image=1',
            headers: { Authorization: 'someAuthToken' },
            priority: FastImage.priority.normal,
        }}
        resizeMode={FastImage.resizeMode.contain}
    />
)

Другие примеры можно найти здесь.

Запоминаемые значения

Использование useMemo может оптимизировать ваше приложение для реагирования, когда экран часто отображается.

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

  • Запоминаемая функция вернет значение.
  • Массив зависимостей.

Пример

const computeExpensiveValue = (a, b)=>{
  let total = 0;
  for(index=0; index<10000000; index++){
    total += index+a+b;
  }
  return total;
}
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

Как мы видим в примере выше, мы будем вычислять индекс с переменными «a» и «b» 10000000 раз. Обратите внимание, что без помощи useMemo оптимизации мы будем вычислять одно и то же значение для каждого рендеринга, это может замедлить работу вашего приложения React Native. Использование useMemo гарантирует, что мы не будем вычислять одно и то же значение снова и снова для каждого рендеринга экрана и только в том случае, если одна из зависимостей, влияющих на окончательный результат, будет изменена.

Запоминаемые обратные вызовы

Как и useMemo, useCallback может оптимизировать ваше реагирующее нативное приложение, когда экран часто рендерится. useCallback вернет запомненную версию обратного вызова. useCallback принять 2 параметра:

  • Функция для запоминания.
  • Массив зависимостей.

Пример

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b]
);

Как видно из приведенного выше примера, мы передаем встроенную функцию doSomething, которая принимает 2 параметра: «a» и «b». Эти параметры подразумевают, что мы должны включить эти параметры как массив зависимостей. Используя in useCallback, мы гарантируем, что если «a» и «b» не будут изменены, мы не будем создавать одну и ту же функцию для каждого рендера.

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

Избегайте стрелочных функций

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

Почему?

Поскольку каждый раз, когда родитель повторно отображает новую ссылку, функция создается снова. Использование стрелочной функции приведет к тому, что каждый рендер будет генерировать новый экземпляр этой конкретной функции, в результате чего React Native не сможет повторно использовать старые ссылки.

Избегайте этого случая — пример

class AvoidCase extends React.Component {
  // ...
  addTodo() {
    // ...
  }
  render() {
    return (
      <View>
        <TouchableHighlight onPress={() => this.addTodo()} />
      </View>
    );
  }
}

Правильный регистр — пример

class CorrectCase extends React.Component {
  // ...
  addTodo = () => {
    // ...
  }
  render() {
    return (
      <View>
        <TouchableHighlight onPress={this.addTodo} />
      </View>
    );
  }

Спасибо за то, что вы дочитали до сих пор, если вам нравится такой контент, и вы хотите поддержать меня как программиста и писателя, чтобы я писал больше статей, подобных этой, пожалуйста, подпишитесь подписаться на Medium (подписка на 5 долларов США в месяц) по моей ссылке, и вы получите неограниченный доступ ко всему на Medium.

Продолжайте следить за другими примерами и советами по оптимизации React Native.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.