Proper Meta Tags
Use title, description, and Open Graph tags per page.
Search engine optimization in React needs extra care, especially for SPA apps where content is often rendered after JavaScript loads.
In many client-rendered SPAs, the first HTML response can be minimal, and actual page content appears only after JS runs.
Common SEO impact:
Proper Meta Tags
Use title, description, and Open Graph tags per page.
Server-Side Rendering
SSR with frameworks like Next.js or Remix gives search engines ready HTML.
Pre-rendering
Generate static HTML snapshots for better crawlability.
Clean URLs
Prefer readable paths like /user/123 over query-heavy URLs.
Fast Performance
Use lazy loading, code splitting, and optimized images.
Use the maintained library: react-helmet-async.
Why not old react-helmet?
Install:
npm install react-helmet-asyncWrap app:
import { HelmetProvider } from "react-helmet-async";
function App() { return ( <HelmetProvider> <Main /> </HelmetProvider> );}import { Helmet } from "react-helmet-async";
function Home() { return ( <> <Helmet> <title>Home Page</title> <meta name="description" content="This is home page" /> </Helmet>
<h1>Home</h1> </> );}function User({ user }) { return ( <> <Helmet> <title>{user.name}</title> <meta name="description" content={user.bio} /> </Helmet>
<h1>{user.name}</h1> </> );}<Helmet> <meta property="og:title" content="My App" /> <meta property="og:description" content="Best app" /> <meta property="og:image" content="/image.png" /></Helmet>A sitemap is a list of important URLs that helps search engines crawl your site efficiently.
Example sitemap.xml:
<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://example.com/</loc> </url> <url> <loc>https://example.com/about</loc> </url></urlset>Install:
npm install react-router-sitemapExample:
const Sitemap = require("react-router-sitemap").default;
function generateSitemap() { return new Sitemap(router).build("https://example.com").save("./public/sitemap.xml");}
generateSitemap();Install:
npm install sitemapExample script:
const { SitemapStream, streamToPromise } = require("sitemap");const fs = require("fs");
const sitemap = new SitemapStream({ hostname: "https://example.com" });
sitemap.write({ url: "/", changefreq: "daily", priority: 1.0 });sitemap.write({ url: "/about", changefreq: "monthly", priority: 0.7 });
sitemap.end();
streamToPromise(sitemap).then((data) => { fs.writeFileSync("./public/sitemap.xml", data.toString());});Dynamic routes example:
/users/1/users/2/users/3const users = [1, 2, 3];
users.forEach((id) => { sitemap.write({ url: `/user/${id}`, changefreq: "weekly", priority: 0.8, });});User-agent: *Allow: /
Sitemap: https://example.com/sitemap.xmlEven with Helmet, pure SPA SEO has limits.
Best approach for strong SEO: