NextJS
getStaticProps VS getServerSideProps

In Next.js, getStaticProps and getServerSideProps are both data-fetching methods used to populate your components with data, but they serve different purposes and have different characteristics. Here's a detailed comparison:


🟢 getStaticProps

Definition: getStaticProps is used for Static Site Generation (SSG), where pages are generated at build time. It fetches data once and serves that pre-rendered HTML to the user.

Key Features:

  • Build Time Rendering: The page is generated at build time, meaning the HTML is created during the build process and served statically.
  • Caching: The generated HTML is cached and served for all requests until the next build.
  • Revalidation: You can specify a revalidate interval to update the page in the background while still serving the static version until the new one is ready.
  • Performance: Fast loading times for users since the content is served as static HTML.
  • SEO Benefits: Great for SEO because the pre-rendered HTML is available for crawlers.

Use Case:

Ideal for pages with content that does not change frequently, such as marketing pages, blogs, documentation, or any page where the data can be fetched at build time.

Example:

// pages/index.js
export async function getStaticProps() {
  const res = await fetch('https://api.example.com/data');
  const data = await res.json();
 
  return {
    props: {
      data,
    },
    revalidate: 60, // Re-generate the page every 60 seconds
  };
}
 
const HomePage = ({ data }) => (
  <div>
    <h1>Static Site Generated Page</h1>
    <p>{data.info}</p>
  </div>
);
 
export default HomePage;

🔵 getServerSideProps

Definition: getServerSideProps is used for Server-Side Rendering (SSR), where pages are generated on each request. The data is fetched and the HTML is created on the server every time a request is made.

Key Features:

  • Request Time Rendering: The page is generated on the server for each request, meaning it fetches data fresh every time.
  • No Caching: No static caching; each request results in a new render.
  • Performance: Slower than SSG since a request to the server is required for each page load, leading to longer loading times compared to static pages.
  • SEO Benefits: Still good for SEO, as the pre-rendered HTML is available on every request.

Use Case:

Ideal for pages that require fresh data on every request, such as user dashboards, or pages with frequently changing data (e.g., stock prices, dynamic user-specific content).

Example:

// pages/dashboard.js
export async function getServerSideProps() {
  const res = await fetch('https://api.example.com/user-data');
  const data = await res.json();
 
  return {
    props: {
      data,
    },
  };
}
 
const DashboardPage = ({ data }) => (
  <div>
    <h1>User Dashboard</h1>
    <p>{data.info}</p>
  </div>
);
 
export default DashboardPage;

🔄 Key Differences Between getStaticProps and getServerSideProps

FeaturegetStaticPropsgetServerSideProps
Rendering TimingBuild time (at the time of the build)Request time (on each request)
Use CaseStatic content (e.g., blog, landing pages)Dynamic content (e.g., user dashboards)
RevalidationYes, using revalidateNo revalidation; always fresh data
PerformanceFaster (static pages)Slower (server processing for each request)
CachingCached until the next buildNo caching; always fetches fresh data
SEOExcellent (pre-rendered HTML available)Excellent (always serves pre-rendered HTML)
Data Fetching MethodExecutes at build timeExecutes at request time

Conclusion

  • Use getStaticProps for pages with content that can be generated at build time and does not need to be updated frequently.
  • Use getServerSideProps for pages that require fresh data with every request and where the content can change often.

By understanding the differences between these two methods, you can better optimize your Next.js application for performance and user experience based on your specific needs.