Skip to content

Commit 19f15ff

Browse files
committed
Updates
1 parent 7f09139 commit 19f15ff

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

data/shownPosts.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
"description": "a journey to create my first golang package",
88
"tags": ["go", "lib", "pkg.go.dev"]
99
},
10+
{
11+
"slug": "hashrouter-vs-browserrouter",
12+
"title": "HashRouter vs. BrowserRouter",
13+
"date": "2025-10-15",
14+
"updated": "2025-10-16",
15+
"description": "Why am I using HashRouter for github pages",
16+
"tags": ["react", "webdev", "gh-pages", "router"]
17+
},
1018
{
1119
"slug": "warning-post",
1220
"title": "My Second Post",
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# HashRouter vs. BrowserRouter
2+
3+
When building Single-Page Applications (SPAs) with React, `react-router-dom` is a go-to library for handling client-side routing. It offers two primary router components: `HashRouter` and `BrowserRouter`.
4+
While both achieve the goal of navigating between different views in your application without full page reloads,
5+
they do so in fundamentally different ways, and these differences become crucial when deploying to static hosting environments like GitHub Pages.
6+
7+
## The Core Difference: How They Handle URLs
8+
9+
The key to understanding `HashRouter` and `BrowserRouter` lies in how they interact with the browser's URL structure, specifically the `path` and `fragment` (or hash) parts of a URL.
10+
11+
A typical URL looks something like this: `protocol://hostname:port/path?query#fragment`
12+
13+
* **`/path`**: This part of the URL is sent to the server. The server uses it to identify and serve a specific resource (e.g., an HTML file, an image, etc.).
14+
* **`#fragment`**: This part, also known as the hash, is *never* sent to the server. It's entirely handled by the client-side (the web browser).
15+
16+
### `HashRouter`: The Static Hosting Friend
17+
18+
* **URL Structure:** `https://yourdomain.com/#/blog/my-post`
19+
* **How it Works:**
20+
1. When a user navigates to a URL with a hash (e.g., `#/blog/my-post`), the server (in this case, GitHub Pages) only sees the part of the URL *before* the hash: `https://yourdomain.com/`.
21+
2. GitHub Pages, being a static file server, simply looks for and serves the `index.html` file located at the root of your deployment.
22+
3. Once `index.html` loads, your React application starts. `HashRouter` then inspects the full URL in the browser's address bar, extracts the route information from after the hash (`/blog/my-post`), and renders the corresponding component.
23+
* **Why it Works on GitHub Pages:** Because the server never sees the route information (e.g., `/blog/my-post`), it never tries to find a physical file at that path. It always serves `index.html`, and your client-side JavaScript handles all the routing. This makes `HashRouter` a very robust and straightforward choice for static hosting where you don't have server-side routing capabilities.
24+
25+
### `BrowserRouter`: The Clean URL Enthusiast (with a Catch)
26+
27+
* **URL Structure:** `https://yourdomain.com/blog/my-post`
28+
* **How it Works:**
29+
1. When a user navigates to a URL without a hash (e.g., `/blog/my-post`), the server receives the *entire path*: `https://yourdomain.com/blog/my-post`.
30+
2. GitHub Pages, as a static server, will then try to find a physical file at `/blog/my-post`.
31+
* **Why it's Tricky on GitHub Pages:** Since your React application is a Single-Page Application, there isn't a physical file named `my-post` (or `blog/my-post`) on the server. All your application's code is bundled into `index.html` and its associated JavaScript files. Consequently, GitHub Pages returns a 404 "Not Found" error because it can't find a file at the requested path. Your `index.html` is never served, and your React app never gets a chance to load and handle the routing.
32+
33+
## The `404.html` Workaround for `BrowserRouter` (and Why It's Often More Trouble)
34+
35+
To make `BrowserRouter` work on GitHub Pages, a common workaround involves creating a custom `404.html` file. This file contains a JavaScript script that, when served by GitHub Pages (because a 404 occurred), attempts to:
36+
37+
1. Rewrite the URL in the browser's history to the original requested path (e.g., `/blog/my-post`).
38+
2. Redirect the browser to your `index.html`.
39+
40+
The idea is that once `index.html` loads, `BrowserRouter` will see the rewritten URL and render the correct component. However, this approach is often fraught with issues:
41+
42+
* **Timing and Browser Behavior:** The script's execution, `history.replaceState`, and the subsequent redirect can be sensitive to browser behavior, caching, and network timing.
43+
* **Flickering/Double Redirects:** Users might experience a brief flicker of the 404 page or multiple redirects before the correct content loads.
44+
* **Debugging Complexity:** Debugging issues in this setup can be challenging due to the asynchronous nature of the redirects and the interaction between the server's 404 handling and client-side JavaScript.
45+
46+
## Conclusion: Choose Wisely for Static Hosting
47+
48+
For projects deployed on static hosting services like GitHub Pages, `HashRouter` offers a simpler, more reliable, and less problematic solution. While `BrowserRouter` provides aesthetically cleaner URLs, the effort required to make it work consistently on static hosts often outweighs the benefits, especially for personal projects or portfolios where server-side configuration is not an option. If clean URLs are an absolute requirement, a more robust hosting solution with server-side routing capabilities (like Netlify, Vercel, or a custom server) would be a better fit.

0 commit comments

Comments
 (0)