Code splitting is a technique for optimizing web applications by breaking down the codebase into smaller, manageable chunks loaded separately. In Next.js, code splitting works closely with dynamic imports.
Dynamic imports use code splitting to break up the application into smaller, on-demand chunks loaded only when needed, improving page load times by initially sending less code.
Strategies for segmenting code:
import dynamic from 'next/dynamic';
import { useState } from 'react';
const Modal = dynamic(() => import('../components/Modal'));
export const GenericComponent = () => {
const [isModalOpen, setIsModalOpen] = useState(false);
return (
<div>
<h1>Welcome to My Next.js App</h1>
<button onClick={() => setIsModalOpen(true)}>Open Modal</button>
{isModalOpen && <Modal onClose={() => setIsModalOpen(false)} />}
</div>
);
};
Good candidates for dynamic imports:
export const HeavyComponent = dynamic(() => import('../components/header'), {
ssr: false,
loading: () => <div>Loading…</div>
});
Next.js 13+ supports React Server Components, which are automatically code-split by default. Dynamic imports are still relevant for client components:
'use client'
import dynamic from 'next/dynamic'
const TrueClientComponent = dynamic(() => import('../components/TrueClientComponent'), { ssr: false })
Each page is loaded as a separate chunk with benefits:
Dynamically import heavy libraries only when needed:
import { useState, useRef } from 'react'
export const PdfComponent = () => {
const pdfLibRef = useRef(null)
const handleInputFocus = async () => {
if (!pdfLibRef.current) {
const jsPdfModule = await import('jspdf')
pdfLibRef.current = jsPdfModule.default
}
}
// ...
}