Executando verificação de segurança...
12

Pitch: Animação ao mudar de rota no Next.js 13!

Senhoras e senhores, lhes apresento a nextjs-progressloader

A alguns dias atrás, fiz um post comentando minha infelicidade em relação ao depreciamento dos eventos de rotas.
O descontentamento foi tanto que resolvi construir minha própria biblioteca para lidar com a situação, pelo menos quando se trata em chamar outras rotas e não conseguir fazer animação de carregamento na tela.

A biblioteca está em suas primeiras versões, mas já está conseguindo me atender em um grande projeto que estou!

Como usar

Dentro do seu layout root, adicione o componente de animação e, todas as tags link que você clicar, já ativará a animação:

'use client';
import { ProgressLoader } from 'nextjs-progressloader';

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <ProgressLoader />
        {children}
      </body>
    </html>
  );
}

Entretando, as vezes você quer abrir uma rota, dentro de uma função ou em qualquer outro contexto que não esteja usando a tag link diretamente.

Você consegue registrar rotas que irão estar disponiveis em qualquer lugar que você julgar necessário!

Além disso, é possivel registrar tambem um apelido para a rota!

Exemplo:

'use client';
import { ProgressLoader, ContainerLinkProps, ContainerLink } from 'nextjs-progressloader';

const links: ContainerLinkProps["links"] = [
  {
    href: "/",
    nickname: "home",
  },
  {
    href: "/posts",
  },
  {
    href: "/dashboard",
    nickname: "dashboard"
  },
];


export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <ProgressLoader />
        <ContainerLink links={links} />;
        {children}
      </body>
    </html>
  );
}

Você pode adicionar quantos containers quiser, e em qualquer lugar que quiser na sua aplicação!
Se você qusier criar um container global, adicione ele no LAYOUT ROOT DO PROJETO, como no exemplo acima.

Assim, em qualquer lugar que estiver, você pode chamar essa rota, e a animação será executada:

Ex.:

<button className="bg-red-500" onClick={()=> changeRoute("dashboard")}>
  Open dashboard route by nickname
</button>
<button className="bg-red-500" onClick={()=> changeRoute("/dashboard")}>
  Open dashboard route by href
</button>

Caso você queria criar um container para uma rota especifica, fique a vontade! Tudo que precisa ser feito depois é chamar a função changeRoute()

Importante:

  • O paramêtro passado deve ser igual ao nome registrado, seja com href ou com nickname. Caso contrario, não irá funcionar!
  • A disponibilização das rotas dependerá de onde colocar o container, se quiser que o container esteja disponivel em mais rotas, SEMPRE FOQUE EM DEIXA-LAS NOS ARQUIVOS LAYOUT

Essa é uma biblioteca que criei essa semana, ainda tem muitas coisas para melhorar e por isso, peço paciencia da comunidade! Mas é um projeto que estou muito orgulho de estar fazendo
Inclusive, se tiver alguem interssado em ajudar de alguma forma, por favor contate-me!

Mas espero que gostem! Pfv, deixem seus FeedBacks!

Carregando publicação patrocinada...
5

Olá cara, tudo bem?

Desculpe a minha ignorância, talvez eu não tenha entendido direito o proposito ou o problema que você está tentando resolver.

Mas, isso não seria o mesmo que usar o novo loading.tsx do Next.js com um <Suspense>?

Fora que, da forma como você esta fazendo, com uma função changeRoute em um <button>, talvez você esteja perdendo uma das melhores funcionalidades do Next, que é o next/link com <Link/>. Com ele o Next não recarrega a próxima página integralmente, só carrega os chunks necessários e recicla o que já foi baixado e carregado e que na próxima página é igual, reduzinho rede e tempo de carregamento.

Fora que, com o next/link, todos os link que estão na rolagem atual, já são pré-carregados e pré-renderizados em background, para quando algum for clicado, nem dê tempo de aparecer loader nem ver renderização nenhuma, a página nova já explode pronta na tela.

Como disse, não sei se entendi direito seu problema, mas espero ter contribuído para o assunto.

Abraco,
TMJ!

3

Opa, estou bem e você? Gostei dos questionamentos, espero que consiga te ajudar a entender!

Na verdade não seria o mesmo que loading.tsx. O loading é um carregamento 'dentro' do arquivo que você quer renderizar, geralmente usado quado o arquivo ainda não terminou de ser montado completamente.
O objetivo da minha lib é lidar com a transição das rotas!
Quando se clica em um <Link /> apesar de ser rapido as vezes, ainda pode ou não ter delay, e é nesse caso que se faz necessário uma animação de loading/progress loading, por exemplo.

Agora a outra duvida sobre performace, e tall...
Atualmente no Next.js existem algumas formas de você acessar uma rota:

  • Digitando a url
  • Fazendo o direcionamento com a tag
  • Fazendo o uso do hook useRouter()

O que minha biblioteca faz é monitorar quando uma tag link é clicada no seu projeto, por isso ela á iria funcionar 'sempre'.
E quando eu registro um <ContainerLink />, seja em uma rota especifica, ou seja globalmente, tudo o que estou fazendo é criando todos os que você disse precisar.
Então isso não atrapalha o recurso PREFETCH do Next.Js, já que as rotas já estão disponiveis no seu navegador, em algum lugar.
Tudo que o changeRoute() irá fazer é apenas chamar um evento para clicar naquele link que tu queria, de uma meneira bem facilitada.

Então, na verdade a minha lib não atrapalha a performace, ela até melhora se parar para pensar!

O atual useRouter() oferece uma maneira de mudar rotas, mas nenhuma animação aparece na tela mostrando ao usuario que alguma coisa esta acontecendo, já que o recurso de eventos foi depreciado.
O que minha lib oferece com o changeRoute() é justamente isso, uma maneira de você poder transicionar de telas, susbistuindo muitos casos de uso do useRouter() para trocar de rota, e ainda ter uma animação.

Novamente dizendo, quando se registra um <ContainerLink /> é quando você quer chamar uma rota com changeRoute(), com a animação, sem ser diretamente atraves de um tag , que nesses casos, seria quando a pessoa faria o usuo do useRouter(). Chamando uma rota com função.

Realmente espero que consegui esclarecer suas dúvidas, mas se algo ainda ficou nebuloso. Pfv, me pergunte! Abraço

4

Muito legal a ideia! Estou desenvolvendo um projeto em Next e assim que sobrar um tempinho vou testar pra dar meu feedback e se possível contribuir com o projeto.

Uma dúvida, você tem alguma referência explicando como publicar um projeto no NPM?

Valeu!

2

Cara muito obrigado por se dispor em me ajudar!
Mas referente a sua pergunta, eu tenho pouquissimas referencfias. Esse tipo de conteudo de deploy de um projeto, lib, ou coisas que vão meio que além do desenvolvimento, é um pouco dificil de encontrar. Acaba que é na tentiva e erro, sabe?

Inclusive, se tu tiver alguma referência, ou alguma dica do que eu possa fazer, pfv me ensine/mostre kkkk

4

Muito massa sua ideia. Estava procurando uma lib dessa esses dias. Como seria os links do container com rotas tendo parâmetros?

1

Que bom que gostou da minha ideia!

Então,adicionar parâmetro na rota foi justamente uma das features adicionadas na lib hoje!

Quando chamar o changeRoute(), você pode passar um objeto com alguns parâmetros como 'event' e 'param'.
O objeto 'param' aceita uma Array de objetos que aceita essas props:

export interface QueryStringProps {
  query: string;
  value: string;
}

Exemplo:

changeRoute("home", {
   params: [
       {
           query:"page",
           value: "2"
       },
       {
           query:"per_page",
           value: "20"
       }
   ]
})

Saída:

/home?page=2&&per_page=20

1

Bacana! Para routas dinâmicas segue o mesmo princípio? O objeto de links do ContainerLinkProps segue o mesmo em rotas dinâmicas?
Parabéns pela lib!

2

Que bom que gostou! Sobre as rotas dinânimcas: estou trabalhando para adicionar essa feature ainda essa semana!

Assim que tiver pronta, eu te dou um toque

1
3

Adorei a forma que fez a infelicidade e algo "ruim" se transforma em uma lib muito útil. Gostaria de poder ajudar no desenvolvimento, caso precise e queira

1

Cara muito obrigado por ter gostado da ideia da minha lib! Eu ficaria mais do que feliz em ter alguem me ajudando nela!
Estou muito orgulho da minha lib, mas ela ainda está bem no inicio. Exitem recursos que eu gostaria de melhorar e adicionar, e uma mãozinha nesse processo seria incrível!

0
1

Em questão de animação e estilos padrão, eu a usei como base sim pq eu sou pessimo com UI/UX (dificuldade em ter criatividade de pensar no que fazer), mas não é necessariamente a mesma coisa.

Eu usei como base e adicionei as coisas que eu acho interssantes à nivel de funcionaliades e correção de erros.