Although a 'visually appeasing' frontend application is not really a requirement for most of our coding bootcamp projects, as a creative, I just can't help myself sometimes. Even as a junior engineer, I believe the overall user experience is important.
For my recent project, Buckit, a bucket list management app, I wanted to step it up a little by adding some background images to the app. I'm no css expert, but I found a hacky way to add background images using MUI:
import Box from '@mui/material/Box';
import sky1 from '../images/sky1.jpg';
<Box
style={{
backgroundImage: `url(${sky1})`,
backgroundSize: "cover",
height: "100vh",
....
}}>
Looking good, but moving slow
Unfortunately, immediately after adding the images, the performance of the site was very noticeable. Directing between pages would take a few seconds to load the background and since this project was using Rails authentication between routes, I figured my application just needed a few more seconds to think.
Creating a (DRY) Loading Page
Since adding these background images were just a 'nice to have' and a bit out of scope, I didn't want to go down a rabbit hole trying to make the site overly efficient --(we can come back and do that later). However, the question still remained --how can I create a simple loading page while keeping my code clean?
That's when I discovered React.lazy.
The React.lazy function lets you render a dynamic import as a regular component...
After reading react's documentation, I got to work on my application!
Refactoring my App.js file
I started by importing Suspense from React in my App.js file:
import React, { Suspense } from 'react';
Next, I removed my importing components and assigned them to variables instead using the React.lazy feature.
Before:
import React, { Suspense } from 'react';
import Home from './containers/Home';
import Item from './containers/item/Item';
import Items from './containers/item/Items';
function App() { ...
After:
import React, { Suspense } from 'react';
function App() {
const Home = React.lazy(() => import('./containers/Home'));
const Item = React.lazy(() => import('./containers/item/Item'));
const Items = React.lazy(() => import('./containers/item/Items'));
....
Lastly, I wrapped everything in the Div in the Suspense component imported from React.
function App() {
const Home = React.lazy(() => import('./containers/Home'));
const Item = React.lazy(() => import('./containers/item/Item'));
const Items = React.lazy(() => import('./containers/item/Items'));
return (
<div className="App">
<Suspense fallback={<div>Loading...</div>}>
<UserProvider>
<Navbar />
<Routes>
...
</Suspense>
</div>
For now, I just went with a 'Loading...' placeholder as the fallback --but it's cool to know that you can design a custom loading page in the future if you want
& that's it! SO EASY. A few line changes in ONE file. No refactoring my Routes, no impacts on my context or the rest of my application.
Now, when the page is loading you'll see the small 'Loading...' text for a split second. Thanks React!

Top comments (1)
Hi Breon,
Thanks for this informative article. Would you like to publish your articles for a top tech solution provider?