Jhon Eduard Bocanegra Ortiz
HashRouter: Si usamos solo frontend BrowserRouter: Si usamos frontend y backend
Federico Ivan Llano
muy bueno gracias! :D
Jose Tellez
Este comentario está increible, qué buena frase para resumir
Cuando trabajas con React Router Dom v6, te encuentras con tres tipos de routers que cumplen funciones distintas: Browser Router, Hash Router y Memory Router. Saber cuál elegir define cómo se comporta la navegación de tu aplicación y si podrás desplegarla sin errores 404 en servicios como GitHub Pages.
¿Qué tipos de router ofrece React Router Dom v6?
Cada uno responde a un escenario distinto: web tradicional, web sin control de backend o aplicaciones móviles. La diferencia está en cómo gestionan la URL y el estado de la ruta actual [1:00].
¿Cómo funciona el Browser Router?
El Browser Router es el comportamiento normal que ves en la mayoría de sitios. Si entras a platzi.com/blog o platzi.com/cursos, las rutas se diferencian por las barras inclinadas en la URL. Es la opción estándar cuando tienes control sobre el backend que sirve tu aplicación.
¿Cuándo usar Browser Router? Cuando puedes configurar tu servidor para que devuelva siempre el mismo index.html en cualquier ruta, excepto las de la API.
¿Qué hace diferente al Hash Router?
El Hash Router introduce un símbolo # antes de las rutas. En lugar de platzi.com/blog tendrías platzi.com/#/blog. Ese hash se puede leer desde JavaScript en el frontend, y con base en él decides qué componente renderizar [2:30].
La clave aquí es que el navegador y el backend ignoran lo que viene después del #. Para el servidor siempre es la misma ruta, así que nunca se rompe.
¿Para qué sirve el Memory Router?
El Memory Router no usa la URL en absoluto. Funciona con un array interno que guarda en memoria cuál es la ruta actual. No hay una dirección visible que diga dónde estás, es navegación a punta de fe [3:30].
Este router es ideal para aplicaciones móviles nativas o construidas con React Native, donde simplemente no existe una URL que mostrar al usuario.
¿Por qué elegir Hash Router en vez de Browser Router?
La respuesta corta es: cuando no controlas tu backend. Y aquí entra en juego la lógica de las single page applications frente al server side rendering [5:30].
Imagina que despliegas tu app a GitHub Pages. Tu aplicación vive en un único index.html generado por React, con un bundle de JavaScript que contiene toda la lógica. Si un usuario entra directamente a platzi.github.io/curso-intro-react/blog, GitHub Pages busca una carpeta o archivo llamado blog en tu repositorio. Como no existe, devuelve un 404.
¿Por qué GitHub Pages devuelve 404 con Browser Router? Porque su backend busca archivos físicos que coincidan con la ruta, y solo encuentra el index.html original. No sabe que tu app es una SPA.
Con Hash Router, hackeas esa limitación. El servidor siempre sirve el mismo index.html sin importar lo que venga después del #, y tu JavaScript se encarga de leer el hash para mostrar la vista correcta.
¿Existen alternativas a React Router Dom?
Sí, y vale la pena conocerlas para no casarte con una sola herramienta:
Si dominas los fundamentos de cómo funcionan los routers, puedes saltar entre versiones y herramientas sin perderte.
¿Cómo se relaciona esto con SPA y SSR?
Una single page application carga un solo HTML y reescribe la vista con JavaScript. El server side rendering, en cambio, devuelve HTML diferente desde el backend para cada ruta. Si tu deploy no soporta SSR ni redirecciones a un index.html común, el Hash Router se vuelve la salida limpia [7:00].
En la próxima clase vas a usar Hash Router dentro de la aplicación que ya tiene React Router Dom 6 instalado con Create React App, y vas a montar la estructura de componentes necesaria para que la navegación funcione sin romperse al desplegar.
¿Ya decidiste qué router vas a usar en tu próximo proyecto? Cuéntame en los comentarios cuál escogiste y por qué.
Jhon Eduard Bocanegra Ortiz
HashRouter: Si usamos solo frontend BrowserRouter: Si usamos frontend y backend
Federico Ivan Llano
muy bueno gracias! :D
Jose Tellez
Este comentario está increible, qué buena frase para resumir
Nicolás Chamorro Girón
Felipe Morales Torres
Siento que el profe se va a dislocar el hombro cada que hace el símbolo del slash / 😂
Mariano Gastón Paduani
jajajajaja
Ignacio Basilio
Harold Zurita Simon
BrowserRouter vs. HashRouter
. React router DOM en su versión 6 tiene 3 tipos de router: .
/slug. Es decir que utilizamos los slash / y algo más para indicar la ruta que queremos acceder.
./#/slug. En vez de tener directamente el slash al principio de la diferencia de todas las rutas con las unas con otras, primero tendremos un hashtag # al principio de la url y luego empezamos a poner los slash y el resto de rutas.
..
La diferencia crucial entre Browser Router y Hash Router es que los hashes podemos leerlos desde javascript, desde el frontend y pues guiarnos por hash para saber que ruta renderizar en vez de tener la locación completa o endpoint.
.
Para web es común utilizar el Browser Router o el Hash Router, sin embargo hay una alternativa más a React Router DOM que es React Navigation. Esta es muy popular en aplicaciones móviles para React Native.
.
La razón por la que utilizamos Hash Router se debe a que al desplegar una aplicación en github pages, nosotros no tendríamos el control sobre el backend que decide qué renderizar para nuestro frontend.
.
Es decir, cuando entramos a la ruta principal de nuestra aplicación, por ejemplo user.github.io/curso-react; la ruta principal donde vive nuestra aplicación es ese index.html que generamos gracias a React que tiene código javascript, un script y un bundle donde está todo el código para que funcione nuestra aplicación.
.
Si a esta ruta le aumentamos navegación, por ejemplo user.github.io/curso-react/blog; entonces como github pages tiene su propio backend y no encuentra ninguna carpeta de blog, ni un archivo blog.html, pues entonces nos va devolver un 404.
.
Básicamente, lo único que sabe github pages es que existe un archivo index.html, una vez que lo haya encontrado y entramos a esa ruta, vamos a renderizar ese archivo.
.
Si cambiamos la ruta con slashes no va a funcionar, en cambio debemos de utilizar el Slash Navigation el cual nos permite eludir el poco control del backend que se tiene. Por lo cual, le decimos que siempre nos renderice el mismo index.html, sin embargo voy a poner algunos hashes que no van a significar una ruta diferente sino que voy a tener distintas rutas con base en el hash.
.
Entonces si a esta ruta le ponemos un slash user.github.io/curso-react/#/slug, ya no importa que le ponemos después del slash, eso ya no va a ser una ruta diferente, sino que va a cambiar el hash manteniendo el mismo index.html porque estamos trabajando con una SPA y no tenemos control sobre el backend.
.
En caso de no utilizar github pages, teniendo una SPA en realidad desde el backend no voy a renderizar el contenido. Simplemente voy a tener la API y voy a renderizar siempre al mismo index.html, por lo que mi backend ya está configurado para que todas mis rutas excepto las del API siempre rendericen el mismo html y por lo tanto con el código javascript va a poder leer la ruta sin que nos salga el 404.
Remix Zapata
HashRouter VS. BrowserRouter VS. MemoryRouter
Aunque los 3 hacen los mismo, tienen un diferente caso de uso.
HashRouter: Se usa especialmente para cuando tengas que hacer tu aplicación, pero sin usar backend, solo frontend.
Su Modo de uso es:
/#/home
BrowserRouter: Este es el más usado, y el más cómodo si haces una aplicación completa, tanto frontend y backend.
Su Modo de uso es:
/home
MemoryRouter: Este es el más extraño porque, tu aplicación va a empezar a cambiar de ruta pero sin modificar la url y, exacto, ¡es lo mismo como sucede en una aplicación móvil!
Su Modo de uso es:
/para todas las rutas
Stiven Andres Medina Lopez
Alguien podria indicarme la diferencia entre <BrowserRouter> y createBrowserRouter?
Juan Castro
ProfesorSon equivalentes, la diferencia es la forma en que se definen las rutas (en JSX vs. en objetos): https://reactrouter.com/en/main/routers/create-browser-router
Carlos Rodríguez
Hola profe, si tengo una aplicación separada una parte backend con las api para que el frontend las consuma, entonces si utilizo el BrouserRouter tendré problemas? Si es sí, como se soluciona sin usar el HashRouter?
Rodrigo Ramos Xochiteotzin
Yo creo que si mantienes los repos separados no tendrías por qué tener problema. Sería una especie de microservicios donde cada uno opera en un puerto distinto (local) o dominio distinto (deploy). Cada servicio tendría sus endpoints propios y desde el front podrías hacer peticiones con fetch o axios a tus endpoints del backend sin problema.
Bueno, así yo le he hecho en proyectos tanto personales como de trabajo.
Carlos Rodríguez
Gracias @rdrx
Jorge Arias Argüelles
/blog)./#/blog), útil en despliegues sin control del backend.David Esteban Giraldo Duque
Actualmente también existe el StaticRouter, que sirve para SSR.
Javier Silva Avendaño
Para entenderle mejor a la teoría de esta clase, les recomienda esta clase de jonmircha React Router en youtube, esta un poquito larga pero el concepto queda bastante claro.
brayan zamora
Tipos de routers
Browser Route: /slug (cuando no tenemos control del back) Hash Router: /#/slug (el hack) Memory Router: ¿tener fe?
Juan Diego Mejia Maestre
🧭 Tipos de Router en React Router DOM
React Router DOM ofrece tres tipos principales de routers, cada uno diseñado para gestionar la navegación en diferentes escenarios: BrowserRouter, HashRouter y MemoryRouter.
1. 🌐 BrowserRouter
ejemplo.com/homeindex.html principal.2. 🔑 HashRouter
ejemplo.com/#/blog#) después del dominio para gestionar las rutas. Todo lo que sigue al # es gestionado exclusivamente por el frontend.#.💡 Uso en GitHub PagesEl
HashRouteres la solución para GitHub Pages porque obliga al servidor a cargar siempre la página base (index.html), y la aplicación de React maneja el resto de la navegación interna.
3. 🧠 MemoryRouter
🎯 Conclusión: Elección del Router
La elección principal entre BrowserRouter y HashRouter depende del entorno de despliegue:
BrowserRouter: Cuando tienes control total del servidor (ej: Netlify, Vercel, Backend propio).HashRouter: Cuando el hosting es estático y simple y no puedes modificar la configuración del servidor (ej: GitHub Pages).Miguel Giraldo Duque
En [[React router]] son 3 tipos de rutas que podemos usar en nuestras aplicaciones :
- **Browser router** : / Con esta barra dividimos los links de la interfaz por https:miguelito/inicio/contacto par dividir las pantallas esto viene con la desventaja de cuando desplegamos la aplicación en github pages por ejemplo , si el github pages no encuentra ningún archivo o carpeta que coincida con el nombre de la ruta nos daría un error
- **Hash router** : /#/ Cumple la misma función de crear división y navegación en la interfaz , con la diferencia que nos permite indicar que siempre queremos renderizar un mismo HTML funcionando con el single page aplication .
- **Memory router** : Nos permite guardar en memoria las rutas , pero no nos especifica de forma especifica en cual nos encontramos es útil para aplicaciones de celular donde la ruta no es necesaria que sea visible.
++Browser Router++: si utilizamos esta técnica de navegación, tendremos URLS mas limpias y un pequeño impacto en el SEO por url amigables, para trabajar esto en producción en un servidor real que no corra con node.js, toca hacer una configuración adicional para indicarle que independientemente la ruta que este navegando, el servidor renderice el index.html; lo que previene el tipico 404 NOT FOUND y a su vez el router gestiona la ruta como es debido mostrando el page configurado.este tipo de configuraciones se hacen vuelvo y reitero en servidores que no corran con node, dejare unos ejemplo de configuracion para 2 tipos de servidores mas tipicos: (deben de estar ubicados en la carpeta publica del servidor)
<code> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule .index.html [L] </code>
<code> <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Static Assets" stopProcessing="true"> <match url="([\S]+.)" /> <action type="Rewrite" url="/{R:1}"/> </rule> <rule name="ReactRouter Routes" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="/index.html" /> </rule> </rules> </rewrite> </system.webServer> </configuration> </code>