DEV Community

Cover image for Boosting React app performance
PradeepKumar K 🚀
PradeepKumar K 🚀

Posted on

Boosting React app performance

React is a leading library for building dynamic and interactive web applications. As your React application scales, maintaining performance becomes increasingly crucial. Here are some proven techniques to enhance the performance of your React applications.

Leverage React’s Native Optimizations

Memoization with React.memo

React.memo is a higher-order component that optimizes functional components by preventing unnecessary re-renders. It achieves this by performing a shallow comparison of props.

import React from 'react';

const MyComponent = React.memo((props) => {
  return <div>{props.value}</div>;
});
Enter fullscreen mode Exit fullscreen mode

Optimize with useMemo and useCallback

  • useMemo: Cache expensive calculations to avoid recalculating on each render.
  • useCallback: Cache function references to prevent unnecessary re-creations.
import React, { useMemo, useCallback } from 'react';

const MyComponent = ({ items }) => {
  const total = useMemo(() => items.reduce((sum, item) => sum + item, 0), [items]);

  const handleClick = useCallback(() => {
    // Event handler logic
  }, []);

  return (
    <div onClick={handleClick}>
      {total}
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

Implement Code Splitting

Reduce initial load times by splitting your code into manageable chunks that are loaded on demand.

Dynamic Imports

import React, { Suspense } from 'react';

const LazyComponent = React.lazy(() => import('./LazyComponent'));

const MyComponent = () => (
  <Suspense fallback={<div>Loading...</div>}>
    <LazyComponent />
  </Suspense>
);
Enter fullscreen mode Exit fullscreen mode

Using React Loadable

import Loadable from 'react-loadable';

const LoadableComponent = Loadable({
  loader: () => import('./LazyComponent'),
  loading: () => <div>Loading...</div>,
});

const MyComponent = () => <LoadableComponent />;
Enter fullscreen mode Exit fullscreen mode

Optimize Rendering

Avoid Inline Functions

Inline functions can cause unwanted re-renders due to new references being created on each render.

// Inefficient
<div onClick={() => handleClick()}>Click me</div>

// Efficient
const handleClick = () => {
  // Logic here
};
<div onClick={handleClick}>Click me</div>;
Enter fullscreen mode Exit fullscreen mode

Utilize PureComponent and shouldComponentUpdate

In class components, use PureComponent or shouldComponentUpdate to prevent unnecessary updates.

import React, { PureComponent } from 'react';

class MyComponent extends PureComponent {
  render() {
    return <div>{this.props.value}</div>;
  }
}
Enter fullscreen mode Exit fullscreen mode

Effective State Management

Lift State Up

Consolidate state to the closest common ancestor to minimize redundant prop drilling and re-renders.

Use Context API Wisely

While React's Context API is powerful, it can introduce performance issues if misused. Avoid frequent updates to context values and consider memoizing context values.


Optimizing Lists and Tables

Virtualization

For large lists or tables, use libraries like react-window or react-virtualized to render only the visible items.

import { FixedSizeList as List } from 'react-window';

const MyList = ({ items }) => (
  <List
    height={500}
    itemCount={items.length}
    itemSize={35}
    width={300}
  >
    {({ index, style }) => (
      <div style={style}>
        {items[index]}
      </div>
    )}
  </List>
);
Enter fullscreen mode Exit fullscreen mode

Use Stable Keys

Ensure each list item has a unique, stable key to help React track items and minimize re-renders.

const items = ['apple', 'banana', 'cherry'];
items.map((item) => <div key={item}>{item}</div>);
Enter fullscreen mode Exit fullscreen mode

Optimize Asset Loading

Lazy Load Images

Use libraries like react-lazyload to defer loading of images until they are needed.

import LazyLoad from 'react-lazyload';

const MyComponent = () => (
  <LazyLoad height={200}>
    <img src="path/to/image.jpg" alt="description" />
  </LazyLoad>
);
Enter fullscreen mode Exit fullscreen mode

Compress and Optimize Images

Reduce image sizes using tools like ImageOptim, TinyPNG, or using WebP format for faster loading.

Use Production Builds

Ensure your application runs in production mode, which enables optimizations and minification for better performance.

# Create a production build
npm run build

# Serve the build
serve -s build
Enter fullscreen mode Exit fullscreen mode

Conclusion

Optimizing React applications for performance involves leveraging React’s built-in tools and following best practices. By applying these strategies, you can significantly enhance your app’s responsiveness and efficiency, ensuring a smooth experience for your users.

Top comments (0)