React Navigation ou Expo Router: qual escolher para o react native
11 min11 minutos de leitura
11 min11 minutos de leitura
Autor(a)
Mikael Diniz
Atualmente estou cursando Ciência da Computação na UFMA, sou apaixonado por programação, games, matemática, basquete, programação competitiva e LeetCode.
Inscreva-se em nossa Newsletter
Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.
Um app, em boa parte das vezes, não é composto só por uma tela, mas sim, diferentes telas que são compostas por diversos componentes. Por isso a importância da navegação, para que se tenha uma conexão entre essas telas.
No ecossistema do React Native, duas das opções mais populares para navegação são o React Navigation e o Expo Router.
Neste artigo, vamos explorar as diferenças dessas duas tecnologias e ajudar você a fazer a melhor escolha para o seu projeto.
O que é o React Navigation?
Se você já aprendeu React.js para web, provavelmente já deve ter visto o React Router.
O React Navigation tem uma proposta parecida, mas adaptada para o ambiente mobile, com as mesmas facilidades de navegação, porém com recursos extras, como o controle de gestos e animações específicas para apps móveis.
O React Navigation é uma das bibliotecas mais populares para navegação em React Native e pode ser utilizado tanto em projetos React Native puros quanto em projetos baseados no Expo.
Ah, você prestou atenção nesse último ponto? Sim, o React Navigation é compatível com projetos Expo também, e isso não é só uma coincidência.
Na verdade, isso se deve principalmente ao fato de o Expo Router (que vamos explorar daqui a pouco) utilizar como base para sua construção o próprio React Navigation.
É isso aí dev, nada acontece por acaso. Mas agora, que tal analisarmos o React Navigation na prática?
Implementação com React Navigation
Vamos criar um aplicativo que terá duas telas: uma tela inicial que exibe uma lista de pessoas usuárias e uma tela de detalhes que apresenta informações sobre a pessoa selecionada.
Nós iremos utilizar o Expo para inicializar o projeto execute o comando:
npx create-expo-app@latest MeuApp
Após criar o projeto, entre na pasta do projeto e digite o comando:
npm run reset-project
Caso apareça essa pergunta: "Do you want to move existing files to /app-example instead of deleting them? (Y/n)", responda com "n", isso fará com que todo o template inicial seja descartado.
Também será necessário instalar as dependências necessárias para a navegação. Para isso, execute:
Recomendo que você renomeie os arquivos index e layout para o formato .jsx, porque nesse projeto não iremos utilizar Typescript, também iremos fazer a criação de uma pasta de screens que será responsável por armazenar as telas do nosso app.
Para configurar a navegação no React Navigation, dentro do arquivo _layout.jsx, é necessário importar os componentes e definir a estrutura de navegação utilizando um Stack.Navigator.
Como no nosso app teremos apenas uma tela de Home e Details, o nosso _layout.jsx irá ficar da seguinte forma:
Agora, podemos criar de fato a tela de home e de details. a HomeScreen irá conter um botão que redireciona a pessoa usuária para a DetailsScreen, passando o userId e o email ao navegar para DetailsScreen:
Com o app já criado, para inicializá-lo, utilize o :
npx expo start
Lembre-se que caso queira abrir em um dispositivo android deve utilizar um dispositivo físico ou ter um emulador instalado e executando.
Pronto, conseguimos inicializar um projeto com React Native e utilizar o React Navigation nele.
Agora, chegou o momento de conhecermos o Expo Router!
O que é o Expo Router?
O Expo Router é uma das maneiras mais utilizadas para implementar a navegação em apps desenvolvidos no ambiente Expo.
Ele se baseia no conceito de navegação por arquivos, o que torna a estrutura do código mais intuitiva.
Sua principal vantagem está na configuração automática dentro do Expo, reduzindo a necessidade de ajustes manuais e simplificando a implementação.
Além disso, sua abordagem baseada em URLs facilita a integração com deep linking e torna a passagem de parâmetros mais direta.
Para quem está começando no desenvolvimento de aplicativos, essa pode ser uma excelente opção por ser mais simples e rápida de configurar.
Agora usando o Expo Router, vamos implementar o mesmo app que fizemos utilizando o React Navigation.
Implementação com Expo Router
Novamente, iremos utilizar o Expo, para inicializar o projeto execute o comando:
npx create-expo-app@latest MeuApp
Após criar o projeto, entre na pasta do projeto e digite o comando:
npm run reset-project
Recomendo que você renomeie os arquivos index e layout para o formato .jsx, porque nesse projeto não iremos utilizar Typescript, também faremos a criação de uma pasta de screens que será responsável por armazenar as telas do nosso app.
Aqui no Expo Router criamos apenas a tela de detalhes e usar o index como home, mas fique à vontade para criar uma outra tela.
Nosso app ficará com a seguinte estrutura de pastas:
O arquivo _layout.jsx é responsável por definir o layout e a navegação do aplicativo. Ele organiza a estrutura da página, como cabeçalhos, menus e rodapés, e gerencia como a pessoa usuária navega entre as telas.
Fazendo com que o visual e a navegação sejam sempre os mesmos, sem precisar configurar tudo em cada página, além de facilitar a manutenção do app, pois qualquer mudança no design ou na navegação pode ser feita de uma vez, de forma centralizada.
No nosso app, o arquivo _layout.jsx irá ficar da seguinte maneira:
Na tela inicial (index.js), é possível criar links para as telas de detalhes. Diferente do React Navigation, aqui utilizamos o componente Link do Expo Router para navegar entre as telas, funcionando de maneira semelhante a links em uma página da web. Agora, vamos criar a tela de detalhes.
Adicionamos uma animação de fade-in para mostrar que o Expo também suporta animações.
Porém, as transições são mais limitadas, com poucas opções de personalização e, dependendo do que você precisa para o seu app, o Expo Router pode não oferecer toda a flexibilidade necessária.
Já no React Navigation é diferente, ele permite ter quase total controle na criação de animações, como no exemplo a seguir:
Neste código, criamos uma tela inicial (HomeScreen) com animações de fade-in e escala utilizando o Animated do React Native. Ao carregar a tela, a opacidade passa de 0 a 1 e a escala de 0.8 a 1, criando uma transição suave.
Viu só? Com React Navigation, podemos, de fato, montar uma animação exatamente como quisermos, como se fosse um quebra-cabeça.
Claro, aqui exploramos principalmente as animações, mas esse ganho em personalização do React Navigation está presente também em outras etapas que compõem a estrutura de navegação.
"Ah, já sei, devo sempre usar React Navigation!"
Calma! Aqui mostramos algumas limitações do Expo Router, mas também vimos o quanto ele simplifica a configuração da navegação.
No final, a decisão vai depender do contexto e das necessidades do seu projeto! Se está começando agora e quer evitar configurações complexas, o Expo Router pode ser um ótimo ponto de partida. Se precisar de mais controle sobre animações e outros aspectos que compõem a navegação do seu app, o React Navigation será mais adequado.
Conclusão
Este artigo tem como principal referência as documentações de cada uma dessas tecnologias: