Creating a complex React root: order and dependencies

by Dan Edwards, 24 June 2024

Creating a complex React root: order and dependencies

When creating a complex React root, it's crucial to understand the dependencies and order of the various providers and libraries being used. This articleData will walk you through setting up a comprehensive React application using multiple providers, ensuring that your application is both robust and maintainable.

Code Overview

Let's look at the oddly shaped code for creating a complex React root:

index.js
JavaScript
1import React from 'react';
2import ReactDOM from 'react-dom/client';
3import { Provider } from 'react-redux';
4import { PersistGate } from 'redux-persist/integration/react';
5import { RouterProvider } from 'react-router-dom';
6import { HelmetProvider } from 'react-helmet-async';
7import { ThemeProvider } from 'styled-components';
8import { IntlProvider } from 'react-intl';
9import { ApolloProvider } from '@apollo/client';
10import { client } from './apolloClient';
11import { store, persistor } from './store';
12import { router } from './router';
13import { theme } from './theme';
14import { messages } from './messages';
15import App from './App';
16
17const render = () => {
18  const root = ReactDOM.createRoot(document.getElementById('root'));
19
20  root.render(
21    <React.StrictMode>
22      <HelmetProvider>
23        <ApolloProvider client={client}>
24          <IntlProvider locale="en" messages={messages}>
25            <ThemeProvider theme={theme}>
26              <Provider store={store}>
27                <PersistGate loading={null} persistor={persistor}>
28                  <RouterProvider router={router}>
29                    <App />
30                  </RouterProvider>
31                </PersistGate>
32              </Provider>
33            </ThemeProvider>
34          </IntlProvider>
35        </ApolloProvider>
36      </HelmetProvider>
37    </React.StrictMode>
38  );
39};
40
41render();

Order and Dependencies

React.StrictMode

HelmetProvider

ApolloProvider

IntlProvider

ThemeProvider

Provider (Redux)

PersistGate

RouterProvider

App Component

By following this order, each provider is correctly set up with its necessary dependencies, ensuring that the application runs properly.