Performance: Client-only modules
This affects page load speed by deferring non-essential JavaScript to client side, improving initial server render and reducing blocking time.
import dynamic from 'next/dynamic'; const BrowserOnlyComponent = dynamic(() => import('browser-only-module'), { ssr: false }); export default function Page() { return <BrowserOnlyComponent />; }
import BrowserOnlyComponent from 'browser-only-module'; export default function Page() { return <BrowserOnlyComponent />; }
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Import client-only module normally | N/A on server, large bundle on client | Multiple reflows if module triggers layout | High paint cost due to blocking JS | [X] Bad |
| Dynamic import with ssr: false | Minimal server DOM, client loads later | Single reflow after load | Lower paint cost, non-blocking | [OK] Good |
MyComponent using Next.js dynamic import?import dynamic from 'next/dynamic';
const ClientOnly = dynamic(() => import('./ClientOnlyComponent'), { ssr: false });
export default function Page() {
return (
Welcome
);
}ClientOnlyComponent renders <p>Loaded on client</p>.ClientOnly loads only on the client, so server renders without it initially, showing a loading placeholder.Loading... is shown. After hydration, ClientOnlyComponent renders <p>Loaded on client</p>. The initial render output includes the heading and loading placeholder.import dynamic from 'next/dynamic';
const Widget = dynamic(() => import('./Widget'));
export default function Home() {
return ;
}import dynamic from 'next/dynamic';
const BrowserOnly = dynamic(() => import('./BrowserOnlyComponent'), { ssr: false });
export default function Page() {
return (
Client-only Example
);
}BrowserOnlyComponent to safely use browser APIs?Pass the test and this pattern moves unknown