Hi i like to add i18n support to my nextJs app without any routing. Any existing solutions I’ve found using some sort of routing.
So what i need is to access request headers ('Accept-Language' header to be spesific) in _document.tsx than I will set html lang from it. Than I read it from Js and return proper language objects both initial ssr and csr. If I do it without this I get error like Text content did not match. Server: …
So far I’ve tried to retrieve it from getInitialProps in _document.tsx but it seems it is always null. I also tried retrieving header from middleware and than rewriting url with adding lang to search params. But I also couldn’t manage to retrieve it from _document.tsx either.
How can I provide this functionality to my app?
You could try to use react-intl-universal with next.js.
You could use intl.determineLocale to get the language, then use it to intl.init. It has nothing to do with routing.
Here is an example integrating react-intl-universal with NextJS
Related
I've just started with Next.js and I've already faced a problem with dynamic routing. For some reason it doesn't work although it should. I tried with folder and with file as well but it won't work. This is really cumbersome...
It just displays 404 error...
In order for your dynamic routes to work and if you're using SSG, you need to make use of getStaticPaths and getStaticProps functions to pre-render all the paths (and the content for each one as well) containing the meetupId param.
You can read more here
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!
If you know a site is using react in some way, how can you, just using the javascript console, identify if the app is running a next.js app or create react app.
I am not sure about this. But to my knowledge, one of the important feature of next.js is that it supports SSR.
If we fetch the url of the page using postman, sites developed using react app will return a html with javascript files, where as those ones with next.js or with SSR mode returns a complete page. I think it might be worthy to fetch the url and check if the response contains "Need to enable javascript" or something like that. This might not completely show that the site is built create-react-app or next.js but can help you to discriminate them.
It's easy to tell if a website uses ReactJS, by using the React Developer Tools.
However, I know a website that uses ReactJS and Server Side Rendering (the whole page is built with React components, but the page source contains the whole HTML). Is it possible to tell if this website uses Next.js in particular for SSR?
Does Next.js leave any trace detectable on the front-end?
If you are seeing content is wrapped with id="__next", this website use next.js
like uber
and like netflix
By default, Next.js sets the X-Powered-By header to Next.js. So if you check Chrome's devtools for a page, you can check to see if this header exists.
Note: Developers can opt-out of including this header. So if the header does not exist, it is not evidence that the website does not use Next.js
Version of Next.js + properties of the page:
console.log({
NextJSVersion: window.next?.version,
pageProps: window.__NEXT_DATA__?.props?.pageProps
})
I'm trying to figure out how to dynamically generate sitemap in reactJS server side (express) web app. I'm using react router.
For simple ReactJS sitemap integration with React Router, you should check out the react-router-sitemap package.
It's fairly configurable as well, as you can see in the docs, so if you need to include change frequency or things like that, you should be able to do it no problem.
Or were you looking for a way to implement one yourself?
If your site frequently changes, you need to dynamically create the sitemap. I was stuck here and found this effective solution, which can even generate a real time sitemap by calling API for my website in ReactJS, using NextJs. dynamic Sitemap Steps
You can do this by creating most of the public files like
sitemap.xml
rss.feed
robots.txt
humans.txt
That too with preserving the behaviour of ReactJS.