If you’re a developer without design expertise, or if you work at a company where the designers are stretched thin, it is easy to make any internal dash you are building look hideous. And no matter how great the functionality, if it looks terrible, your team won’t use it. On the flip side, you may have styled a beautiful component, but if it lacks crucial functionality — like accessibility or efficient data display — it will be useless.

Step in React component libraries. A React component library is a collection of styled React components that you can use in your React applications to save time, add functionality, increase efficiency, and make the app look great. Most React component libraries are open source, which means they’re free and (often) constantly improving. They’re generally optimized for efficiency, responsive, based on strategic design principles, and some are even optimized for mobile.

This article will list six of our favorite React component libraries in 2020, present some of their best features, and help you decide which library is the right one, based on your needs.

Our Favorite React Component Libraries and Their Features


Each library in this list will include:

  • A screenshot of some popular components in the library
  • A link to the library’s GitHub along with the current (at the time of writing) number of stars
  • The number of React components included in the library
    • Most libraries have a number of components that include Buttons, Iconography, Typography, Layout, Navigation, Data Entry, Data Display, and Feedback/Alerts
  • A list of compatible browsers
  • A code snippet showing how to use the library in a React app

Ant Design: most popular on GitHub

Screen-Shot-2020-06-24-at-4.38.53-PM

To kick off this list, we’re starting with Ant Design, the most popular React component library on GitHub. Self-described as enterprise-level design, the Ant Design library is based on four design principles:

  1. Natural — users should be able to easily intuit how to interact with the design.
  2. Certain — designs are created with thought and purpose.
  3. Meaningful — every design is made with the purpose of helping the user accomplish their mission.
  4. Growing — designs will evolve over time to better meet the needs of the user.

These principles were established in order to help their engineering teams make quick iterations on their product while keeping in sync with design and maintaining a great UX. Extra fun fact: We use Ant icons in Retool!

  • GitHub: 61k+ stars
  • Components: 50+
  • Compatible Browsers:
    • IE/Edge
    • Firefox
    • Chrome
    • Safari
    • Opera

Below is a code sample (courtesy of the Ant Design docs) of how you would import and use Button and DatePicker components from Ant Design in a React app.

import { Button, DatePicker } from 'antd';

const App = () => (
 <>
   <Button type="primary">PRESS ME</Button>
   <DatePicker placeholder="select date" />
 </>
);

After running the code above, your output should look something like this:

Screen-Shot-2020-07-15-at-1.05.33-PM

It’s not pretty, but that’s what CSS is for!

➞ Material-UI: Google design principles

Material-UI is a React component library based on Material Design, Google’s design language for user interfaces. If you like Google’s aesthetic — think cards, grid-based layouts, and responsive animations — this is the right library for your frontend.

Additionally, Material-UI components inject only the styles they need and don’t use a global style sheet (though you can use CSS modules, styled-components, or any other kind of styling you like with this library). Users of Material-UI include a lot of companies you have definitely heard of, including NASA, Netflix, and Amazon.

  • GitHub: 58k+ stars
  • Components: 60+
  • Compatible Browsers:
    • IE
    • Edge
    • Firefox
    • Chrome
    • Safari
    • Googlebot

Below is a code snippet (courtesy of the Material-UI docs) of how you would import and use a Button component from Material-UI in a React app.

import React from 'react';
import ReactDOM from 'react-dom';
import Button from '@material-ui/core/Button';

function App() {
 return (
   <Button variant="contained" color="primary">
     Hello World
   </Button>
 );
}

ReactDOM.render(<App />, document.querySelector('#app'));

If you used the above code snippet correctly, you would end up with a “Hello World” button like so:

➞ Fluent UI: Microsoft design principles

If Google isn’t your aesthetic (hey, it’s not for everyone), then Fluent UI – a React component library based on Microsoft’s design principles – might be a good option. This library, formerly known as Office UI Fabric React, has all of the same components that you will recognize (and love?) from Microsoft 365 apps.

  • GitHub: 8.6k+ stars
  • Components: 60+
  • Compatible Browsers:
    • IE 11/Edge
    • Chrome
    • Firefox
    • Safari

Below is a code snippet (courtesy of the Fluent UI docs) of how you would import and use the PrimaryButton component from Fluent UI in a React app.

import React from 'react';
import ReactDOM from 'react-dom';
import { PrimaryButton } from '@fluentui/react/lib/Button';

ReactDOM.render(
   <PrimaryButton>I am a button.</PrimaryButton>,
   document.getElementById('root')
);

Using the Fluent UI code snippet above generates the following component:

➞ React Virtualized: best for data

Screen-Shot-2020-06-24-at-6.58.56-PM

React Virtualized is one of those React component libraries that is hyper focused on doing one thing and doing that one thing really well, and that thing is large datasets. Scope is fairly narrow: there are five components in the React Visualized library, Collection, Grid, List, Masonry, and Table.

  • GitHub: 19.3k+
  • Components: 5
  • Compatible browsers:
    • All evergreen browsers
    • Recent mobile browsers for iOS and Android
    • IE 9+ (requires extra custom CSS)

Below is a code snippet (courtesy of the React Virtualized docs) of how you would import and use Column and Table components in a React app.

import React from 'react';
import ReactDOM from 'react-dom';
import {Column, Table} from 'react-virtualized';
import 'react-virtualized/styles.css'; // only needs to be imported once

// Table data as an array of objects
const list = [
 {name: 'Brian Vaughn', description: 'Software engineer'},
 // And so on...
];

// Render your table
ReactDOM.render(
 <Table
   width={300}
   height={300}
   headerHeight={20}
   rowHeight={30}
   rowCount={list.length}
   rowGetter={({index}) => list[index]}>
   <Column label="Name" dataKey="name" width={100} />
   <Column width={200} label="Description" dataKey="description" />
 </Table>,
 document.getElementById('example'),
);

After importing and using the column and table components via the code snippet above, you would end up with an output that includes two columns--name and description--each with one value under them.

It’s not much, but it’s a start!

➞ Rebass: lightweight library

If your main goal is to get started with a simple, lightweight library, then Rebass is the right React component library for you: the entire library comes in at a mere 4KB. The seven main principles behind Rebass state that it should be:

  1. Minimal
  2. Useful
  3. Unopinionated
  4. Flexible
  5. Consistent
  6. Extensible
  7. Themeable

Due to this philosophy (whatever it means), the library has a small number of components included, but these components are built to be customized and extended. Plus, all components come with a basic default theme (AKA they are un-opinionated) but are easily themed (AKA themeable) because Rebass uses theme-specification, a spec for theme objects. You can build a theme using either Theme UI or Styled Theme and it will integrate seamlessly with Rebass.

Below is a code snippet (courtesy of the Rebass docs) of how you would import and use Box, Heading, and Button components from Rebass in a React app.

import React from 'react'
import { Box, Heading, Button } from 'rebass'

export default props =>
 <Box>
   <Heading>Hello</Heading>
   <Button>Rebass</Button>
 </Box>

After you ran the code snippet above, you’d end up with a box that includes a heading with “Hello” and a button with “Rebass.”

➞ Grommet: accessibility features

Accessibility is a critically important but often overlooked part of creating a web app, and it’s how Grommet differentiates as a component library. Grommet is specially made with accessibility features, including keyboard navigation, screen reader tags, and native support for W3c’s WCAG 2.1 spec.

Also, the list of notable users is quite extraordinary, including companies like Uber, Netflix, Boeing, Shopify, Twilio, and even GitHub. Speaking of Github:

  • GitHub: 6.4k+ stars
  • Components: 60+
  • Compatible browsers:
    • IE11/Edge
    • Chrome
    • Firefox
    • Safari

Below is a code snippet (courtesy of the HPE Developer blog) of how you would import and use Grommet and Heading components from Grommet in a React app. Note that is a special Grommet library component that will help with the accessibility features.

import React from 'react';
import { Grommet, Heading } from 'grommet'

function App() {
 return (
   <Grommet className="App">
     <Heading>
       Please work!
     </Heading>
   </Grommet>
 );

}

export default App;

Finally, after running the code in the snippet above to import and use Grommet and Heading, you’d end up with following: