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

วันจันทร์ที่ 31 มีนาคม พ.ศ. 2568

การจัดการฟอร์มใน Next.js ด้วย React Hook Form: ใช้ง่าย ประหยัดแรง

ถ้าพูดถึงการจัดการฟอร์มใน React หรือ Next.js หลายคนคงเคยเจอปัญหาปวดหัวกับการจัดการ state, validation, และการ submit ข้อมูลกันใช่ไหม? วันนี้เราจะมาทำความรู้จักกับ React Hook Form ซึ่งเป็นหนึ่งในไลบรารีจัดการฟอร์มที่ดีที่สุดสำหรับ React และ Next.js ทำให้ชีวิตนักพัฒนาง่ายขึ้นเยอะ!

ทำไมต้องใช้ React Hook Form?

โดยปกติ ถ้าเราจัดการฟอร์มใน React ด้วย useState() เราจะต้องสร้าง state แยกกันตามฟิลด์ของฟอร์ม เช่น

const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');

แล้วทุกครั้งที่มีการเปลี่ยนค่าฟิลด์ เราต้องใช้ onChange มาจับข้อมูลอีก

<input type="text" value={name} onChange={(e) => setName(e.target.value)} />

มันใช้ได้ก็จริง แต่มันเยอะและยุ่งยาก!

React Hook Form (RHF) ช่วยลดความยุ่งยากนี้ ด้วยการทำให้ฟอร์มเป็นแบบ uncontrolled ซึ่งหมายความว่า ไม่ต้องใช้ useState() คุมค่าฟิลด์แบบ manual แต่ให้ React ทำงานร่วมกับ DOM โดยตรง

ติดตั้ง React Hook Form

ก่อนอื่น ต้องติดตั้ง React Hook Form ก่อน

npm install react-hook-form

หรือถ้าใช้ Yarn

yarn add react-hook-form


ใช้ React Hook Form ใน Next.js

มาดูโค้ดตัวอย่างง่ายๆ ของการใช้งาน React Hook Form ใน Next.js

สร้างฟอร์มแบบง่าย

import { useForm } from 'react-hook-form';

export default function MyForm() {
  const { register, handleSubmit } = useForm();

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('name')} placeholder="ชื่อ" />
      <input {...register('email')} type="email" placeholder="อีเมล" />
      <button type="submit">ส่ง</button>
    </form>
  );
}

อธิบายโค้ด:

  • useForm() คือฟังก์ชันหลักที่ใช้ดึง API ต่างๆ
  • register() ใช้สำหรับเชื่อมโยงอินพุตฟอร์มกับ React Hook Form
  • handleSubmit(onSubmit) ใช้จัดการการส่งฟอร์ม
  • data ที่ได้จาก onSubmit() จะเป็นอ็อบเจ็กต์ที่รวมค่าทั้งหมดในฟอร์ม


การเพิ่ม Validation

ถ้าไม่อยากให้ผู้ใช้กรอกมั่วๆ ก็ต้องเพิ่ม Validation Rules เข้าไป โดยใช้ register()

import { useForm } from 'react-hook-form';

export default function MyForm() {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm();

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register('name', { required: 'ต้องกรอกชื่อ' })} placeholder="ชื่อ" />
      {errors.name && <p>{errors.name.message}</p>}

      <input {...register('email', { required: 'ต้องกรอกอีเมล', pattern: { value: /\S+@\S+\.\S+/, message: 'รูปแบบอีเมลไม่ถูกต้อง' } })} placeholder="อีเมล" />
      {errors.email && <p>{errors.email.message}</p>}

      <button type="submit">ส่ง</button>
    </form>
  );
}

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

  • ใช้ errors เพื่อตรวจจับข้อผิดพลาดในแต่ละฟิลด์
  • ถ้ามี error จะแสดงข้อความแจ้งเตือนใต้ input


การใช้ Default Values

บางครั้งเราอาจต้องกำหนดค่าตั้งต้นให้ฟอร์ม เช่น กรณีแก้ไขข้อมูลผู้ใช้

const { register, handleSubmit } = useForm({
  defaultValues: {
    name: 'John Doe',
    email: 'john@example.com',
  },
});


ใช้ Controller กับ React Hook Form

ถ้าเราต้องใช้ React Component ของบุคคลที่สาม (เช่น React Select หรือ DatePicker) ที่ไม่รองรับ register() โดยตรง เราต้องใช้ Controller

import { useForm, Controller } from 'react-hook-form';
import Select from 'react-select';

export default function MyForm() {
  const { control, handleSubmit } = useForm();

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <Controller
        name="gender"
        control={control}
        render={({ field }) => <Select {...field} options={[{ label: 'ชาย', value: 'male' }, { label: 'หญิง', value: 'female' }]} />}
      />
      <button type="submit">ส่ง</button>
    </form>
  );
}

ใช้งานร่วมกับ Next.js API Routes

ถ้าเราต้องการส่งข้อมูลไปที่ API ใน Next.js สามารถทำแบบนี้

const onSubmit = async (data) => {
  const response = await fetch('/api/submit', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(data),
  });
  const result = await response.json();
  console.log(result);
};

ฝั่ง API Route (/pages/api/submit.js)

export default function handler(req, res) {
  if (req.method === 'POST') {
    res.status(200).json({ message: 'ฟอร์มถูกส่งแล้ว!', data: req.body });
  } else {
    res.status(405).json({ message: 'Method Not Allowed' });
  }
}

สรุป

React Hook Form เป็นตัวช่วยที่ทำให้การจัดการฟอร์มใน Next.js ง่ายขึ้น ลดโค้ดที่ต้องเขียน และรองรับ validation แบบ built-in

  • ใช้งานง่าย – ใช้ register() เชื่อมโยงฟิลด์ได้เลย
  • ไม่ต้องใช้ useState() แยกฟิลด์ – ประหยัดโค้ด
  • รองรับ validation ในตัว – กำหนดเงื่อนไขได้ง่าย
  • ทำงานเร็วกว่าโซลูชันอื่นๆ เช่น Formik

ถ้าคุณต้องการจัดการฟอร์มใน Next.js React Hook Form คือคำตอบ!

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

การใช้ Zustand หรือ Redux ใน Next.js: อะไรดีกว่ากัน?

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

ทำไมต้องจัดการ State ใน Next.js?

Next.js เป็น React Framework ที่ช่วยให้เราสร้างเว็บแอปพลิเคชันได้เร็วและดีขึ้น แต่ถึงจะเทพแค่ไหน Next.js ก็ยังมีปัญหาเรื่องการจัดการ state ที่เราต้องคิดหนัก โดยเฉพาะเมื่อเว็บของเรามีหลายหน้า (multi-page) หรือมีข้อมูลที่แชร์กันระหว่างคอมโพเนนต์หลายตัว

ในกรณีที่ state ของเราซับซ้อนขึ้น การใช้ useState() หรือ useContext() อาจจะไม่พอแล้ว เช่น

  • มีหลายคอมโพเนนต์ต้องใช้ข้อมูลร่วมกัน
  • ต้องเก็บสถานะของผู้ใช้ที่ล็อกอิน
  • ต้องดึงข้อมูลจาก API แล้วแชร์ให้ทุกหน้าใช้

ถึงจุดนี้แหละ ที่พวก State Management Library อย่าง Zustand และ Redux โผล่มาช่วยชีวิตเรา

Redux: เจ้าพ่อ State Management

จุดเด่นของ Redux

Redux เป็น state container ระดับตำนานที่อยู่กับ React มานาน มันใช้ single source of truth (เก็บ state ไว้ที่เดียว) และเปลี่ยนค่า state ด้วย action และ reducer

สิ่งที่ทำให้ Redux เจ๋งคือ

  • Predictable State – ทุกการเปลี่ยนแปลงของ state ถูกควบคุมโดย action และ reducer ทำให้ debug ง่าย
  • DevTools สุดเทพ – มี Redux DevTools ให้ตรวจสอบทุกการเปลี่ยนแปลงของ state ได้แบบ real-time
  • Ecosystem ใหญ่โต – มี middleware อย่าง Redux Thunk หรือ Redux Saga ช่วยให้จัดการ asynchronous action ได้ง่ายขึ้น


จุดด้อยของ Redux

  • โค้ดยาว – Redux ต้องสร้าง action, reducer และ dispatch ซึ่งทำให้โค้ดยืดยาว ถ้าทำผิดที่เดียวอาจล้มทั้งระบบ
  • ต้องใช้ boilerplate เยอะ – แค่จะอัพเดท state ต้องผ่านหลายขั้นตอน เช่น สร้าง action → dispatch action → reducer → update store
  • Learning Curve สูง – สำหรับมือใหม่ Redux อาจทำให้ปวดหัว เพราะต้องเข้าใจโครงสร้างหลายอย่าง



Zustand: เบา สั้น และเร็ว

จุดเด่นของ Zustand

Zustand เป็น state management ที่เบาและง่ายกว่า Redux มันใช้แนวคิดของ flux pattern แต่ไม่ต้องมี action หรือ reducer ให้วุ่นวาย

สิ่งที่ทำให้ Zustand น่าสนใจคือ

  • API ใช้ง่าย – ไม่ต้องมี action หรือ reducer แค่สร้าง store แล้วใช้ได้เลย
  • ไม่มี boilerplate – Zustand ใช้ฟังก์ชันเดียวสร้าง state ได้ทันที
  • ใช้งานร่วมกับ Server Components ได้ดี – ทำให้เหมาะกับ Next.js ที่ใช้ App Router


จุดด้อยของ Zustand

  • ไม่มี DevTools ที่เทพเท่า Redux – ถ้าต้องการ debug อาจต้องใช้ console.log แทน
  • เหมาะกับโปรเจกต์ขนาดกลาง-เล็ก – ถ้าเป็นแอปขนาดใหญ่ Redux อาจจะควบคุม state ได้ดีกว่า





เปรียบเทียบ Redux vs Zustand

Feature Redux Zustand
โครงสร้างโค้ด ซับซ้อน ต้องมี action, reducer, store เรียบง่าย ใช้ฟังก์ชันเดียวสร้าง store
Performance อาจมี overhead สูงถ้าใช้ไม่ดี เบาและเร็วกว่า Redux
DevTools Redux DevTools ช่วย debug ได้ดี มี DevTools แต่ไม่เทพเท่า Redux
การใช้งานกับ Next.js ต้อง config เพิ่ม ใช้งานง่าย ไม่มี config ยุ่งยาก
เหมาะกับโปรเจกต์ ใหญ่และซับซ้อน เล็ก-กลาง


ควรใช้ Zustand หรือ Redux ใน Next.js?

ใช้ Redux ถ้า

✅ โปรเจกต์ของคุณ ซับซ้อน และต้องจัดการ state เยอะ
✅ ต้องการ DevTools เพื่อ debug state ได้ง่าย
✅ แอปของคุณต้องการ middleware เช่น Redux Thunk หรือ Redux Saga

ใช้ Zustand ถ้า

✅ คุณต้องการโค้ดที่ เรียบง่าย และ ไม่ต้องการ boilerplate
✅ โปรเจกต์ของคุณเป็น ขนาดเล็ก-กลาง และไม่ต้องการ state management ที่หนัก
✅ คุณใช้ Next.js App Router และต้องการ state management ที่เข้ากันได้ดี


ตัวอย่างการใช้ Redux กับ Next.js

ก่อนจะใช้ Redux กับ Next.js ต้องติดตั้งแพ็กเกจก่อน

npm install @reduxjs/toolkit react-redux

จากนั้นสร้าง store.js

import { configureStore, createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: (state) => { state.value += 1; },
    decrement: (state) => { state.value -= 1; },
  },
});

export const { increment, decrement } = counterSlice.actions;

export const store = configureStore({
  reducer: {
    counter: counterSlice.reducer,
  },
});

แล้วใช้ Provider ใน _app.js หรือ layout.js

import { Provider } from 'react-redux';
import { store } from '../store';

export default function App({ Component, pageProps }) {
  return (
    <Provider store={store}>
      <Component {...pageProps} />
    </Provider>
  );
}

ดึงค่า state ไปใช้ในคอมโพเนนต์

import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement } from '../store';

export default function Counter() {
  const count = useSelector((state) => state.counter.value);
  const dispatch = useDispatch();

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={() => dispatch(increment())}>+</button>
      <button onClick={() => dispatch(decrement())}>-</button>
    </div>
  );
}

ตัวอย่างการใช้ Zustand กับ Next.js

ติดตั้ง Zustand ก่อน

npm install zustand

สร้าง store.js

import { create } from 'zustand';

const useCounterStore = create((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
  decrement: () => set((state) => ({ count: state.count - 1 })),
}));

export default useCounterStore;

ใช้ในคอมโพเนนต์

import useCounterStore from '../store';

export default function Counter() {
  const { count, increment, decrement } = useCounterStore();

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={increment}>+</button>
      <button onClick={decrement}>-</button>
    </div>
  );
}

สรุป

  • Redux เหมาะกับโปรเจกต์ขนาดใหญ่ที่ต้องการความเป็นระบบ
  • Zustand เหมาะกับโปรเจกต์ที่ต้องการความง่ายและเร็ว
  • ถ้าคุณไม่แน่ใจ ให้ลองใช้ Zustand ก่อน ถ้ารู้สึกว่าไม่พอ ค่อยย้ายไป Redux

สุดท้ายแล้ว การเลือกเครื่องมือขึ้นอยู่กับ ความเหมาะสมของโปรเจกต์ ไม่มีกฎตายตัวว่าต้องใช้ตัวไหนเสมอไป

วันจันทร์ที่ 17 มีนาคม พ.ศ. 2568

วิธีใช้ OAuth (Google, Facebook, GitHub) กับ NextAuth.js

ถ้าพูดถึงการทำระบบล็อกอินแบบ Single Sign-On (SSO) ในแอปพลิเคชันเว็บที่ใช้ Next.js ก็คงหนีไม่พ้น NextAuth.js ที่เป็นไลบรารีสุดเทพ ช่วยให้เราสามารถจัดการเรื่องการยืนยันตัวตน (Authentication) ได้ง่ายมาก ๆ แถมยังรองรับ OAuth จากหลายแพลตฟอร์ม เช่น Google, Facebook, GitHub แบบไม่ต้องปวดหัวกับการเขียนโค้ดเยอะ

บทความนี้จะพาไปดูวิธีใช้งาน OAuth กับ NextAuth.js ตั้งแต่ต้นจนจบ รับรองว่าทำตามได้ง่าย ไม่งงแน่นอน! 🚀

🧐 NextAuth.js คืออะไร?

NextAuth.js เป็นไลบรารีที่ช่วยจัดการ Authentication บน Next.js โดยรองรับทั้ง

✅ Email-based login
✅ Credentials-based login
✅ OAuth (เช่น Google, Facebook, GitHub)
✅ JWT และ Database sessions

ความเจ๋งคือ ไม่ต้องเซ็ต Backend เอง เพราะมันจัดการให้หมดแล้ว แค่ติดตั้งและคอนฟิกให้ถูกต้องก็ใช้งานได้เลย!

🛠️ ติดตั้ง NextAuth.js

ก่อนอื่น เราต้องมีโปรเจกต์ Next.js ก่อน ถ้ายังไม่มี ก็สร้างใหม่ได้เลย:

npx create-next-app@latest my-auth-app
cd my-auth-app
npm install next-auth

จากนั้นก็เปิดไฟล์ .env.local แล้วตั้งค่าตัวแปรแวดล้อมที่เกี่ยวข้องกับ OAuth ที่เราจะใช้ (เช่น Google, Facebook, GitHub)


🔑 การตั้งค่า OAuth Provider

1️⃣ ตั้งค่า Google OAuth

ไปที่ Google Cloud Console (https://console.cloud.google.com/) แล้วทำตามนี้:

  1. สร้างโปรเจกต์ใหม่
  2. ไปที่ APIs & Services > Credentials
  3. กด Create Credentials > OAuth Client ID
  4. ตั้งค่า Authorized redirect URIs เป็น: http://localhost:3000/api/auth/callback/google
  5. ก๊อบปี้ Client ID และ Client Secret มาใส่ใน .env.local


GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret

2️⃣ ตั้งค่า Facebook OAuth

ไปที่ Meta for Developers (https://developers.facebook.com/) แล้วทำตามนี้:

  1. สร้างแอปใหม่
  2. ไปที่ Settings > Basic แล้วจด App ID และ App Secret
  3. ไปที่ Facebook Login > Settings แล้วตั้งค่า Valid OAuth Redirect URIs เป็น: http://localhost:3000/api/auth/callback/facebook
  4. เพิ่มค่าเหล่านี้ใน .env.local


FACEBOOK_CLIENT_ID=your-facebook-app-id
FACEBOOK_CLIENT_SECRET=your-facebook-app-secret

3️⃣ ตั้งค่า GitHub OAuth

ไปที่ GitHub Developer Settings (https://github.com/settings/developers) แล้วทำตามนี้:

  1. กด New OAuth App
  2. ตั้งค่า Authorization callback URL เป็น: http://localhost:3000/api/auth/callback/github
  3. ก๊อบปี้ Client ID และ Client Secret มาใส่ใน .env.local


GITHUB_CLIENT_ID=your-github-client-id
GITHUB_CLIENT_SECRET=your-github-client-secret

🔌 คอนฟิก NextAuth.js

สร้างไฟล์ pages/api/auth/[...nextauth].js แล้วใส่โค้ดนี้:

import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";
import FacebookProvider from "next-auth/providers/facebook";
import GitHubProvider from "next-auth/providers/github";

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
    FacebookProvider({
      clientId: process.env.FACEBOOK_CLIENT_ID,
      clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
    }),
    GitHubProvider({
      clientId: process.env.GITHUB_CLIENT_ID,
      clientSecret: process.env.GITHUB_CLIENT_SECRET,
    }),
  ],
  callbacks: {
    async session({ session, token }) {
      session.user.id = token.sub;
      return session;
    },
  },
});

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

  • เรา import NextAuth และเพิ่ม Google, Facebook, GitHub เป็น OAuth Providers
  • ใช้ Environment Variables (process.env...) เพื่อความปลอดภัย
  • เพิ่ม Callback function เพื่อให้ Session มีค่า user.id


🎨 สร้าง UI สำหรับล็อกอิน

ไปที่ pages/index.js แล้วเพิ่มปุ่มล็อกอิน / ออกจากระบบ

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

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

  return (
    <div>
      <h1>NextAuth.js OAuth Demo</h1>
      {session ? (
        <div>
          <p>Welcome, {session.user.name}</p>
          <button onClick={() => signOut()}>Sign Out</button>
        </div>
      ) : (
        <button onClick={() => signIn()}>Sign In</button>
      )}
    </div>
  );
}

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

  • ใช้ useSession() เช็กสถานะล็อกอิน
  • ถ้าล็อกอินแล้ว แสดงชื่อและปุ่ม Sign Out
  • ถ้ายังไม่ล็อกอิน แสดงปุ่ม Sign In


🚀 ทดสอบการล็อกอิน

    รันเซิร์ฟเวอร์:

    npm run dev

    เปิด http://localhost:3000 แล้วลองกด Sign In
    เลือกล็อกอินผ่าน Google, Facebook หรือ GitHub

🎯 สรุป

NextAuth.js ทำให้การเพิ่ม OAuth Login เป็นเรื่องง่ายมาก 🔥
แค่ติดตั้ง, คอนฟิก Providers, สร้าง UI แล้วก็ใช้งานได้เลย!

✅ รองรับหลายแพลตฟอร์ม
✅ ไม่ต้องเขียน Backend เอง
✅ ใช้กับ Next.js ได้แบบ Native

ใครกำลังหาโซลูชัน Authentication สำหรับ Next.js นี่คือทางเลือกที่ดีที่สุด! 🚀

วันอังคารที่ 11 มีนาคม พ.ศ. 2568

การใช้ MongoDB กับ Next.js

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

ในบทความนี้เราจะมาทำความเข้าใจวิธีการ ใช้ MongoDB กับ Next.js โดยจะอธิบายตั้งแต่การติดตั้งการเชื่อมต่อกับ MongoDB ไปจนถึงการใช้งานฐานข้อมูลใน API Routes ของ Next.js และแนวทางการออกแบบระบบอย่างมีประสิทธิภาพ

ทำไม MongoDB ถึงเหมาะสมกับ Next.js?

1. การจัดการข้อมูลแบบ NoSQL

MongoDB เป็นฐานข้อมูลประเภท NoSQL ที่เก็บข้อมูลในรูปแบบของเอกสาร (Document) ซึ่งแตกต่างจากฐานข้อมูล SQL ที่เก็บข้อมูลในตารางแบบเชิงสัมพันธ์ (Relational Database) โดยเอกสารใน MongoDB จะเก็บข้อมูลในรูปแบบของ JSON-like หรือ BSON (Binary JSON) ที่สามารถเก็บข้อมูลในโครงสร้างที่ยืดหยุ่นได้ ซึ่งเหมาะสำหรับการพัฒนาเว็บแอปที่ต้องการการจัดเก็บข้อมูลที่ไม่ตายตัว

2. ความยืดหยุ่นในการขยายตัว

MongoDB รองรับการขยายตัวได้ง่ายและมีการจัดการข้อมูลที่สามารถทำงานได้ดีในสถานการณ์ที่ข้อมูลจำนวนมากมีการเปลี่ยนแปลงตลอดเวลา โดยที่ไม่ต้องกังวลเรื่องโครงสร้างที่คงที่

3. ทำงานได้ดีร่วมกับ Next.js

Next.js รองรับการทำงานทั้งฝั่งเซิร์ฟเวอร์และไคลเอนต์ (Client-Side & Server-Side Rendering) ซึ่งสามารถนำ MongoDB มาใช้งานร่วมกันได้อย่างลงตัว ไม่ว่าจะเป็นการจัดการข้อมูลในฝั่งเซิร์ฟเวอร์โดยใช้ API Routes หรือการดึงข้อมูลแบบ Server-Side Rendering (SSR)

ขั้นตอนการติดตั้งและการเชื่อมต่อ MongoDB กับ Next.js

1. การติดตั้ง MongoDB และไลบรารีที่จำเป็น

ก่อนอื่น, คุณจะต้องติดตั้งไลบรารีที่จำเป็นในการเชื่อมต่อ MongoDB กับ Next.js ซึ่งเราจะแนะนำการใช้ Mongoose ซึ่งเป็น ORM (Object-Relational Mapping) ที่ทำให้การทำงานกับ MongoDB ง่ายขึ้น

การติดตั้ง Mongoose สามารถทำได้โดยใช้คำสั่ง:

npm install mongoose

หรือหากใช้ yarn:

yarn add mongoose

2. การตั้งค่าการเชื่อมต่อ MongoDB

จากนั้น, เราจะสร้างไฟล์สำหรับการเชื่อมต่อกับ MongoDB ในโปรเจกต์ของเรา ในตัวอย่างนี้, เราจะสร้างไฟล์ lib/mongodb.js เพื่อจัดการการเชื่อมต่อกับฐานข้อมูล

// lib/mongodb.js
import mongoose from 'mongoose';

const MONGO_URI = 'mongodb://localhost:27017/your_database_name';

if (!MONGO_URI) {
  throw new Error('Please define the MONGO_URI environment variable');
}

let cached = global.mongoose;

if (!cached) {
  cached = global.mongoose = { conn: null, promise: null };
}

async function connectToDatabase() {
  if (cached.conn) {
    return cached.conn;
  }

  if (!cached.promise) {
    cached.promise = mongoose.connect(MONGO_URI).then((mongoose) => {
      return mongoose;
    });
  }

  cached.conn = await cached.promise;
  return cached.conn;
}

export default connectToDatabase;

ในไฟล์นี้ เราจะเชื่อมต่อกับฐานข้อมูล MongoDB โดยใช้ URI ที่คุณได้ตั้งค่าไว้ใน .env หรือในโค้ด หากคุณใช้ MongoDB Atlas ก็สามารถใช้ URI ของ Atlas ได้เช่นกัน

3. การสร้าง Model ของ MongoDB

เมื่อเชื่อมต่อกับฐานข้อมูลแล้ว, คุณต้องสร้าง Model สำหรับการทำงานกับข้อมูลใน MongoDB โดยการใช้ Mongoose เพื่อให้สามารถใช้งานข้อมูลได้อย่างง่ายดาย

ตัวอย่างการสร้าง Model ของ MongoDB:

// models/User.js
import mongoose from 'mongoose';

const UserSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true },
});

export default mongoose.models.User || mongoose.model('User', UserSchema);

ในที่นี้ เราได้สร้าง User Schema ที่ใช้เก็บข้อมูลของผู้ใช้ เช่น name และ email โดยใช้ Mongoose ที่จะช่วยให้การจัดการข้อมูลใน MongoDB เป็นไปอย่างสะดวก

4. การใช้ MongoDB ใน API Routes ของ Next.js

ตอนนี้เราได้ตั้งค่าการเชื่อมต่อกับ MongoDB และสร้าง Model เรียบร้อยแล้ว, ขั้นตอนต่อไปคือการใช้งาน MongoDB ใน API Routes ของ Next.js เพื่อทำงานกับข้อมูล เช่น การดึงข้อมูลจาก MongoDB หรือการเพิ่มข้อมูลใหม่

ตัวอย่างการดึงข้อมูลจาก MongoDB ใน API Route:

// pages/api/users.js
import connectToDatabase from '../../lib/mongodb';
import User from '../../models/User';

export default async function handler(req, res) {
  await connectToDatabase();

  if (req.method === 'GET') {
    try {
      const users = await User.find();
      res.status(200).json(users);
    } catch (error) {
      res.status(500).json({ error: 'Unable to fetch users' });
    }
  }
}

ในตัวอย่างนี้, เราจะใช้ GET เพื่อดึงข้อมูลจาก MongoDB และส่งข้อมูลในรูปแบบ JSON ไปยังผู้ใช้งาน

5. การเพิ่มข้อมูลใน MongoDB ผ่าน API Route

การเพิ่มข้อมูลใน MongoDB ก็สามารถทำได้โดยใช้ POST ใน API Route ซึ่งสามารถรับข้อมูลจาก req.body และทำการบันทึกข้อมูลไปยังฐานข้อมูลได้

// pages/api/users.js
import connectToDatabase from '../../lib/mongodb';
import User from '../../models/User';

export default async function handler(req, res) {
  await connectToDatabase();

  if (req.method === 'POST') {
    const { name, email } = req.body;

    try {
      const newUser = new User({ name, email });
      await newUser.save();
      res.status(201).json(newUser);
    } catch (error) {
      res.status(500).json({ error: 'Unable to add user' });
    }
  }
}

ในตัวอย่างนี้, เราจะใช้ POST เพื่อรับข้อมูลจาก req.body และเพิ่มผู้ใช้ใหม่เข้าไปใน MongoDB

6. การใช้ MongoDB กับ Server-Side Rendering (SSR)

หนึ่งในคุณสมบัติที่ดีของ Next.js คือการรองรับ Server-Side Rendering (SSR) ซึ่งทำให้เราสามารถดึงข้อมูลจากฐานข้อมูลมาแสดงผลบนหน้าเว็บก่อนที่หน้านั้นจะโหลดเสร็จ

ตัวอย่างการใช้งาน MongoDB ใน getServerSideProps (SSR):

// pages/index.js
import connectToDatabase from '../lib/mongodb';
import User from '../models/User';

export async function getServerSideProps() {
  await connectToDatabase();

  const users = await User.find();

  return {
    props: { users: JSON.parse(JSON.stringify(users)) },
  };
}

export default function Home({ users }) {
  return (
    <div>
      <h1>User List</h1>
      <ul>
        {users.map((user, index) => (
          <li key={index}>{user.name} - {user.email}</li>
        ))}
      </ul>
    </div>
  );
}

ในตัวอย่างนี้, เราใช้ getServerSideProps เพื่อดึงข้อมูลจาก MongoDB และส่งข้อมูลไปยังหน้าเว็บเพื่อแสดงผลในครั้งแรกที่โหลดหน้า

สรุป

การใช้ MongoDB ร่วมกับ Next.js เป็นวิธีที่ยอดเยี่ยมในการสร้างเว็บแอปที่สามารถจัดการข้อมูลได้อย่างมีประสิทธิภาพ โดย MongoDB ให้ความยืดหยุ่นในการจัดเก็บข้อมูลแบบ NoSQL และ Next.js ให้เครื่องมือในการสร้างเว็บแอปที่เร็วและรองรับการเรนเดอร์แบบ Server-Side Rendering (SSR) การเชื่อมต่อ MongoDB กับ Next.js ไม่ได้ยากเกินไปและสามารถช่วยให้คุณสร้างเว็บแอปที่มีฟีเจอร์ครบถ้วนและมีประสิทธิภาพได้

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

การใช้ Firebase Firestore กับ Next.js

การพัฒนาแอปพลิเคชันที่มีฟีเจอร์แบบเรียลไทม์ หรือระบบที่มีฐานข้อมูลในแบบ cloud ไม่สามารถหลีกเลี่ยงการใช้บริการฐานข้อมูลที่ทันสมัยและรองรับการเชื่อมต่อที่รวดเร็วได้ หนึ่งในตัวเลือกที่ได้รับความนิยมมากคือ Firebase ซึ่งเป็นเครื่องมือของ Google ที่ช่วยให้การพัฒนาแอปพลิเคชันบนมือถือหรือเว็บแอปง่ายขึ้น รวมทั้งการใช้งาน Firestore ฐานข้อมูล NoSQL ที่ทำงานบน Cloud ที่สามารถให้บริการข้อมูลแบบเรียลไทม์ได้

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

Firebase Firestore คืออะไร?

Firebase Firestore เป็นฐานข้อมูล NoSQL ที่รองรับการจัดเก็บข้อมูลในรูปแบบเอกสาร (Document) และคอลเล็กชัน (Collection) ซึ่งข้อมูลใน Firestore สามารถจัดเก็บเป็นชุดของคีย์และค่าที่มีความยืดหยุ่นสูง พร้อมกับการรองรับฟีเจอร์หลายๆ อย่าง เช่น การซิงค์ข้อมูลแบบเรียลไทม์ การปรับขนาดระบบได้ดี การทำงานออฟไลน์ และการเชื่อมต่อกับบริการต่างๆ ของ Firebase

ทำไมต้องใช้ Firebase Firestore กับ Next.js?

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

การนำ Firebase Firestore มาใช้ร่วมกับ Next.js ช่วยให้เราสามารถพัฒนาแอปที่สามารถจัดเก็บและดึงข้อมูลจากฐานข้อมูลบน Cloud ได้อย่างสะดวก นอกจากนี้ยังช่วยให้สามารถใช้คุณสมบัติที่ดีของ Firestore เช่น การดึงข้อมูลแบบเรียลไทม์ ซึ่งเหมาะกับการสร้างแอปพลิเคชันที่ต้องการการอัปเดตข้อมูลทันที เช่น การแสดงผลของข้อมูลที่เปลี่ยนแปลงตลอดเวลา

ขั้นตอนการติดตั้งและใช้งาน Firebase Firestore กับ Next.js

1. การติดตั้ง Firebase ในโปรเจกต์ Next.js

เริ่มต้นจากการติดตั้ง Firebase SDK โดยใช้คำสั่ง npm หรือ yarn

npm install firebase

หรือ

yarn add firebase

จากนั้นให้สร้างไฟล์สำหรับการตั้งค่าการเชื่อมต่อกับ Firebase โดยปกติแล้วเราจะสร้างไฟล์ firebase.js ในโฟลเดอร์ lib หรือ utils เช่น:

// lib/firebase.js
import firebase from 'firebase/app';
import 'firebase/firestore';

const firebaseConfig = {
  apiKey: 'YOUR_API_KEY',
  authDomain: 'YOUR_AUTH_DOMAIN',
  projectId: 'YOUR_PROJECT_ID',
  storageBucket: 'YOUR_STORAGE_BUCKET',
  messagingSenderId: 'YOUR_MESSAGING_SENDER_ID',
  appId: 'YOUR_APP_ID'
};

if (!firebase.apps.length) {
  firebase.initializeApp(firebaseConfig);
} else {
  firebase.app(); // ถ้ามีการเชื่อมต่อ Firebase อยู่แล้วให้ใช้การเชื่อมต่อนั้น
}

const firestore = firebase.firestore();

export { firestore };

ในไฟล์นี้คุณจะต้องใส่ค่าคอนฟิก Firebase ที่ได้จาก Firebase Console ซึ่งประกอบด้วย apiKey, authDomain, projectId, และอื่นๆ

2. การเชื่อมต่อกับ Firestore และการดึงข้อมูล

เมื่อเชื่อมต่อกับ Firebase แล้ว เราสามารถดึงข้อมูลจาก Firestore มาใช้งานได้โดยการใช้คำสั่ง Firestore API

ตัวอย่างการดึงข้อมูลจาก Firestore ใน Next.js:

// pages/index.js
import { useEffect, useState } from 'react';
import { firestore } from '../lib/firebase';

const Home = () => {
  const [data, setData] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const snapshot = await firestore.collection('users').get();
      const usersList = snapshot.docs.map(doc => doc.data());
      setData(usersList);
    };

    fetchData();
  }, []);

  return (
    <div>
      <h1>User List</h1>
      <ul>
        {data.map((user, index) => (
          <li key={index}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
};

export default Home;

ในตัวอย่างนี้ เราดึงข้อมูลจาก Firestore ที่คอลเล็กชัน users และแสดงผลข้อมูลในเว็บเพจ

3. การอัปเดตข้อมูลใน Firestore

การอัปเดตข้อมูลใน Firestore สามารถทำได้ง่ายมากๆ เช่น การเพิ่มข้อมูลใหม่ หรือการอัปเดตข้อมูลที่มีอยู่แล้ว:

// การเพิ่มข้อมูล
const addUser = async () => {
  await firestore.collection('users').add({
    name: 'John Doe',
    email: 'john.doe@example.com'
  });
};

// การอัปเดตข้อมูล
const updateUser = async (userId) => {
  await firestore.collection('users').doc(userId).update({
    name: 'Jane Doe'
  });
};

4. การใช้งาน Firestore แบบ Real-Time

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

useEffect(() => {
  const unsubscribe = firestore.collection('users').onSnapshot(snapshot => {
    const usersList = snapshot.docs.map(doc => doc.data());
    setData(usersList);
  });

  // ทำความสะอาดการเชื่อมต่อเมื่อคอมโพเนนต์ถูก unmount
  return () => unsubscribe();
}, []);

5. การจัดการกับข้อมูลออฟไลน์

Firestore มีฟีเจอร์ที่สามารถทำงานออฟไลน์ได้ ซึ่งหมายความว่าผู้ใช้สามารถใช้งานแอปได้แม้จะไม่มีการเชื่อมต่ออินเทอร์เน็ต เมื่อมีการเชื่อมต่อใหม่ ข้อมูลจะถูกซิงค์อัตโนมัติ

สรุป

การใช้ Firebase Firestore กับ Next.js เป็นการผสมผสานที่ยอดเยี่ยมสำหรับการพัฒนาแอปที่มีความสามารถในการจัดการข้อมูลแบบเรียลไทม์ และรองรับการพัฒนาแอปที่มีประสิทธิภาพ ทั้งในแง่ของการจัดการข้อมูลและการแสดงผลบนหน้าเว็บ โดยที่ Firebase Firestore จะช่วยให้การพัฒนาแอปเป็นเรื่องง่ายขึ้น และ Next.js ก็สามารถเพิ่มความเร็วให้กับแอปได้

การทำงานร่วมกันระหว่าง Firebase และ Next.js จะช่วยให้คุณสามารถสร้างแอปพลิเคชันที่ทันสมัยและรองรับการทำงานที่หลากหลายได้อย่างมีประสิทธิภาพ

วันอาทิตย์ที่ 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 และสามารถตัดสินใจเลือกใช้งานตามความต้องการของคุณได้ดีขึ้นนะครับ!

Next.js คืออะไร และทำไมต้องใช้ Next.js

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

Next.js คืออะไร?

    Next.js เป็นเฟรมเวิร์กที่ถูกสร้างขึ้นมาบน React ซึ่งช่วยให้การพัฒนาเว็บแอปเป็นเรื่องง่ายขึ้น โดยเฉพาะในเรื่องของการทำงานฝั่งเซิร์ฟเวอร์ (Server-side Rendering) และการทำ SEO ซึ่งเป็นจุดที่ React ปกติทำได้ยาก

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

ทำไมต้องใช้ Next.js?

    1. โหลดเร็วกว่า ด้วย Server-side Rendering (SSR) และ Static Site Generation (SSG) ปกติแล้ว React ใช้วิธี Client-side Rendering (CSR) คือโหลดหน้าเว็บมาก่อน แล้วไปดึงข้อมูลจาก API มาเติมทีหลัง ทำให้บางครั้งหน้าเว็บโหลดมาแล้ว แต่ยังไม่มีข้อมูล ต้องรออีกแป๊บนึงถึงจะแสดงผลครบ ซึ่งไม่ดีต่อ SEO และ UX เลย

แต่ Next.js แก้ปัญหานี้ด้วย SSR และ SSG

  • SSR (Server-side Rendering): ดึงข้อมูลจากเซิร์ฟเวอร์ก่อน แล้วส่งหน้าเว็บที่มีข้อมูลพร้อมให้ผู้ใช้ทันที โหลดเร็วขึ้นเยอะ!
  • SSG (Static Site Generation): สร้างหน้าเว็บเป็นไฟล์ HTML ตั้งแต่ตอน Build แล้วโหลดแบบ Static ทำให้เว็บเร็วสุด ๆ แถมยังลดภาระเซิร์ฟเวอร์อีกด้วย

    2. SEO ดีขึ้น เพราะ Google อ่านเนื้อหาได้เลย หนึ่งในปัญหาใหญ่ของ React คือ Google Bot ไม่สามารถอ่านเนื้อหาบนเว็บที่ใช้ CSR ได้ดีนัก เพราะทุกอย่างโหลดผ่าน JavaScript แต่ถ้าใช้ Next.js ที่รองรับ SSR และ SSG ก็จะช่วยให้ Google มองเห็นเนื้อหาได้ง่ายขึ้น ส่งผลให้ SEO ของเราดีขึ้นแบบเห็นได้ชัด

    3. มีระบบ Routing อัตโนมัติ (File-based Routing) ปกติถ้าใช้ React อย่างเดียว เราต้องใช้ React Router มาจัดการเส้นทาง (Routes) เอง แต่ใน Next.js แค่สร้างไฟล์ในโฟลเดอร์ pages/ เช่น:

  • pages/index.js → /
  • pages/about.js → /about
  • pages/products/index.js → /products


แค่สร้างไฟล์ก็ได้ Routing อัตโนมัติ ไม่ต้อง config เองให้ยุ่งยาก

    4. API Routes - ทำ Backend ได้ในตัว Next.js ไม่ได้มีดีแค่ Frontend แต่ยังให้เราสร้าง API ได้เลยในโฟลเดอร์ pages/api/ เช่น:

  • pages/api/hello.js → GET /api/hello

    ซึ่งเราสามารถใช้ API นี้เชื่อมต่อกับฐานข้อมูล หรือใช้ร่วมกับ Frontend ได้ทันที ไม่ต้องไปเปิดเซิร์ฟเวอร์แยก

    5. รองรับ Image Optimization อัตโนมัติ Next.js มีฟีเจอร์ next/image ที่ช่วยให้เราจัดการภาพได้ง่ายขึ้น ไม่ต้องมานั่ง Optimize เอง เช่น การปรับขนาดอัตโนมัติ การแปลงเป็น WebP และการโหลดแบบ Lazy Loading เพื่อช่วยให้เว็บโหลดเร็วขึ้น

    6. รองรับการ Deploy ง่าย ๆ บน Vercel Next.js ถูกสร้างโดยทีมงานของ Vercel ซึ่งเป็นแพลตฟอร์มสำหรับ Deploy เว็บแบบ Serverless เราสามารถเชื่อม GitHub หรือ GitLab แล้วกด Deploy ได้ในไม่กี่คลิก แถมมีฟีเจอร์ CI/CD ให้ใช้งานด้วย

    7. รองรับการใช้งานกับ Tailwind CSS ได้อย่างง่ายดาย ถ้าใครชอบใช้ Tailwind CSS ก็สามารถติดตั้งกับ Next.js ได้ง่าย ๆ และใช้งานร่วมกันได้อย่างสมบูรณ์แบบ ทำให้การเขียน UI เร็วขึ้นมาก

Next.js เหมาะกับใคร?

    Next.js เหมาะกับนักพัฒนาเว็บที่ต้องการ พัฒนาเว็บให้เร็วขึ้น ทำ SEO ให้ดีขึ้น และลดความซับซ้อนของโปรเจกต์ ไม่ว่าจะเป็น

  • เว็บทั่วไปที่ต้องการ SEO เช่น บล็อก หรือเว็บข่าว
  • เว็บอีคอมเมิร์ซ ที่ต้องโหลดข้อมูลเร็วและรองรับ SEO
  • Dashboard หรือแอปพลิเคชันที่ใช้ข้อมูลเยอะ ๆ
  • SaaS หรือเว็บ Subscription ที่ต้องการประสิทธิภาพสูง
  • เว็บที่ต้องการ Full-stack API ในตัว ไม่ต้องเปิดเซิร์ฟเวอร์แยก


ข้อเสียของ Next.js ที่ควรรู้

    แน่นอนว่าไม่มีอะไรสมบูรณ์แบบ Next.js ก็มีข้อจำกัดบางอย่าง เช่น

  • เรียนรู้เพิ่มขึ้นจาก React ปกติ เพราะมี SSR, SSG, ISR ที่ต้องเข้าใจเพิ่ม
  • SSR อาจจะช้ากว่า CSR ถ้าต้องดึงข้อมูลเยอะมาก เพราะเซิร์ฟเวอร์ต้อง Generate หน้าใหม่ทุกครั้ง
  • Hosting อาจต้องใช้แพลตฟอร์มเฉพาะ เช่น Vercel หรือโฮสต์ที่รองรับ SSR ไม่ใช่ทุกที่รองรับได้ง่ายเหมือน React ปกติ


สรุป: Next.js ดีไหม? ควรใช้หรือเปล่า?

    ถ้าคุณใช้ React และต้องการเพิ่มประสิทธิภาพให้เว็บ โหลดเร็วขึ้น ทำ SEO ได้ดีขึ้น และมีฟีเจอร์ Backend ในตัว Next.js คือคำตอบ! โดยเฉพาะถ้าคุณพัฒนาเว็บที่เน้นความเร็วและต้องการให้ Google มองเห็นเนื้อหาแบบเต็ม ๆ

    แต่ถ้าโปรเจกต์ของคุณเป็น Single Page Application (SPA) ธรรมดาที่ไม่สน SEO หรือโหลดข้อมูลฝั่งไคลเอนต์เป็นหลัก การใช้ React ปกติอาจจะเหมาะกว่า

แต่ถ้าอยากลอง Next.js ก็ไม่ยาก! สามารถติดตั้งและเริ่มต้นใช้งานได้ง่าย ๆ แค่รันคำสั่งนี้:

npx create-next-app@latest my-next-app
cd my-next-app
npm run dev

แล้วเข้าไปที่ http://localhost:3000 แค่นี้ก็พร้อมใช้งาน Next.js แล้ว!

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

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

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