Add the “use client”. O que é esse erro e como corrigir?

Com a nova versão do nextjs 13, muitos desenvolvedores estão se esbarrando com o seguinte erro: Add the “use client” directive at the top of the file to use it. Algumas vezes vindo também acompanhado da seguinte mensagem: Uncaught createContext only works in Client Components.

Uncaught createContext only works in Client Components. Add the "use client" directive at the top of the file to use it

Erro Add the “use client”

Inicialmente vamos entender o que é esse erro e o porque dele acontecer no nosso projeto.

A primeira vista pode parecer algo complexo, principalmente quando resolvemos pesquisar no Google esse erro e acabamos nos deparando com discussões técnicas (em inglês), muitas opiniões e muitas “gambiarras” para resolver. Muitas delas não resolvem o erro de verdade, apenas contornam ele de forma errada e eliminando recursos importantes do NextJs 13.

Primeiramente precisamos entender como funciona essa nova versão do NextJs.
Essa nova versão veio com uma modificação na estrutura do framework e como ele funciona.
Antes usávamos a estrutura src/pages/nossapagina.tsx e usávamos a função getServerSideProps para executar código do lado do servidor e depois devolver atributos para o nosso componente renderizar no frontend. Até a versão do NextJs era essa a abordagem padrão.

Porém na versão 13 do NextJs não usamos mais a estrutura acima, e sim a seguinte estrutura para a mesma página: src/app/nossapagina/page.tsx.
E em vez de usarmos a função getServerSideProps executar código no servidor, basta apenas escrevermos o código dentro da própria page, ficando assim:

const funcaoExemplo = () => {
  console.log('essa função está sendo executada em server-side')
}

export default async function PageTutorial() {

  funcaoExemplo();

  return (
    <main>
      Hello World
    </main>
  )
}

Dessa forma a função funcaoExemplo() está sendo executado em server-side.

Simulando o erro

Agora para simular esse erro, vamos adicionar um useEffect na nossa página, ficando assim:

import { useEffect } from "react";

const funcaoExemplo = () => {
  console.log('Essa função está sendo executada em server-side')
}

export default async function PageTutorial() {

  funcaoExemplo();

  useEffect(() => {
    console.log('página carregada')
  }, [])

  return (
    <main>
      Hello World
    </main>
  )
}

Repare, que ao executar novamente o código, o erro começa a aparecer no nosso console, impedindo inclusive o carregamento da página.

Porque o erro Add the “use client” acontece?

Para entender, basta ter em mente que o conteúdo do arquivo page.tsx é feito para ser executado exclusivamente no servidor, sendo assim, não é possível executar o código useEffect, pois ele depende de elementos do navegador para ser executado, e aqui podemos concluir que o o servidor não tem acesso ao navegador para executar essa função.

Como corrigir?

Ao pesquisar por aí, uma das soluções mais sugeridas é a de adicionar o seguinte trecho de código no início da página: “use client”.

Porém, ao fazer isso, você está “capando” a capacidade do NextJs em executar código no servidor e estará forçando o arquivo page.tsx a ser executado no lado do cliente. E não é bem isso que queremos, certo?

Então o jeito CERTO de fazer isso é o seguinte:

Crie um componente, esse sim será executado no cliente, e importe esse componente no nosso arquivo page.tsx.


Crie uma pasta chamada “components” em src/, e dentro dessa pasta, vamos criar nosso componente onde será executada a função useEffect, ficando dessa forma: src/components/MeuComponente.tsx

'use client';

import { useEffect } from "react";

const MeuComponent = () => {

  useEffect(() => {
    console.log('página carregada')
  }, [])

  return (
    <p>Meu componente</p>
  )
}

export default MeuComponent;

Repare que no componente nos escrevemos o ‘use client’ no início do arquivo, garantindo que nosso componente execute do lado do cliente.

E o arquivo src/app/nossapagina/page.tsx ficará assim:

import MeuComponent from "@/components/MeuComponente";

const funcaoExemplo = () => {
  console.log('Essa função está sendo executada em server-side')
}
export default async function PageTutorial() {

  funcaoExemplo();

  return (
    <main>
      <MeuComponent />
      Hello World
    </main>
  )
}

Removemos o useEffect do arquivo src/app/nossapagina/page.tsx e passamos para o nosso componente src/components/MeuComponente.tsx.

Ao executar o código, o arquivo page.tsx é executado no servidor e o arquivo MeuComponente.tsx é executado do lado do cliente e o erro para de ser exibido.

Conclusão e observações

Esse erro acontece frequentemente ao utilizar algumas bibliotecas de construção de layout, como por exemplo a MUI, a Ant-Design, ou outras bibliotecas do mesmo estilo.

Recomendo a leitura da documentação oficial do NextJs conhecer detalhes sobre essa nova forma de organizar o projeto.

Se você preferir, pode também conferir esse tutorial em vídeo:

Espero que esse tutorial tenha ajudado você a solucionar esse erro.

Siga nosso canal no Youtube e acompanhe os novos posts.

Você pode gostar...