R
Interview Deckreact · next.js · senior/staff
0·0·122
Intermediário FE

Lazy Loading & Code Splitting

Carregar JS só quando necessário. React.lazy + Suspense para componentes. Divisão por rota é o mínimo.

Code splitting divide o bundle JavaScript em chunks menores carregados sob demanda. React.lazy + Suspense carrega componentes dinamicamente. Next.js faz code splitting por página automaticamente. dynamic() do Next.js é o equivalente com suporte a SSR e opção ssr:false para componentes client-only (mapas, editores, charts pesados).

Problema
Bundle único de 2MB que bloqueia o First Contentful Paint. Usuário baixa código de páginas que nunca vai visitar. Componentes pesados carregados mesmo quando o usuário não os acessa.
Solução
Divisão por rota (automático no Next.js). Lazy loading de componentes pesados com dynamic(). Prefetch de rotas prováveis com Link prefetch. Analisar o bundle com @next/bundle-analyzer para identificar o que pesa mais.
Tip
Em Next.js, todo arquivo em app/ já é um chunk separado. O ganho extra vem de lazy-loading componentes pesados dentro da página: editores (Monaco, Quill), charts (Recharts, D3), mapas (Leaflet), e modais raramente usados.
// next/dynamic para componentes pesados
import dynamic from 'next/dynamic'

const Editor = dynamic(() => import('@/components/Editor'), {
  ssr: false,      // editor usa window/document
  loading: () => <Skeleton className="h-64" />
})

const Chart = dynamic(() => import('@/components/Chart'), {
  loading: () => <ChartSkeleton />
})

// React.lazy fora do Next.js
const HeavyModal = React.lazy(() => import('./HeavyModal'))

function App() {
  return (
    <Suspense fallback={<ModalSkeleton />}>
      {isOpen && <HeavyModal />}
    </Suspense>
  )
}

// Analisar bundle:
// ANALYZE=true next build
Q.Qual a diferença entre React.lazy e next/dynamic?
A.React.lazy é padrão do React mas não suporta SSR. next/dynamic é wrapper do Next.js com suporte a SSR e opção ssr: false para componentes que usam APIs do browser. Para Next.js, sempre use dynamic().
Q.Como evitar layout shift ao fazer lazy loading?
A.Definir dimensões fixas no fallback do Suspense (skeleton com mesmo tamanho do componente real). Sem dimensões fixas, o conteúdo "pula" quando o componente carrega, prejudicando CLS.
Q.O que é prefetching e quando usar?
A.Pré-carregar chunks de rotas que o usuário provavelmente vai navegar. No Next.js, Link já faz prefetch automático quando o link entra no viewport. Para prefetch manual: router.prefetch("/rota"). Cuidado com over-prefetching em mobile.
52/122← →