DEV Community

Cover image for Error with useEffect in Next.js? Understand when to use it "use client"
Werliton Silva
Werliton Silva

Posted on

Error with useEffect in Next.js? Understand when to use it "use client"

Module not found: Can't resolve 'fs'

Se esse erro apareceu quando você tentou usar useEffect, saiba que a culpa não é do seu código — é da forma como o Next.js trata componentes por padrão.

👀 O que aconteceu?

Você provavelmente tentou isso:

useEffect(() => {
  setTimeout(() => {
    console.log("executado");
  }, 1000);
}, []);

Enter fullscreen mode Exit fullscreen mode

E viu algo como:

Module not found: Can't resolve 'fs'
Enter fullscreen mode Exit fullscreen mode

ou

Module not found: Can't resolve 'tls'
  1 | import net from 'net'
> 2 | import tls from 'tls'
Enter fullscreen mode Exit fullscreen mode

O motivo:
no Next.js 13+ (com App Router), todos os componentes são Server Components por padrão — ou seja, eles rodam no servidor, onde hooks como useEffect e window nem existem.


🧠 A solução: "use client"

Se o seu componente precisa de:

  • useState, useEffect, useRef, etc.
  • Acessar window, localStorage, navigator
  • Lidar com eventos, DOM, cliques, animações…

Você precisa declarar no topo:

"use client";
Enter fullscreen mode Exit fullscreen mode

✅ Quando usar "use client"

1. Interatividade (estado, eventos)

"use client";
import { useState } from "react";

export default function LikeButton() {
  const [liked, setLiked] = useState(false);
  return <button onClick={() => setLiked(!liked)}>{liked ? "💖" : "🤍"}</button>;
}

Enter fullscreen mode Exit fullscreen mode

2. Hooks como useEffect ou libs do navegador

"use client";
import { useEffect } from "react";

export default function Tracker() {
  useEffect(() => {
    console.log("Rodou no navegador");
  }, []);

  return <p>Componente com efeito colateral</p>;
}

Enter fullscreen mode Exit fullscreen mode

❌ Quando não usar "use client"

1. Leitura de dados (fetch, fs, Prisma...)

Esses devem permanecer como Server Components:

export default async function Dashboard() {
  const data = await fetchData();
  return <div>{data.title}</div>;
}
Enter fullscreen mode Exit fullscreen mode

2. Componentes puros e estáticos

Evite "use client" se seu componente:

  • Só renderiza props
  • Não tem lógica de browser
  • Não precisa de interatividade

Menos JS enviado ao navegador = mais performance.

🪄 Simulando um loading com Suspense

Você quis usar useEffect só para um setTimeout? Faça assim no servidor:

// DelayedComponent.tsx
export default async function DelayedComponent() {
  await new Promise((res) => setTimeout(res, 1000));
  return <div>Conteúdo após 1s</div>;
}
Enter fullscreen mode Exit fullscreen mode
// page.tsx
import { Suspense } from "react";
import DelayedComponent from "./DelayedComponent";

export default function Page() {
  return (
    <Suspense fallback={<div>Carregando...</div>}>
      <DelayedComponent />
    </Suspense>
  );
}
Enter fullscreen mode Exit fullscreen mode

Sem useEffect, sem "use client", e tudo funcionando 💨.

🚀 Conclusão

Se o componente usa hook, DOM ou eventos → "use client"
Se não, deixe server e aproveite os benefícios do Next.js.

Bora trocar ideia?

Se esse artigo te ajudou a entender melhor como o Next.js funciona por baixo dos panos, deixa um like aqui, compartilha com a galera do time e me chama no LinkedIn se quiser trocar ideia sobre frontend, React e mercado de trabalho.

🔗 werliton-silva
📬 Me manda um "vi seu artigo" e bora conversar!

Top comments (4)

Collapse
 
nathan_tarbert profile image
Nathan Tarbert

nice breakdown, that bit about hooks only working client side tripped me up before too - you think in a few years people will still need this split or will it just get simpler?

Collapse
 
werliton profile image
Werliton Silva

I hope it gets simpler in the future, but the way things are going, NextJs is pivoting and supporting more server-side features. So, I'm a little hopeless, but I hope it gets simpler. Let's wait and see.

Collapse
 
michael_liang_0208 profile image
Michael Liang

Nice post

Collapse
 
werliton profile image
Werliton Silva

Thanks, bro.