How to set dynamic metatags in ReactJS to get nice share links?

Viewed 282

The app

The application was made using ReactJS, React Router Dom, Styled Components and Redux ducks.

The backend we consume is also made by us using Amazon Amplify and GraphQL.

The goal

We need to define the meta tags of one of the application pages so that it is possible to share personalized links to users in social networks using OpenGraphic meta tags and the like.

The problem

The project was made in ReactJS and ReactJS has only one HTML page as root (/public/index.html), in this way, everything is generated with Javascript in a root tag, and when it arrives in the browser it is transpiled, as we already know. The problem is that the crawlers responsible for understanding the meta tags are not able to understand Javascript and end up not finding the dynamic data that I am defining on the page that I need to share the link on. They understand that there is one html file and only.


Attempts to resolve the issue

1) Define the meta tags in the /public/index.html file itself

This solution doesn't work because the data we are using is dynamic and the index.html file is a static file

2) Using react-helmet

The solution allows meta tags to be defined, but as already mentioned, crawlers don't understand JS. So, despite being on the page, the meta tags do not appear when sharing the link.

3) Using some SSR technology

This is a possible solution, but we were unable to integrate any SSR Framework into React. And it is not feasible to change the base technology of the project. We can't just switch from React to Next, for example, as the project is already complete.

4) Using a small server made with express.js along with the React application to replace the meta tags in index.html with string.replace() simulating something like an SSR

This solution works, but it causes two requests to be made every time the page is accessed, once by express.js and once on the front-end side by React. Due to the number of requests increasing, this solution was discarded. But if necessary, you can do it. In this case it is also necessary to check if Amplify can keep the application and the small server running in the same project.

5) Using react-snap with react-helmet

React-snap allows you to create html snapshots of the pages of a React project based on their routes and links, this added to react-helmet generates a perfect solution for links to be treated well by web crawlers when they are shared. But the solution doesn't work with dynamic routes. For example, /your-route/:id is a dynamic route that expects an id to be fully defined. React-snap gets lost when trying to create a snapshot of a route that only exists when the id is set. Unfortunately, this solution doesn't work.


These were the solutions we used to try to solve the problem, but it was not possible yet. Probably attempt 4 would be the most ideal to solve the problem. But we are looking for the best way that will not generate reworks and future problems. If someone knows a better way to do that, would help us a lot!

0 Answers
Related