React Suspense allows you to easily add code-splitting into your application by lazy loading certain components, replacing them with something else until they've download.
Before code-splitting, your webpack build might generate a single file for all of your application code.
Imagine a React application with multiple pages and components. One of these pages is MyPage.
import React from "react";
import HeavyComponent from "./HeavyComponent";
const MyPage = () => (
<div>
<h1>I am the page</h1>
<HeavyComponent />
</div>
);
export default MyPage;
Let's lazy load the HeavyComponent
so it's code isn't downloaded by the browser until a visitor hits MyPage
for the first time.
import React, { Suspense, lazy } from 'react';
const HeavyComponent = lazy(() => import('./HeavyComponent');
const MyPage = () => (
<div>
<h1>I am the page</h1>
<Suspense fallback={<p>Loading...</p>}>
<HeavyComponent />
</Suspense>
</div>
);
export default MyPage;
HeavyComponent now gets split into a seperate chunk with a numbered filename in your build directory e.g. 1.js
Better filenames with webpackChunkName
1.js isn't a very helpful filename. Fortunately with webpackChunkName
in an inline comment, we can instruct webpack to name the file something much friendlier.
const HeavyComponent = lazy(() => import(/* webpackChunkName: "HeavyComponent" */ './HeavyComponent');
Now the chunk will be named HeavyComponent.js