แสดงบทความที่มีป้ายกำกับ getStaticProps แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ getStaticProps แสดงบทความทั้งหมด

วันพฤหัสบดีที่ 27 กุมภาพันธ์ พ.ศ. 2568

การใช้ getInitialProps และเมื่อไหร่ควรใช้

ถ้าคุณเคยใช้ Next.js มาสักพัก น่าจะเคยได้ยินเกี่ยวกับ getInitialProps ซึ่งเป็นฟังก์ชันที่ใช้ดึงข้อมูลมาแสดงบนหน้าเว็บได้ทั้ง ฝั่งเซิร์ฟเวอร์ (Server-side) และ ฝั่งไคลเอนต์ (Client-side) แต่เดี๋ยวก่อน! ทำไมมันถึงดูเหมือน SSR และ CSR รวมกันล่ะ?

วันนี้เราจะมาเจาะลึกว่า getInitialProps ทำงานยังไง ควรใช้เมื่อไหร่ และ Next.js เวอร์ชันใหม่ยังควรใช้มันอยู่มั้ย? ถ้าพร้อมแล้ว ไปดูกันเลย! 🚀

📌 getInitialProps คืออะไร?

getInitialProps เป็นฟังก์ชันพิเศษของ Next.js ที่ใช้ดึงข้อมูลให้กับ Page Component โดยสามารถทำงานได้ทั้งฝั่ง เซิร์ฟเวอร์ และ ไคลเอนต์ ขึ้นอยู่กับว่าเพจนั้นโหลดมาแบบไหน

  • รันบนเซิร์ฟเวอร์ ถ้าผู้ใช้เข้าหน้าเว็บโดยตรง (getInitialProps ทำงานเหมือน SSR)
  • รันบนไคลเอนต์ ถ้าผู้ใช้ไปยังหน้านั้นผ่านการ Client-side Navigation (เช่น กดลิงก์ไปที่หน้าใหม่โดยไม่โหลดเว็บใหม่)

🔍 ข้อดีของ getInitialProps

  • ใช้ดึงข้อมูลได้ทั้งจากเซิร์ฟเวอร์และไคลเอนต์
  • ใช้กับ Custom App (_app.js) ได้
  • เหมาะสำหรับแอปที่ต้องการโหลดข้อมูลแบบ Hybrid (SSR + CSR)

❌ ข้อเสียของ getInitialProps

  • ทำให้ Automatic Static Optimization ใช้ไม่ได้ เพราะ Next.js มองว่ามันเป็น Dynamic Page
  • ช้ากว่า getStaticProps เพราะต้องรันโค้ดทุกครั้งที่โหลดหน้า
  • Next.js ไม่แนะนำให้ใช้ในเวอร์ชันใหม่ เนื่องจาก SSR และ SSG มีฟังก์ชันที่แยกกันชัดเจนกว่า


📌 วิธีใช้ getInitialProps

ลองมาดูตัวอย่างการใช้งานกัน สมมติว่าเราต้องการดึงข้อมูลจาก API และแสดงผลในหน้าเว็บ

import React from 'react';

const Blog = ({ posts }) => {
  return (
    <div>
      <h1>บล็อก (getInitialProps)</h1>
      <ul>
        {posts.map((post) => (
          <li key={post.id}>{post.title}</li>
        ))}
      </ul>
    </div>
  );
};

Blog.getInitialProps = async () => {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const posts = await res.json();

  return { posts };
};

export default Blog;

🔍 อธิบายโค้ด:

  • เราสร้างคอมโพเนนต์ Blog และรับ posts เป็น props
  • ใช้ Blog.getInitialProps เพื่อดึงข้อมูลจาก API
  • ถ้าผู้ใช้โหลดหน้า /blog ตรง ๆ → getInitialProps จะรันบนเซิร์ฟเวอร์
  • ถ้าผู้ใช้กดลิงก์มาจากหน้าอื่น → getInitialProps จะรันบนไคลเอนต์


📌 getInitialProps ใช้กับ _app.js ได้!

หนึ่งในข้อดีของ getInitialProps คือมันสามารถใช้ได้ในไฟล์ _app.js ซึ่งเป็นไฟล์หลักของ Next.js ที่ใช้ควบคุมทุกหน้าในแอปของเรา

ตัวอย่างการใช้ getInitialProps ใน _app.js เพื่อดึงข้อมูล User Authentication

import App from 'next/app';

function MyApp({ Component, pageProps, user }) {
  return (
    <div>
      <p>ผู้ใช้ปัจจุบัน: {user?.name || 'Guest'}</p>
      <Component {...pageProps} />
    </div>
  );
}

MyApp.getInitialProps = async (appContext) => {
  const appProps = await App.getInitialProps(appContext);

  // สมมติว่าเราเช็ก Token และดึงข้อมูลผู้ใช้จาก API
  const user = await fetchUserFromAPI(appContext.ctx);

  return { ...appProps, user };
};

export default MyApp;

🔍 อธิบายโค้ด:

  • MyApp เป็นคอมโพเนนต์หลักของแอป Next.js
  • getInitialProps ถูกเรียกตอนโหลดทุกหน้า ทำให้เราสามารถดึงข้อมูลผู้ใช้และส่งไปที่ทุกเพจได้
  • ถ้าเราใช้ fetchUserFromAPI() ใน _app.js มันจะรันบน เซิร์ฟเวอร์เสมอ


📌 เมื่อไหร่ควรใช้ getInitialProps?

✅ ใช้ getInitialProps ถ้า:

  • ต้องการดึงข้อมูล ทั้งฝั่งเซิร์ฟเวอร์และไคลเอนต์
  • ต้องการดึงข้อมูลใน _app.js (แต่ปัจจุบันแนะนำให้ใช้ getServerSideProps หรือ API Context แทน)
  • ต้องการให้หน้ามี Dynamic Data แต่ไม่ต้องการใช้ SSR เต็มรูปแบบ

❌ ไม่ควรใช้ getInitialProps ถ้า:

  • หน้าเว็บไม่จำเป็นต้องโหลดข้อมูลใหม่ทุกครั้ง → ควรใช้ getStaticProps แทน
  • ต้องการโหลดเร็ว ๆ → SSR อาจช้าไป ควรใช้ CSR หรือ SSG
  • ใช้ Next.js เวอร์ชันใหม่ → Next.js แนะนำให้ใช้ getServerSideProps หรือ getStaticProps แทน


📌 เปรียบเทียบ getInitialProps vs getServerSideProps vs getStaticProps

Feature getInitialProps getServerSideProps getStaticProps
ดึงข้อมูลตอน ทุกครั้งที่โหลดหน้า (SSR) หรือเมื่อกดลิงก์ (CSR) ทุกครั้งที่โหลดหน้า (SSR) ตอน Build Time เท่านั้น (SSG)
เหมาะกับข้อมูลที่ เปลี่ยนแปลงบ่อย และต้องการทำงานทั้ง SSR + CSR เปลี่ยนแปลงบ่อย และต้องการ SSR 100% คงที่ หรือเปลี่ยนนาน ๆ ที
โหลดเร็วกว่า ❌ ช้ากว่าเพราะต้องรองรับทั้ง SSR และ CSR ❌ โหลดช้าเพราะต้องรอเซิร์ฟเวอร์ ✅ โหลดไวเพราะเป็น Static
ใช้กับ _app.js ได้ ✅ ใช้ได้ ❌ ใช้ไม่ได้ ❌ ใช้ไม่ได้
Next.js แนะนำให้ใช้? ❌ ไม่แนะนำแล้ว ✅ ใช้แทน SSR ✅ ใช้แทน SSG

💡 สรุปง่าย ๆ:

  • อย่าใช้ getInitialProps ใน Next.js เวอร์ชันใหม่ → ใช้ getServerSideProps หรือ getStaticProps แทน
  • ถ้าต้องการ SSR ใช้ getServerSideProps
  • ถ้าต้องการ Static Site ใช้ getStaticProps


📌 สรุป

getInitialProps เคยเป็นฟีเจอร์ที่ได้รับความนิยมใน Next.js แต่ปัจจุบัน Next.js แนะนำให้ใช้ SSR (getServerSideProps) หรือ SSG (getStaticProps) แทน เพราะมันแยกหน้าที่กันชัดเจนกว่าและทำให้การโหลดเว็บเร็วขึ้น

ถ้าคุณยังใช้ getInitialProps อยู่ในโปรเจ็กต์เก่า ลองเปลี่ยนมาใช้ getServerSideProps หรือ getStaticProps ดู แล้วคุณจะเห็นความแตกต่าง! 🚀

วันอังคารที่ 25 กุมภาพันธ์ พ.ศ. 2568

การใช้ getStaticProps สำหรับ Static Site Generation (SSG)

ถ้าพูดถึงการสร้างเว็บที่โหลดไว ประหยัดทรัพยากรเซิร์ฟเวอร์ และเหมาะกับ SEO สุด ๆ ก็คงหนีไม่พ้น Static Site Generation (SSG) โดยเฉพาะใน Next.js ที่มีฟีเจอร์เด็ดอย่าง getStaticProps มาช่วยดึงข้อมูลตอน Build Time ทำให้เว็บของเรากลายเป็นไฟล์ HTML ที่พร้อมเสิร์ฟทันที!

วันนี้เราจะมาเจาะลึกว่า getStaticProps ทำงานยังไง ใช้ยังไง และเมื่อไหร่ควรใช้ พร้อมทั้งแชร์ทริคเด็ด ๆ ที่จะช่วยให้คุณใช้งานมันได้อย่างมือโปร! 🚀

📌 Static Site Generation (SSG) คืออะไร?

Static Site Generation (SSG) คือเทคนิคที่เราสร้างหน้าเว็บเป็นไฟล์ HTML ล่วงหน้าตั้งแต่ตอน Build ซึ่งต่างจาก Server-Side Rendering (SSR) ที่ต้องรอให้เซิร์ฟเวอร์รันโค้ดก่อนถึงจะได้ HTML หรือ Client-Side Rendering (CSR) ที่ต้องรอให้เบราว์เซอร์โหลด JavaScript แล้วค่อยแสดงผล

พูดง่าย ๆ คือ SSG ทำให้เว็บของเรากลายเป็นไฟล์ HTML ที่พร้อมเสิร์ฟเลย ซึ่งมีข้อดีหลัก ๆ ดังนี้:

✅ โหลดไวสุด ๆ เพราะเซิร์ฟเวอร์ไม่ต้องประมวลผลเพิ่ม
✅ ลดภาระของเซิร์ฟเวอร์ เพราะทุกอย่างถูก Generate มาตั้งแต่แรก
✅ SEO ดีกว่า เพราะ Bot ของ Google อ่าน HTML ได้ทันที
✅ ใช้งานร่วมกับ CDN ได้ดี ทำให้เสิร์ฟเว็บจากตำแหน่งที่ใกล้ User ที่สุด


แต่ข้อเสียก็มีเหมือนกันนะ:

❌ ใช้ไม่ได้กับข้อมูลที่เปลี่ยนแปลงตลอดเวลา เช่น Dashboard แบบ Real-Time
❌ ถ้ามีเพจเยอะมาก ๆ การ Build อาจใช้เวลานาน

📌 getStaticProps คืออะไร?

getStaticProps เป็นฟังก์ชันของ Next.js ที่ใช้ใน Page Component เพื่อดึงข้อมูลมาตอน Build Time แล้วส่งเป็น Props ให้หน้าเว็บของเรา โดยข้อมูลที่ได้มาจะถูกแปลงเป็น HTML และใช้ซ้ำได้เรื่อย ๆ โดยไม่ต้องโหลดใหม่จากเซิร์ฟเวอร์

👉 เหมาะสำหรับหน้าเว็บที่ ใช้ข้อมูลที่ไม่เปลี่ยนบ่อย เช่น

  • บล็อกโพสต์
  • หน้า Product Catalog
  • หน้า About Us
  • รายการบทความ ฯลฯ


📌 วิธีใช้ getStaticProps

ลองมาดูตัวอย่างง่าย ๆ กัน! สมมติว่าเรามี API ที่ให้ข้อมูลเกี่ยวกับโพสต์ และเราอยากดึงมันมาตอน Build Time

export async function getStaticProps() {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const posts = await res.json();

  return {
    props: {
      posts,
    },
  };
}

export default function Blog({ posts }) {
  return (
    <div>
      <h1>บล็อกของเรา</h1>
      <ul>
        {posts.map((post) => (
          <li key={post.id}>{post.title}</li>
        ))}
      </ul>
    </div>
  );
}

🔍 อธิบายโค้ด:

  • getStaticProps จะถูกเรียกตอนที่เรารัน next build
  • เราใช้ fetch ดึงข้อมูลจาก API
  • ข้อมูลที่ได้จะถูกส่งไปที่ props ของคอมโพเนนต์ Blog
  • หน้าเว็บนี้จะถูก Generate เป็น HTML พร้อมข้อมูลในแต่ละโพสต์


📌 getStaticProps + getStaticPaths = Dynamic Routes!

บางครั้งเราอาจมีหน้าเว็บที่ต้องใช้ Dynamic Routes เช่น /posts/[id] แล้วเราจะให้ Next.js Generate หน้าเหล่านี้เป็น Static ได้ยังไง? ใช้ getStaticPaths ไงล่ะ!

🔥 ตัวอย่างการใช้ getStaticProps + getStaticPaths

export async function getStaticPaths() {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const posts = await res.json();

  const paths = posts.map((post) => ({
    params: { id: post.id.toString() },
  }));

  return { paths, fallback: false };
}

export async function getStaticProps({ params }) {
  const res = await fetch(`https://jsonplaceholder.typicode.com/posts/${params.id}`);
  const post = await res.json();

  return {
    props: { post },
  };
}

export default function Post({ post }) {
  return (
    <div>
      <h1>{post.title}</h1>
      <p>{post.body}</p>
    </div>
  );
}

🔍 อธิบายโค้ด:

  • getStaticPaths ใช้กำหนดว่า Next.js ต้อง Generate หน้าอะไรบ้าง
  • fallback: false หมายความว่าถ้าผู้ใช้เข้าไปที่หน้า /posts/9999 ซึ่งไม่มีใน paths จะได้หน้า 404
  • getStaticProps รับ params.id แล้วไปดึงข้อมูลจาก API เพื่อส่งให้ Component


📌 revalidate - อัปเดตข้อมูลโดยไม่ต้อง Build ใหม่!

ถ้าข้อมูลของเรามีการเปลี่ยนแปลง เช่น บล็อกโพสต์ที่อัปเดตบ่อย เราสามารถใช้ revalidate เพื่อให้ Next.js รีเฟรชข้อมูลหลังจากเวลาที่กำหนด (Incremental Static Regeneration หรือ ISR)

export async function getStaticProps() {
  const res = await fetch('https://jsonplaceholder.typicode.com/posts');
  const posts = await res.json();

  return {
    props: { posts },
    revalidate: 60, // รีเฟรชข้อมูลทุก 60 วินาที
  };
}

💡 ข้อดีของ ISR

  • ไม่ต้องรอ Build ใหม่เพื่ออัปเดตข้อมูล
  • ลดภาระของเซิร์ฟเวอร์ เพราะ Generate เฉพาะหน้าที่มีคนเข้า


📌 ควรใช้ getStaticProps เมื่อไหร่?

✅ ใช้ getStaticProps ถ้า:

  • ข้อมูลไม่เปลี่ยนแปลงบ่อย
  • ต้องการโหลดหน้าเว็บเร็วและเน้น SEO
  • ต้องการเสิร์ฟหน้าเว็บผ่าน CDN


❌ ไม่ควรใช้ getStaticProps ถ้า:

  • ข้อมูลเปลี่ยนแปลงแบบเรียลไทม์ (ใช้ Server-Side Rendering หรือ Client-Side Fetching แทน)
  • ต้องการแสดงข้อมูลที่ขึ้นอยู่กับผู้ใช้ เช่น หน้าส่วนตัว หรือแดชบอร์ด


📌 สรุป

getStaticProps เป็นเครื่องมือสุดเทพของ Next.js ที่ช่วยให้เราทำ SSG ได้ง่าย ๆ โดย:

  • ดึงข้อมูลมาตอน Build Time
  • ใช้ร่วมกับ getStaticPaths สำหรับ Dynamic Routes
  • ใช้ revalidate เพื่ออัปเดตข้อมูลโดยไม่ต้อง Build ใหม่

ใครที่อยากทำเว็บเร็ว ๆ SEO ดี ๆ ลองใช้ getStaticProps ดู รับรองว่าชีวิตง่ายขึ้นเยอะ! 🚀

การใช้ Image Optimization ใน Next.js: โหลดไว SEO ดี ประหยัดแบนด์วิธ!

เคยเจอปัญหาเว็บโหลดช้าเพราะรูปภาพขนาดใหญ่หรือเปล่า? 📷 ถ้าใช่ Next.js มีฟีเจอร์ Image Optimization ที่ช่วยให้รูปภาพโหลดเร็วขึ้น อัตโนมัติ ไม...