ถ้าคุณเคยใช้ 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 ดู แล้วคุณจะเห็นความแตกต่าง! 🚀