Next.js is a framework built on top of React.js. It appreciates React for what it is and ignores it for what it is not.
Just like with Create-React-App, you can set up a Next.js application with one command.
Adding a page is as simple as creating a file in the "pages" directory, in which you add a component that describes how that page should look.
Next.js will statically generate this page on the server (at build-time) and send it to the client on every request, as it used to be done. If you need data that already exists on the server (at build-time), Next.js can provide static pages based on this data, which can then be sent to the client on request.
If the page requires data that the server does not yet have during application build (data that may need to be calculated or assembled at runtime), Next.js offers several options. You can let Next.js assemble the page on the server when the request comes in, or you can fetch the data on the client, like a traditional SPA.
Next.js thus offers the flexibility to inject data into your application when you need it: at build-time, on the server, or while users use your application.
As an additional option, you can also statically build your applications, regenerate a page on request, and then offer it statically.