In React Router, both BrowserRouter
and HashRouter
are used to handle routing in a React application, but they differ in how they handle the URL and the history management. Here’s the key difference between the two:
1. BrowserRouter
URL Structure:
BrowserRouter
uses the HTML5 History API to manage the URL. This allows for clean, standard URLs likehttp://example.com/about
orhttp://example.com/products/123
.- The URL reflects the structure of the route and does not include any hash (
#
) symbol.
Behavior:
- The browser’s history is updated as the user navigates between routes. When you navigate, the browser URL changes in the address bar, and the history is updated.
- It’s ideal for applications where you want URLs to look clean and standard, like a traditional website.
Server Configuration:
- Since
BrowserRouter
uses the HTML5 History API, it needs to be configured properly on the server. The server must be able to serve the app's entry point (usuallyindex.html
) for any route. If a user directly visits a route likehttp://example.com/about
, the server needs to serve the app, not return a 404 error. - If you're deploying to a server (like with React on a production environment), you'll need to configure your web server (e.g., Apache, Nginx) to redirect all requests to the entry point.
- Since
Example Usage:
2. HashRouter
URL Structure:
HashRouter
uses hash fragments in the URL to manage routing. This means that the URL will look likehttp://example.com/#/about
orhttp://example.com/#/products/123
.- The part after the
#
symbol (called the hash) is used to track the current route. It does not actually cause a page reload or affect the browser's history stack in the traditional sense.
Behavior:
- Since the URL contains a hash (
#
), the browser doesn’t need any special server-side configuration. All navigation happens client-side, so the browser doesn’t make new requests to the server when the hash changes. - This means that if you're hosting your app on a server that doesn't support client-side routing,
HashRouter
is often a better choice, as it avoids the need for special server configurations.
- Since the URL contains a hash (
Server Configuration:
- No special server configuration is required because the part of the URL after the hash (
#
) is never sent to the server. It's completely handled by the client-side JavaScript, so you don't need to worry about server routes or redirects.
- No special server configuration is required because the part of the URL after the hash (
Example Usage:
Key Differences
Feature | BrowserRouter | HashRouter |
---|---|---|
URL Structure | Clean URLs without a # (e.g., /about ) | URLs include a hash (# ) (e.g., /#/about ) |
Browser History | Uses HTML5 History API (supports pushState, popState) | Uses the hash part of the URL |
Server Configuration | Requires server-side configuration to handle routes correctly | No special server configuration needed |
Use Case | Ideal for modern apps where clean URLs are needed and server configuration is possible | Ideal for static file hosting or when no server-side routing is involved |
Browser Support | Supported in modern browsers | Supported in all browsers, especially older ones |
When to Use Each
- Use
BrowserRouter
:- When you need clean, standard URLs (without hashes).
- When your app will be hosted in an environment where the server can be configured to handle all routes (e.g., modern web hosting, React apps on a server like Apache, Nginx, or a cloud service).
- Use
HashRouter
:- When you don’t have control over the server or you're hosting the app as static files (e.g., GitHub Pages or some static file hosting).
- When you need to ensure compatibility with all browsers, including older ones.
- When you don’t need clean URLs and the hash fragment is acceptable in the URL.
In summary, if you can configure your server to handle routing properly, BrowserRouter
is the preferred choice. If not, or if you're working with static hosting, HashRouter
can be a great fallback.
For more details