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

วันอาทิตย์ที่ 16 มีนาคม พ.ศ. 2568

การใช้ NextAuth.js สำหรับการล็อกอินในแอป Next.js

ถ้าคุณกำลังพัฒนาเว็บแอปด้วย Next.js แล้วอยากเพิ่มระบบล็อกอินที่ปลอดภัยโดยไม่ต้องปวดหัวกับการจัดการ JWT, OAuth, หรือ Session เอง NextAuth.js คือคำตอบที่คุณต้องการ!

NextAuth.js คืออะไร?

NextAuth.js เป็น authentication library สำหรับ Next.js ที่ทำให้การเพิ่มระบบล็อกอินเป็นเรื่องง่าย รองรับหลาย ๆ provider เช่น Google, Facebook, GitHub, Twitter หรือแม้กระทั่ง credentials-based login (อีเมล/รหัสผ่าน)

จุดเด่นของ NextAuth.js คือ ไม่ต้องเขียน backend เอง เพราะมันใช้ API routes ของ Next.js จัดการ authentication ให้เสร็จสรรพ

ติดตั้ง NextAuth.js

ก่อนอื่น ไปที่โปรเจกต์ Next.js ของคุณ แล้วติดตั้ง NextAuth.js ด้วยคำสั่งนี้:

npm install next-auth
# หรือใช้ yarn
yarn add next-auth

ตั้งค่า NextAuth.js

NextAuth ต้องใช้ API Route ในการจัดการ authentication ดังนั้นเราจะสร้างไฟล์ pages/api/auth/[...nextauth].js (หรือ .ts ถ้าใช้ TypeScript)

ตัวอย่างการตั้งค่า NextAuth.js

import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
  ],
  secret: process.env.NEXTAUTH_SECRET,
});

💡 อธิบายโค้ดนี้:

  • เราใช้ GoogleProvider เป็น provider สำหรับล็อกอินผ่าน Google
  • ค่า clientId และ clientSecret จะถูกเก็บไว้ในไฟล์ .env.local เพื่อความปลอดภัย
  • NEXTAUTH_SECRET เป็นคีย์สำหรับเข้ารหัส session tokens


ตั้งค่า Environment Variables

สร้างไฟล์ .env.local แล้วใส่ค่าต่อไปนี้ (อย่าลืมเปลี่ยนค่าให้ตรงกับของจริงจาก Google API Console)

GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
NEXTAUTH_SECRET=your-random-secret-key

📌 TIP: ใช้คำสั่งนี้ใน Terminal เพื่อสร้างค่า NEXTAUTH_SECRET แบบสุ่ม

openssl rand -base64 32


เพิ่มปุ่มล็อกอิน/ล็อกเอาต์ในหน้าเว็บ

NextAuth.js มี React Hooks ที่ให้เราดึงสถานะล็อกอินของผู้ใช้มาแสดงผลได้ง่าย ๆ

แก้ไข pages/index.js เพื่อเพิ่มปุ่มล็อกอิน

import { signIn, signOut, useSession } from "next-auth/react";

export default function Home() {
  const { data: session } = useSession();

  return (
    <div>
      {session ? (
        <>
          <p>Welcome, {session.user.name}!</p>
          <img src={session.user.image} alt="Profile" width={50} height={50} />
          <button onClick={() => signOut()}>Sign Out</button>
        </>
      ) : (
        <>
          <p>You are not logged in.</p>
          <button onClick={() => signIn("google")}>Sign in with Google</button>
        </>
      )}
    </div>
  );
}

🔹 อธิบายโค้ดนี้:

  • useSession() ใช้ดึงข้อมูล session ของผู้ใช้
  • ถ้าผู้ใช้ล็อกอินอยู่ จะแสดง ชื่อ และ รูปโปรไฟล์
  • ถ้ายังไม่ได้ล็อกอิน จะแสดงปุ่มให้กดล็อกอินผ่าน Google
  • signIn("google") และ signOut() เป็นฟังก์ชันสำหรับล็อกอินและล็อกเอาต์


ปรับแต่ง NextAuth.js

ถ้าคุณต้องการเพิ่ม database หรือเปลี่ยนแปลง behavior ของ NextAuth.js สามารถแก้ไข pages/api/auth/[...nextauth].js ได้ เช่น
ใช้ Credentials Login (อีเมล/รหัสผ่าน)

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

export default NextAuth({
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        email: { label: "Email", type: "email" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials) {
        if (credentials.email === "test@example.com" && credentials.password === "password123") {
          return { id: 1, name: "Test User", email: credentials.email };
        }
        return null;
      },
    }),
  ],
  secret: process.env.NEXTAUTH_SECRET,
});

💡 สิ่งที่เพิ่มเข้ามา:

  • CredentialsProvider ให้ผู้ใช้ล็อกอินด้วยอีเมล/รหัสผ่าน
  • ฟังก์ชัน authorize(credentials) ใช้ตรวจสอบข้อมูลผู้ใช้
  • ตอนนี้ใช้เงื่อนไขแบบง่าย ๆ (เช็คอีเมลกับรหัสผ่านตรงกัน) แต่ในโปรดักชันควรใช้ database หรือ hashed password


ใช้ Middleware เพื่อป้องกันหน้าเว็บที่ต้องล็อกอิน

ถ้าคุณต้องการป้องกันบางหน้าให้เฉพาะผู้ใช้ที่ล็อกอินแล้วเข้าถึงได้ สามารถใช้ Middleware ของ Next.js

สร้างไฟล์ middleware.js ที่ root ของโปรเจกต์

import { withAuth } from "next-auth/middleware";

export default withAuth({
  pages: {
    signIn: "/",
  },
});

📌 สิ่งที่ทำได้:

  • ถ้าผู้ใช้ไม่ได้ล็อกอิน จะถูก redirect ไปที่หน้า /
  • ใช้กับ server-side protection ได้ โดยใส่ใน API Routes


สรุป

✅ ติดตั้ง NextAuth.js และเพิ่ม API Route
✅ ตั้งค่า Google OAuth หรือใช้ Credentials Login
✅ เพิ่มปุ่มล็อกอิน/ล็อกเอาต์ ในหน้าเว็บ
✅ ใช้ Middleware เพื่อป้องกันหน้าที่ต้องล็อกอิน

NextAuth.js ทำให้การเพิ่มระบบล็อกอินใน Next.js ง่ายขึ้นมาก! ถ้าคุณต้องการระบบล็อกอินที่ ปลอดภัย, ยืดหยุ่น, และขยายต่อได้ง่าย NextAuth.js คือตัวเลือกที่ดีมากสำหรับคุณ 🚀

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

การจัดการ Layout ด้วย _app.js และ _document.js ใน Next.js

ถ้าคุณเคยเขียนเว็บแอปด้วย Next.js แล้วต้องการให้ทุกหน้ามีโครงสร้าง Layout เหมือนกัน เช่น มี Header, Footer, หรือใช้ธีมเดียวกัน คุณอาจจะเจอปัญหาว่า "ฉันต้องคัดลอกโค้ดพวกนี้ไปทุกหน้าเลยเหรอ?"

ข่าวดีคือ Next.js มีไฟล์พิเศษ _app.js และ _document.js ที่ช่วยให้เราจัดการ Layout และโครงสร้างเอกสาร HTML ได้ง่ายขึ้น!

ในบทความนี้ เราจะมาทำความเข้าใจว่า _app.js และ _document.js คืออะไร ใช้งานยังไง และมีเทคนิคอะไรที่ช่วยให้เว็บเราทำงานได้ดีขึ้น พร้อมตัวอย่างโค้ดแบบเข้าใจง่าย


 _app.js และ _document.js คืออะไร?


📌 _app.js (หรือ _app.tsx สำหรับ TypeScript)
  • เป็นไฟล์ที่ทำหน้าที่ ครอบทุกหน้าในเว็บของเรา
  • ใช้สำหรับ จัดการ Layout เช่น ใส่ Header, Footer, Theme, Global CSS
  • ใช้เพื่อ ควบคุม state ของแอป เช่น Redux, Context API

📌 _document.js
  • ใช้เพื่อกำหนด โครงสร้าง HTML พื้นฐาน ของเว็บ
  • ใช้ใส่พวก Meta tags, Font, Script ที่ต้องโหลดก่อนหน้าเว็บ
  • ใช้แก้ไข <html>, <head>, <body> ที่ Next.js สร้างขึ้นอัตโนมัติ

1. _app.js – ควบคุม Layout ของเว็บ

โค้ดตัวอย่าง _app.js

import '../styles/globals.css';

export default function MyApp({ Component, pageProps }) {
  return (
    <div>
      <header>My Header</header>
      <main>
        <Component {...pageProps} />
      </main>
      <footer>My Footer</footer>
    </div>
  );
}


อธิบายโค้ด

  • Component คือหน้าที่เรากำลังเข้าถึง เช่น /about หรือ /contact
  • pageProps คือข้อมูลที่ถูกส่งไปยังหน้านั้น ๆ
  • <header> และ <footer> จะอยู่เหมือนกันทุกหน้า


✅ ข้อดีของการใช้ _app.js

  • ทำให้ทุกหน้ามี Layout เหมือนกัน
  • ลดโค้ดซ้ำซ้อน ไม่ต้องใส่ <header> หรือ <footer> เองทุกหน้า


2. ใช้ Layout แยกตามหน้า

บางหน้าของเว็บอาจต้องการ Layout ที่แตกต่างกัน เช่น หน้า Dashboard กับหน้า Landing Page อาจใช้ Layout คนละแบบ
 

วิธีใช้ Layout แบบกำหนดเอง

export default function MyApp({ Component, pageProps }) {
  const getLayout = Component.getLayout || ((page) => page);

  return getLayout(<Component {...pageProps} />);
}

จากนั้นที่หน้าไหนที่ต้องการ Layout พิเศษ ให้เพิ่มฟังก์ชัน getLayout

import DashboardLayout from '../components/DashboardLayout';

export default function Dashboard() {
  return <h1>This is Dashboard</h1>;
}

Dashboard.getLayout = function getLayout(page) {
  return <DashboardLayout>{page}</DashboardLayout>;
};


✅ ข้อดีของวิธีนี้

  • ทำให้แต่ละหน้าสามารถใช้ Layout ที่แตกต่างกันได้
  • ไม่ต้องใช้เงื่อนไข if ใน _app.js ให้ยุ่งยาก


3. _document.js – ควบคุมโครงสร้าง HTML

ปกติแล้ว Next.js สร้างโครงสร้าง HTML อัตโนมัติให้ แต่ถ้าเราต้องการเพิ่ม Meta Tags, Font, หรือแก้ไข <html> และ <body> เราต้องใช้ _document.js
 

โค้ดตัวอย่าง _document.js

import { Html, Head, Main, NextScript } from 'next/document';

export default function MyDocument() {
  return (
    <Html lang="th">
      <Head>
        <meta charSet="UTF-8" />
        <meta name="description" content="This is my Next.js app" />
        <link rel="preconnect" href="https://fonts.googleapis.com" />
        <link
          href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;700&display=swap"
          rel="stylesheet"
        />
      </Head>
      <body>
        <Main />
        <NextScript />
      </body>
    </Html>
  );
}


อธิบายโค้ด

  • <Html lang="th"> → กำหนดภาษาเริ่มต้นเป็นภาษาไทย
  • <meta> → ใส่ข้อมูลเกี่ยวกับเว็บ เช่น คำอธิบาย
  • <link> → ใส่ฟอนต์จาก Google Fonts
  • <Main /> → ตรงนี้คือเนื้อหาของแต่ละหน้า
  • <NextScript /> → ใส่สคริปต์ที่ Next.js ต้องการ


✅ ข้อดีของการใช้ _document.js

  • กำหนดค่า <html> และ <body> ได้
  • ใส่ Global Meta Tags ได้ง่ายขึ้น
  • ทำให้เว็บโหลดเร็วขึ้น (ใช้ preconnect, preload)


4. ใช้ _app.js และ _document.js ร่วมกันให้เกิดประโยชน์สูงสุด

ลองดูโค้ดตัวอย่างที่ผสมทั้ง _app.js และ _document.js ให้ทำงานร่วมกัน

 _app.js

import '../styles/globals.css';
import Layout from '../components/Layout';

export default function MyApp({ Component, pageProps }) {
  return (
    <Layout>
      <Component {...pageProps} />
    </Layout>
  );
}


_document.js

import { Html, Head, Main, NextScript } from 'next/document';

export default function MyDocument() {
  return (
    <Html lang="en">
      <Head>
        <meta charSet="UTF-8" />
        <link rel="stylesheet" href="/global.css" />
      </Head>
      <body>
        <Main />
        <NextScript />
      </body>
    </Html>
  );
}


✅ ผลลัพธ์ที่ได้

  • ทุกหน้าจะถูกครอบด้วย <Layout> ที่เราสร้าง
  • Meta Tags และ Font ถูกใส่จาก _document.js
  • โค้ดสะอาดและเป็นระเบียบ


สรุป

ความสามารถ_app.js_document.js
ควบคุม Layout✅❌
ใส่ Meta Tags❌✅
ใส่ CSS/Theme✅✅
ใส่ Script พิเศษ❌✅
แก้ไข <html> และ <body>❌✅

  • _app.js ใช้สำหรับควบคุม Layout และการทำงานของแอป
  • _document.js ใช้สำหรับกำหนดโครงสร้าง HTML และ Meta Tags

ถ้าคุณใช้งานทั้งสองไฟล์ให้ถูกวิธี เว็บของคุณจะเร็วขึ้น โหลดเร็วขึ้น และจัดการง่ายขึ้นแน่นอน!

วันอาทิตย์ที่ 16 กุมภาพันธ์ พ.ศ. 2568

ติดตั้ง Next.js และเริ่มโปรเจกต์แรกแบบง่าย ๆ

    Next.js คือเฟรมเวิร์กที่พัฒนาขึ้นจาก React.js ซึ่งได้รับความนิยมอย่างมากในช่วงหลัง เพราะมันช่วยให้การพัฒนาเว็บแอปพลิเคชันที่ต้องการฟีเจอร์ขั้นสูง เช่น การเรนเดอร์ฝั่งเซิร์ฟเวอร์ (SSR), Static Site Generation (SSG), และการจัดการ SEO ทำได้ง่ายขึ้น แต่หากคุณเพิ่งเริ่มต้นกับ Next.js อาจจะรู้สึกงง ๆ ว่าต้องทำอะไรบ้างเพื่อเริ่มต้นโปรเจกต์แรกของคุณ

    วันนี้เราจะมาพูดถึงขั้นตอนการติดตั้ง Next.js และเริ่มโปรเจกต์แรกแบบไม่ยาก เพื่อให้คุณสามารถเริ่มใช้งานได้ทันที! มาดูกันว่าเราต้องทำอะไรบ้าง

ขั้นตอนที่ 1: ติดตั้ง Node.js และ npm

    ก่อนที่เราจะเริ่มโปรเจกต์ใน Next.js ได้ เราต้องติดตั้ง Node.js และ npm (Node Package Manager) ให้เรียบร้อยก่อน ถ้าคุณยังไม่ได้ติดตั้ง Node.js หรือไม่แน่ใจว่ามีแล้วหรือยัง สามารถตรวจสอบได้โดยการเปิด Terminal หรือ Command Prompt แล้วพิมพ์คำสั่งเหล่านี้:

node -v

และ

npm -v

หากมีการแสดงเวอร์ชันออกมาแสดงว่าคุณได้ติดตั้ง Node.js และ npm แล้ว แต่หากยังไม่มีก็สามารถดาวน์โหลด Node.js ได้ที่ https://nodejs.org เลือกเวอร์ชันที่แนะนำ (LTS) และติดตั้งตามขั้นตอน

เมื่อเสร็จแล้วลองตรวจสอบอีกครั้งว่ามีการติดตั้งสำเร็จแล้วหรือยัง

ขั้นตอนที่ 2: สร้างโปรเจกต์ใหม่ด้วย Next.js

เมื่อคุณติดตั้ง Node.js และ npm เรียบร้อยแล้ว ขั้นตอนต่อไปคือการสร้างโปรเจกต์ใหม่ด้วย Next.js ซึ่งเราสามารถใช้คำสั่ง create-next-app ในการสร้างโปรเจกต์ได้อย่างง่ายดาย

  1.     เปิด Terminal หรือ Command Prompt
  2.     ใช้คำสั่งนี้เพื่อสร้างโปรเจกต์ใหม่

npx create-next-app@latest ชื่อโปรเจกต์ของคุณ

ตัวอย่างเช่น หากคุณอยากตั้งชื่อโปรเจกต์ว่า my-first-next-project ก็พิมพ์คำสั่งนี้:

npx create-next-app@latest my-first-next-project

คำสั่งนี้จะดาวน์โหลดเทมเพลตพื้นฐานของ Next.js และติดตั้ง dependencies ที่จำเป็นทั้งหมดให้คุณ โดยไม่ต้องตั้งค่ามือเอง

ขั้นตอนที่ 3: เข้าไปในโฟลเดอร์โปรเจกต์

เมื่อการสร้างโปรเจกต์เสร็จสมบูรณ์ ให้เข้าไปในโฟลเดอร์ของโปรเจกต์ที่เพิ่งสร้างขึ้น โดยใช้คำสั่ง:

cd my-first-next-project

ขั้นตอนที่ 4: รันโปรเจกต์แรก

หลังจากที่คุณเข้าไปในโฟลเดอร์โปรเจกต์แล้ว คุณสามารถเริ่มรันโปรเจกต์ของคุณได้ทันที โดยใช้คำสั่งนี้:

npm run dev

คำสั่งนี้จะเริ่มเซิร์ฟเวอร์ในโหมดพัฒนา (development mode) และโปรเจกต์ของคุณจะรันที่ http://localhost:3000 ถ้าทุกอย่างทำงานถูกต้อง คุณสามารถเปิดเบราว์เซอร์แล้วพิมพ์ URL นี้เพื่อดูหน้าเว็บแรกของคุณ

ขั้นตอนที่ 5: ทำความเข้าใจโครงสร้างโปรเจกต์

เมื่อคุณสร้างโปรเจกต์ Next.js ใหม่แล้ว คุณจะเห็นโครงสร้างของโฟลเดอร์ที่ค่อนข้างง่ายและเข้าใจได้ไม่ยาก ลองมาดูกันว่าในโปรเจกต์ที่สร้างขึ้นมาจะมีโฟลเดอร์และไฟล์อะไรบ้าง:

  • pages/: โฟลเดอร์นี้จะเก็บไฟล์ที่เป็นหน้าเว็บ (pages) ของโปรเจกต์ เช่น index.js คือหน้าแรกของเว็บไซต์
  • public/: โฟลเดอร์นี้จะเก็บไฟล์ที่เป็นสาธารณะ เช่น รูปภาพ ไฟล์ .txt หรือไฟล์อื่น ๆ ที่สามารถเข้าถึงได้จาก URL
  • styles/: โฟลเดอร์นี้จะเก็บไฟล์ CSS สำหรับตกแต่งหน้าเว็บ
  • node_modules/: โฟลเดอร์ที่ npm สร้างขึ้นเพื่อเก็บ dependencies ที่จำเป็นสำหรับโปรเจกต์
  • package.json: ไฟล์นี้จะเก็บข้อมูลเกี่ยวกับโปรเจกต์ เช่น dependencies, scripts, และ metadata อื่น ๆ

ในโฟลเดอร์ pages คุณจะเห็นไฟล์ index.js ซึ่งเป็นหน้าแรกของเว็บไซต์ คุณสามารถแก้ไขไฟล์นี้เพื่อเปลี่ยนแปลงเนื้อหาของหน้าแรกได้ทันที

ขั้นตอนที่ 6: แก้ไขหน้าแรกของคุณ

ลองเปิดไฟล์ pages/index.js และเปลี่ยนเนื้อหาภายในไฟล์นี้สักหน่อยเพื่อทดสอบการทำงานของ Next.js ตัวอย่างเช่น:

function HomePage() {
  return (
    <div>
      <h1>ยินดีต้อนรับสู่โปรเจกต์แรกของคุณใน Next.js!</h1>
      <p>นี่คือหน้าแรกของเว็บไซต์ที่คุณสร้างขึ้นมา</p>
    </div>
  );
}

export default HomePage;

จากนั้นบันทึกไฟล์และไปที่เบราว์เซอร์เพื่อรีเฟรชหน้า http://localhost:3000 คุณจะเห็นการเปลี่ยนแปลงที่คุณทำทันที

ขั้นตอนที่ 7: การเพิ่มหน้าใหม่

หนึ่งในคุณสมบัติที่ยอดเยี่ยมของ Next.js คือระบบ Routing ที่อัตโนมัติ เพียงแค่คุณสร้างไฟล์ใหม่ในโฟลเดอร์ pages หน้าใหม่ก็จะถูกสร้างขึ้นโดยอัตโนมัติ ลองสร้างไฟล์ใหม่ชื่อ about.js ในโฟลเดอร์ pages และใส่โค้ดนี้:

function AboutPage() {
  return (
    <div>
      <h1>เกี่ยวกับเรา</h1>
      <p>นี่คือหน้าที่เกี่ยวกับเว็บไซต์ของเรา</p>
    </div>
  );
}

export default AboutPage;

ตอนนี้คุณสามารถไปที่ http://localhost:3000/about เพื่อดูหน้า "เกี่ยวกับเรา" ที่คุณเพิ่งสร้างขึ้นได้เลย

ขั้นตอนที่ 8: การใช้งาน Link ใน Next.js

Next.js มีคอมโพเนนต์ที่เรียกว่า Link ซึ่งช่วยให้การทำ routing ภายในเว็บไซต์ง่ายขึ้นโดยไม่ต้องโหลดหน้าใหม่ทั้งหมด ลองใช้ Link เพื่อเพิ่มลิงก์ไปยังหน้า "เกี่ยวกับเรา" ที่คุณสร้างขึ้น:

เปิดไฟล์ index.js แล้วเพิ่มโค้ดนี้:

import Link from 'next/link';

function HomePage() {
  return (
    <div>
      <h1>ยินดีต้อนรับสู่โปรเจกต์แรกของคุณใน Next.js!</h1>
      <p><Link href="/about">ไปยังหน้าที่เกี่ยวกับเรา</Link></p>
    </div>
  );
}

export default HomePage;

ตอนนี้เมื่อคุณไปที่หน้าแรก คุณจะเห็นลิงก์ที่สามารถคลิกเพื่อไปยังหน้า "เกี่ยวกับเรา" ได้ทันที

สรุป

การเริ่มต้นกับ Next.js นั้นไม่ยากเลย! เราเพียงแค่ต้องติดตั้ง Node.js, สร้างโปรเจกต์ใหม่ด้วยคำสั่ง create-next-app, รันโปรเจกต์, แล้วเริ่มแก้ไขหน้าเว็บและเพิ่มหน้าใหม่ตามต้องการ Next.js ทำให้การพัฒนาเว็บแอปพลิเคชันง่ายขึ้นและมีเครื่องมือที่ครบครันสำหรับการทำงานในระดับสูง

ลองสร้างโปรเจกต์และทดสอบฟีเจอร์ต่าง ๆ ที่ Next.js มีให้ดูนะครับ รับรองว่าคุณจะสนุกกับการสร้างเว็บแอปพลิเคชันใน Next.js มากขึ้น!

วันเสาร์ที่ 15 กุมภาพันธ์ พ.ศ. 2568

ข้อแตกต่างระหว่าง Next.js กับ React.js

    ในวงการพัฒนาเว็บวันนี้ คงไม่มีใครไม่รู้จัก React.js หรือ Next.js ที่ได้รับความนิยมอย่างมากจากนักพัฒนาเว็บทั่วโลก แต่หลายคนอาจจะยังไม่รู้ว่า React.js กับ Next.js นั้นมีข้อแตกต่างกันอย่างไร และควรเลือกใช้อะไรดี วันนี้เราจะมาพูดถึงข้อแตกต่างระหว่างสองตัวนี้แบบง่าย ๆ ครับ

React.js คืออะไร?

    ก่อนที่เราจะไปพูดถึงความแตกต่าง เรามาทำความเข้าใจกันก่อนว่า React.js คืออะไร React.js เป็น JavaScript library ที่ถูกพัฒนาโดย Facebook (หรือ Meta ในปัจจุบัน) เพื่อช่วยให้การพัฒนา UI (User Interface) ของแอปพลิเคชันเว็บง่ายขึ้น โดยมันใช้แนวคิดที่เรียกว่า "component-based architecture" หรือการออกแบบเป็นส่วน ๆ ทำให้เราสามารถสร้างส่วนต่าง ๆ ของ UI แล้วนำมาประกอบกันเป็นแอปพลิเคชันใหญ่ได้

    React.js ให้เราได้ทำงานกับ "component" ที่มีสถานะ (state) และคุณสมบัติ (props) ซึ่งทำให้การจัดการกับ UI และการแสดงผลข้อมูลจากแหล่งต่าง ๆ ทำได้ง่ายและสะดวก

Next.js คืออะไร?

    Next.js คือเว็บเฟรมเวิร์กที่ถูกสร้างขึ้นมาโดย Vercel ที่ใช้ React.js เป็นฐานหลัก แต่มันมีคุณสมบัติที่ทำให้การพัฒนาเว็บแอปพลิเคชันง่ายขึ้น และยืดหยุ่นมากขึ้น ไม่ว่าจะเป็นการจัดการกับ SEO (Search Engine Optimization) การเรนเดอร์ข้อมูลที่ฝั่งเซิร์ฟเวอร์ (Server-side Rendering หรือ SSR) หรือการทำ Static Site Generation (SSG) นอกจากนี้ Next.js ยังรองรับการพัฒนาแบบ full-stack ได้อีกด้วย

    Next.js เป็นเฟรมเวิร์กที่รวมหลาย ๆ ฟีเจอร์ที่จำเป็นในการสร้างเว็บแอปพลิเคชันในโลกยุคใหม่ ซึ่ง React.js เองไม่ได้มีฟีเจอร์เหล่านี้มาให้ในตัว

ความแตกต่างหลักระหว่าง React.js กับ Next.js

1. React.js เป็นไลบรารี ส่วน Next.js เป็นเฟรมเวิร์ก

    สิ่งแรกที่ต้องรู้คือ React.js เป็นไลบรารี (Library) ที่ช่วยในการสร้าง UI ในขณะที่ Next.js เป็นเฟรมเวิร์ก (Framework) ที่ให้โครงสร้างการพัฒนาแอปพลิเคชัน โดย Next.js ได้รวมฟีเจอร์มากมายที่ช่วยในการพัฒนาเว็บแอปพลิเคชันให้สะดวกและง่ายขึ้น ไม่ว่าจะเป็นการทำ SEO, การเรนเดอร์ฝั่งเซิร์ฟเวอร์, หรือการทำ Static Generation

2. Server-Side Rendering (SSR) และ Static Site Generation (SSG)

    หนึ่งในข้อดีที่ใหญ่ที่สุดของ Next.js คือการรองรับการเรนเดอร์ฝั่งเซิร์ฟเวอร์ (SSR) และการสร้างเว็บไซต์แบบ Static (SSG) ซึ่งช่วยให้เว็บไซต์โหลดเร็วและรองรับ SEO ได้ดีขึ้น

  •     SSR คือการที่เรานำข้อมูลมาจากเซิร์ฟเวอร์แล้วเรนเดอร์หน้าบนเซิร์ฟเวอร์ก่อนที่จะส่งไปให้ผู้ใช้ เมื่อเทียบกับ React.js ที่จะเรนเดอร์ส่วนใหญ่บนฝั่งไคลเอนต์ (Client-side rendering หรือ CSR)
  •     SSG คือการสร้างไฟล์ HTML ที่ได้จากข้อมูลที่เรากำหนดล่วงหน้าไว้แล้ว เช่น ข้อมูลของบทความในบล็อก ซึ่งจะถูกสร้างขึ้นตอนที่เรา build เว็บไซต์

    React.js เองไม่ได้มีฟีเจอร์พวกนี้มาให้ ต้องมีการตั้งค่าเพิ่มเติมเพื่อให้ทำงานในลักษณะนี้

3. Routing ใน Next.js

    ใน React.js การทำ routing หรือการสร้างเส้นทางไปยังหน้าอื่น ๆ ของเว็บไซต์จะต้องใช้ไลบรารีเสริม เช่น React Router เพื่อให้สามารถเปลี่ยนหน้าได้ แต่ใน Next.js นั้นมีระบบ routing มาให้พร้อมเลยโดยไม่ต้องติดตั้งอะไรเพิ่ม โดยการสร้างไฟล์ในโฟลเดอร์ pages ในโปรเจกต์จะทำให้ไฟล์นั้นกลายเป็นหน้าเว็บได้ทันที

    การทำ routing ใน React.js ต้องมีกระบวนการติดตั้งและตั้งค่ามากกว่า ขณะที่ Next.js สะดวกกว่าเยอะ

4. การทำงานกับ Data Fetching

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

    ใน React.js การดึงข้อมูลจะทำได้ผ่านการใช้ useEffect หรือ componentDidMount และมักจะต้องมีการจัดการเองอย่างละเอียดกว่า

5. การจัดการ SEO

    ถ้าพูดถึง SEO บนเว็บแอปพลิเคชัน Next.js ทำได้ดีกว่า React.js เพราะการเรนเดอร์ฝั่งเซิร์ฟเวอร์ (SSR) ทำให้สามารถส่ง HTML ที่เต็มรูปแบบไปยังบอทของ Google ซึ่งช่วยให้เว็บไซต์ติดอันดับการค้นหาได้ดีกว่า ในขณะที่ React.js นั้นมักจะต้องมีการทำ SEO ด้วยมือหรือใช้เครื่องมือเสริม เช่น React Helmet

สรุป

    ในที่สุดแล้ว การเลือกใช้ React.js หรือ Next.js ขึ้นอยู่กับความต้องการและลักษณะของโปรเจกต์ หากคุณต้องการพัฒนาแค่ UI หรือ Single Page Application ที่ไม่ได้มีฟีเจอร์พิเศษมากมาย React.js ก็เพียงพอแล้ว แต่ถ้าคุณต้องการฟีเจอร์ที่มากกว่า เช่น การรองรับ SSR, SSG, SEO ที่ดีขึ้น และการทำ routing ที่สะดวก Next.js ก็เป็นตัวเลือกที่ดีที่สุด

    โดยสรุปแล้ว React.js เป็นไลบรารีที่ให้คุณสร้าง UI ได้ง่าย ๆ ส่วน Next.js เป็นเฟรมเวิร์กที่ให้โครงสร้างการพัฒนาเว็บที่ครบครันกว่า ทั้งการเรนเดอร์ข้อมูลบนเซิร์ฟเวอร์, การจัดการ routing, และการทำ SEO ที่เหนือกว่า

    หวังว่าบล็อกนี้จะช่วยให้คุณเห็นข้อแตกต่างระหว่าง Next.js และ React.js และสามารถตัดสินใจเลือกใช้งานตามความต้องการของคุณได้ดีขึ้นนะครับ!

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

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