Emil Privér
Posted on February 3, 2020
OUTDATED! NEW WAY: https://emilpriver.com/blog/sitemap-with-nextjs-after-9-4-update
Originally written at: My website
So, Nextjs is really hyped and a really good framework for developing. Nextjs is shiped with alot of stuffs, but not an generated sitemap (Which i understand is not added by default in Nextjs).
This is 1 way to create an dynamic sitemap without creating a server to handle Nextjs and use getInitialProps instead as normal pages does.
URL
I wanted to be able to use /sitemap.xml as its a standard for sitemaps.
By testing out different type of filename did i later on understand that you are able to use
sitemap.xml.js
as name and it will be rendered when entering /sitemap.xml in your browser.
Something we will use in this small article.
Developing the XML feed.
Create a new file in pages/ folder in your projects map, the name of the file will be used when you want to access your sitemap.
import React from "react";
import axios from "axios";
const sitemapXML = data => {
let latestPost = 0;
let projectsXML = "";
data.map(post => {
const postDate = Date.parse(post.modified);
if (!latestPost || postDate > latestPost) {
latestPost = postDate;
}
const projectURL = `https://domain.ltd/project/${post.slug}/`;
projectsXML += `
<url>
<loc>${projectURL}</loc>
<lastmod>${postDate}</lastmod>
<priority>0.50</priority>
</url>`;
});
return `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://domain.ltd/</loc>
<lastmod>${latestPost}</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://domain.ltd/about/</loc>
<priority>0.80</priority>
</url>
${projectsXML}
</urlset>`;
};
First part of the code.
Here we create the XML feed with dynamic data.
We have some statics paths which is / and /about which we add manually.
but we also have some dynamic data, in my case is the dynamic data all my projects. So in the code do we loop thrue all my projects from an external source and add xml data to a variable which we later on uses to display the data.
class Sitemap extends React.Component {
static async getInitialProps({ res }) {
const data = await axios
.get(
"https://domain.ltd/some/url/"
)
.then(response => response.data);
res.setHeader("Content-Type", "text/xml");
res.write(sitemapXML(data));
res.end();
}
}
export default Sitemap;
In the last part do we use axios to fetch data from an api. This works exactly the same way we do normally fetch data when using SSR with Next.JS.
But instead of using render() or return() do we directly send the XML feed to the client. So now we have working XML feed which is rendered SSR and ready when you need it.
And exempel using the method is my website: https://priver.dev/sitemap.xml
Github GIST if you want to copy the code
Hope this helps you :D
Posted on February 3, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.