Next.js คืออะไร?
สำหรับการทำเว็บยุคใหม่ เรามักจะได้ยินคำว่า React และ Next.js ทั้งสองตัวนี้เกี่ยวข้องกันอย่างแนบแน่น แต่หน้าที่ต่างกัน
🎮 เทียบศัพท์ให้เข้าใจง่าย (สไตล์ Game Dev)
-
React = UI Library (เปรียบเหมือนระบบวาด UI)
เก่งเรื่องการสร้างชิ้นส่วนหน้าจอ (Component) หรือ Prefab เอาไว้ใช้ซ้ำ แต่ถ้าจะทำเว็บแบบมีหลายๆ หน้า หรือทำ SEO ให้ Google ค้นหาเจอ React เพียวๆ จะจัดการยาก -
Next.js = Framework (เปรียบเหมือน Game Engine)
เอา React มาเป็นแกนกลาง แล้วเพิ่มระบบจัดการจำเป็นต่างๆ มาให้ครบจบ เช่น ระบบเปลี่ยนหน้า, การเรนเดอร์ฝั่งเซิร์ฟเวอร์ (SSR)
Unity vs Web Development
มีพื้นฐานเขียนเกม (C#/Unity) มาก่อนถือว่า ได้เปรียบมาก! เพราะคุณเข้าใจเรื่อง Logic และ Object-Oriented อยู่แล้ว สิ่งที่ต้องทำตอนนี้มีแค่การ "ปรับวิธีคิด" (Mindset) เล็กน้อยเท่านั้น
1. จับคู่คำศัพท์ (Terminology Mapping)
| 🎮 ฝั่ง Unity (Game Dev) | 🌐 ฝั่ง Next.js (Web Dev) |
|---|---|
| Scene (ฉากต่างๆ ในเกม) | Page / Route (หน้าเว็บแต่ละ URL) |
| GameObject (วัตถุเปล่าๆ ในฉาก) | HTML Element / Tag (เช่น <div>, <img>) |
| Prefab (ก้อน Object ที่ตั้งค่าไว้ใช้ซ้ำ) | Component (ก้อน UI ที่เขียนแยกไว้ใช้ซ้ำ) |
| Material / Inspector (กำหนดสี ขนาด) | CSS / Tailwind (className="text-red-500") |
| C# Script (สั่งการทำงาน) | JavaScript / TypeScript |
| UI Canvas Hierarchy | DOM Tree (แท็ก HTML ซ้อนกัน) |
2. ความแตกต่างที่สำคัญที่สุด
Loop vs Event
ในเกม: โค้ดจะทำงานตลอดเวลาผ่าน Update() ทุกเฟรม
ในเว็บ: ไม่มี Update Loop เว็บจะทำงานเมื่อมี Event เท่านั้น
การวางตำแหน่ง UI
ในเกม: ลากวางตำแหน่งแบบอิสระ (Absolute Position) ปรับแกน X, Y
ในเว็บ: เรียงต่อกันแบบ Document Flow ใช้ Flexbox หรือ Grid ในการดันกล่อง
Core Concepts ที่ต้องรู้ก่อนลุย
1. Server vs Client Components
ใน Next.js ทุกหน้าคือ Server Component โดยค่าเริ่มต้น
- ถ้าต้องมีปุ่มคลิก (onClick), Animation → ต้องใช้ Client Component (ใส่ "use client"; ไว้บรรทัดแรก)
2. File-System Based Routing
สร้างโฟลเดอร์ = สร้าง URL ไม่ต้องเขียนโค้ดตั้งค่า Route แยกต่างหาก
การทำให้เว็บรองรับทุกอุปกรณ์ (Responsive Design)
ในสายพัฒนาเกม เราใช้ Canvas Scaler และ Anchors เพื่อให้ UI ย่อ-ขยายตามหน้าจอโทรศัพท์หรือคอมพิวเตอร์
สำหรับโลกของ Web Development เราใช้ระบบที่เรียกว่า Breakpoints (จุดตัดขนาดจอ) ของ Tailwind CSS ในการควบคุม Layout ครับ
1. Tailwind CSS Breakpoints ที่ต้องจำ
| คำนำหน้า (Prefix) | ขนาดหน้าจอขั้นต่ำ | ประเภทอุปกรณ์ |
|---|---|---|
| (ไม่มี prefix) | > 0px | สมาร์ตโฟนแนวตั้ง (Mobile-First) |
| sm: | ≥ 640px | สมาร์ตโฟนจอใหญ่ / แนวนอน |
| md: | ≥ 768px | แท็บเล็ต (iPad, Galaxy Tab) |
| lg: | ≥ 1024px | แล็ปท็อป / คอมพิวเตอร์ตั้งโต๊ะ |
| xl: | ≥ 1280px | จอคอมพิวเตอร์ขนาดใหญ่ (Widescreen) |
2. กฎทอง: คิดแบบ Mobile-First เสมอ
เขียนสไตล์สำหรับ จอมือถือเป็นพื้นฐานก่อน แล้วค่อยใช้ Prefix กำหนดการแสดงผลบนจอที่ใหญ่ขึ้น ตัวอย่างเช่น:
grid-cols-1: หน้าจอมือถือแสดง 1 คอลัมน์เดี่ยว การ์ดเรียงซ้อนลงมาmd:grid-cols-2: จอแท็บเล็ตขยายออกเป็น 2 คอลัมน์ซ้ายขวาlg:grid-cols-3: จอคอมพิวเตอร์ขยายออกเป็น 3 คอลัมน์เต็มพื้นที่
📱 3. Checklist ตรวจสอบเว็บก่อนส่งงาน (Responsive Testing)
ให้น้องเปิด Google Chrome แล้วกดปุ่ม F12 (DevTools) จากนั้นกดไอคอนรูปมือถือ/แท็บเล็ต เพื่อจำลองหน้าจอต่างๆ แล้วตรวจตาม 4 ข้อนี้:
- ✔ 1. ไม่เกิด Scroll แนวนอน: หน้าเว็บต้องเลื่อนได้เฉพาะบน-ลงล่างเท่านั้น ห้ามมีแถบเลื่อนซ้าย-ขวาหลุดออกมาในจอมือถือ
-
✔ 2. รูปภาพปรับขนาดอัตโนมัติ:
รูปภาพต้องใส่คลาสยืดหยุ่น เช่น
w-full h-48 sm:h-64 object-coverเพื่อไม่ให้บีบเบี้ยวหรือล้นกรอบ -
✔ 3. ขนาดตัวหนังสืออ่านง่ายทุกจอ:
ตัวหนังสือเนื้อหาในมือถือต้องไม่เล็กกว่า
text-sm(14px) และหัวข้อหลักไม่ตัดคำจนอ่านไม่รู้เรื่อง -
✔ 4. ปุ่มกดสัมผัสได้ง่าย (Touch Target):
ปุ่มบนจอมือถือต้องมีความสูงไม่น้อยกว่า 40-44px หรือใส่ padding เช่น
py-2.5 px-6ให้นิ้วกดได้พอดี
คลังคำศัพท์ & คีย์เวิร์ดสำคัญ
1. โครงสร้างพื้นฐาน
DOM (Document Object Model)
โครงสร้างต้นไม้ของหน้าเว็บ (คล้าย Hierarchy ใน Game Engine)
Tag / Element
ชิ้นส่วน UI เช่น <div>, <h1>, <img>
2. คำสั่ง JavaScript พื้นฐานที่ใช้บ่อย
// วนลูปสร้าง UI จาก Array
array.map((item) => <div key={item.id}>{item.name}</div>)
การติดตั้ง & รันโปรเจกต์
⚙️ สิ่งที่ต้องมีในเครื่อง (Prerequisites)
- Node.js (LTS Version): โหลดจาก nodejs.org
- VS Code Extensions:
Tailwind CSS IntelliSense
1. คำสั่งสร้างโปรเจกต์
npx create-next-app@latest fleur-dor
2. รันคำสั่งทดสอบ
cd fleur-dor npm run dev
เปิดเบราว์เซอร์ไปที่ http://localhost:3000
โครงสร้างไฟล์ฉบับเต็ม (App Router)
📂 ไฟล์สำคัญ
🛡️ ซ่อนไฟล์ความลับ (.gitignore)
node_modules/ .next/ .env*
🎯 โจทย์การพัฒนา (Project Brief)
🎨 ดูสไตล์เว็บอ้างอิง (LIHT Organics) ↗"พัฒนาเว็บไซต์เกี่ยวกับผลิตภัณฑ์ผสมสารสกัดจากบัวตองของแม่ฮ่องสอน โดยให้มีเนื้อหาเกี่ยวกับประวัติความเป็นมา พื้นที่ที่พบหรือปลูก คุณสมบัติของบัวตอง งานวิจัยที่เกี่ยวข้องกับ ผลิตภัณฑ์จากบัวตองที่มีอยู่ในปัจจุบัน พร้อมมีภาพประกอบในแต่ละหัวข้อ ชื่อเว็บ fleur d'or"[cite: 3]
Workshop: หน้าปก & ประวัติ
export default function Home() { return ( <main className="bg-[#faf8f5] text-stone-800 min-h-screen"> {/* หน้าปก Responsive Hero Banner */} <section className="relative min-h-[50vh] sm:min-h-[60vh] md:min-h-[70vh] flex items-center justify-center bg-black px-4 py-16"> <img src="https://images.unsplash.com/photo-1605235889708-3232bb82a7a9?q=80&w=2000" className="absolute inset-0 w-full h-full object-cover opacity-60" /> <div className="relative z-10 text-center text-white max-w-4xl mx-auto"> <h1 className="text-4xl sm:text-6xl md:text-7xl font-bold mb-4 drop-shadow-lg tracking-wider font-serif">fleur d'or</h1> <p className="text-base sm:text-xl md:text-2xl font-light leading-relaxed px-2"> มนต์เสน่ห์สีทองแห่งขุนเขา: รากเหง้าประวัติศาสตร์ นวัตกรรมคุณค่า และความงามจาก "ดอกบัวตอง" แม่ฮ่องสอน </p> </div> </section> {/* ประวัติความเป็นมา */} <section className="max-w-5xl mx-auto py-12 sm:py-16 md:py-24 px-4 sm:px-6 md:px-8 text-center"> <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-[#8a6b32] mb-6 tracking-wide font-serif">ประวัติความเป็นมา</h2> <p className="text-sm sm:text-base md:text-lg text-stone-600 leading-relaxed mb-4 max-w-3xl mx-auto"> เบื้องหลังความงามของดอกบัวตอง (Mexican Sunflower) มีจุดเริ่มต้นจากมิชชันนารีชาวเม็กซิกัน ที่เดินทางมาเผยแผ่ศาสนาและให้ความช่วยเหลือชุมชนบนภูเขาสูงในจังหวัดแม่ฮ่องสอน </p> <p className="text-sm sm:text-base md:text-lg text-stone-600 leading-relaxed max-w-3xl mx-auto"> ด้วยความคิดถึงบ้านเกิด จึงนำเมล็ดพันธุ์มาปลูกไว้ จนกาลเวลาผ่านไป เมล็ดได้กระจายไปทั่วผืนป่า กลายเป็นความงดงามที่หาชมไม่ได้จากจังหวัดอื่น และถูกยกให้เป็น "ดอกไม้ประจำจังหวัดแม่ฮ่องสอน" </p> </section> </main> ); }
fleur d'or
มนต์เสน่ห์สีทองแห่งขุนเขา: รากเหง้าประวัติศาสตร์ นวัตกรรมคุณค่า และความงามจาก "ดอกบัวตอง" แม่ฮ่องสอน[cite: 3]
ประวัติความเป็นมา
เบื้องหลังความงามของดอกบัวตอง มีจุดเริ่มต้นจากมิชชันนารีชาวเม็กซิกันที่เดินทางมาปฏิบัติภารกิจบนภูเขาสูงในจังหวัดแม่ฮ่องสอน[cite: 3]
ด้วยความคิดถึงบ้านเกิดจึงนำเมล็ดพันธุ์มาปลูกไว้ จนกระทั่งขยายพันธุ์งดงามทั่วผืนป่า และกลายเป็น "ดอกไม้ประจำจังหวัดแม่ฮ่องสอน"[cite: 3]
Workshop: พื้นที่ปลูก (Responsive Grid)
<section className="max-w-5xl mx-auto py-10 sm:py-16 px-4 sm:px-6 md:px-8">
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-12 items-center">
<div className="w-full overflow-hidden rounded-2xl shadow-lg">
<img src="https://images.unsplash.com/photo-1632551571216-92cba7234661?q=80&w=800"
className="w-full h-64 sm:h-80 md:h-96 object-cover hover:scale-105 transition duration-500" />
</div>
<div className="text-left">
<h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-[#8a6b32] mb-4 font-serif">พื้นที่พบและการจัดการ</h2>
<p className="text-sm sm:text-base md:text-lg text-stone-600 leading-relaxed mb-4">
ทุ่งดอกบัวตองจะบานสะพรั่งสุดลูกหูลูกตาในช่วงเดือน พฤศจิกายนถึงธันวาคม ของทุกปี
ดึงดูดนักท่องเที่ยวและสร้างรายได้สู่จังหวัดแม่ฮ่องสอน
</p>
<p className="text-sm sm:text-base md:text-lg text-stone-600 leading-relaxed">
อย่างไรก็ตาม ในเชิงนิเวศวิทยา บัวตองถือเป็น พืชต่างถิ่นรุกราน (Alien Invasive Species)
ที่เพิ่มความเสี่ยงไฟป่า เราจึงนำแนวคิดการตัดแต่งควบคุมมาเปลี่ยนวัชพืชให้เป็นสารสกัดทรงคุณค่า
</p>
</div>
</div>
</section>
พื้นที่พบและการจัดการ
ทุ่งดอกบัวตองจะบานสะพรั่งในช่วงเดือน พฤศจิกายนถึงธันวาคม ของทุกปี ดึงดูดนักท่องเที่ยวและขับเคลื่อนเศรษฐกิจชุมชน[cite: 3]
ในเชิงนิเวศวิทยา บัวตองถือเป็น พืชต่างถิ่นรุกราน ที่เสี่ยงต่อการเกิดไฟป่า เราจึงนำแนวคิดการควบคุมตัดแต่งมาแปรรูปเป็นผลิตภัณฑ์บำรุงผิว[cite: 3]
Workshop: คุณสมบัติ & งานวิจัย
<section className="bg-white py-12 sm:py-16 md:py-20">
<div className="max-w-5xl mx-auto px-4 sm:px-6 md:px-8">
<h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-[#8a6b32] text-center mb-8 sm:mb-12 font-serif">คุณสมบัติและงานวิจัย</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 sm:gap-8">
<div className="bg-[#faf8f5] p-6 sm:p-8 rounded-2xl border border-stone-200 shadow-sm">
<h3 className="text-xl sm:text-2xl font-bold text-[#8a6b32] mb-3 sm:mb-4">🌿 นวัตกรรมสารสกัด</h3>
<p className="text-stone-600 text-sm sm:text-base mb-3 leading-relaxed">จากการควบคุมวัชพืชสู่สารสกัดทรงคุณค่า พบว่าอุดมไปด้วยสารออกฤทธิ์สำคัญ ได้แก่:</p>
<ul className="list-disc pl-5 text-stone-700 space-y-1 sm:space-y-2 text-sm sm:text-base font-medium">
<li>Sesquiterpene Lactones</li>
<li>Flavonoids</li>
<li>Phenolics</li>
</ul>
</div>
<div className="bg-[#faf8f5] p-6 sm:p-8 rounded-2xl border border-stone-200 shadow-sm">
<h3 className="text-xl sm:text-2xl font-bold text-[#8a6b32] mb-3 sm:mb-4">🔬 งานวิจัยรองรับ</h3>
<p className="text-stone-600 text-sm sm:text-base leading-relaxed">
การวิจัยระบุชัดเจนว่าสารสกัดจากดอกบัวตองมีฤทธิ์เด่นในการ ต้านอนุมูลอิสระ ต้านการอักเสบ และต้านเชื้อแบคทีเรีย
ซึ่งมีประสิทธิภาพไม่ด้อยไปกว่าพืชสมุนไพรยอดนิยมที่ใช้ในเวชสำอางทั่วไป เช่น ใบบัวบก
</p>
</div>
</div>
</div>
</section>
คุณสมบัติและงานวิจัย
🌿 นวัตกรรมสารสกัด
อุดมไปด้วยสารออกฤทธิ์ทางชีวภาพสำคัญ:[cite: 3]
- Sesquiterpene Lactones[cite: 3]
- Flavonoids[cite: 3]
- Phenolics[cite: 3]
🔬 งานวิจัยรองรับ
มีฤทธิ์เด่นในการ ต้านอนุมูลอิสระ ต้านการอักเสบ และต้านเชื้อแบคทีเรีย มีประสิทธิภาพในการดูแลผิวพรรณเทียบเคียงสมุนไพรเวชสำอางชั้นนำ[cite: 3]
Workshop: การ์ดผลิตภัณฑ์ (Fluid Grid)
export default function Home() { const products = [ { id: 1, name: "fleur d'or Bua Tong Serum", desc: "เซรั่มบำรุงผิวที่อุดมไปด้วย Flavonoids มีฤทธิ์ต้านการอักเสบ ดูแลผิวพรรณอย่างอ่อนโยนและปลอดภัย", img: "https://images.unsplash.com/photo-1620916566398-39f1143ab7be?q=80&w=400" }, { id: 2, name: "fleur d'or Anti-oxidant Cream", desc: "ครีมบำรุงพร้อมสารต้านอนุมูลอิสระจากดอกบัวตอง ป้องกันแบคทีเรียและช่วยสร้างอาชีพให้ชุมชนแม่ฮ่องสอน", img: "https://images.unsplash.com/photo-1608248593842-8d76db9ee606?q=80&w=400" } ]; return ( <!-- ... โค้ด section อื่นๆ ... --> <section className="max-w-6xl mx-auto py-12 sm:py-16 md:py-24 px-4 sm:px-6 md:px-8"> <h2 className="text-2xl sm:text-3xl md:text-4xl font-bold text-[#8a6b32] text-center mb-8 sm:mb-12 font-serif">ผลิตภัณฑ์ของเรา</h2> <div className="grid grid-cols-1 sm:grid-cols-2 gap-6 sm:gap-8 max-w-3xl mx-auto"> {products.map((item) => ( <div key={item.id} className="bg-white rounded-2xl shadow-sm border border-stone-200 overflow-hidden hover:shadow-md transition flex flex-col"> <img src={item.img} className="w-full h-48 sm:h-64 object-cover" /> <div className="p-5 sm:p-6 flex-1 flex flex-col justify-between"> <div> <h3 className="font-bold text-lg sm:text-xl text-stone-800 font-serif">{item.name}</h3> <p className="text-stone-600 mt-2 leading-relaxed text-xs sm:text-sm">{item.desc}</p> </div> <button className="mt-4 w-full py-2.5 rounded-full border border-[#8a6b32] text-[#8a6b32] text-xs sm:text-sm uppercase tracking-wider hover:bg-[#8a6b32] hover:text-white transition"> ดูรายละเอียด </button> </div> </div> ))} </div> </section> /* ... </main> */
ผลิตภัณฑ์ของเรา
fleur d'or Bua Tong Serum
เซรั่มบำรุงผิวที่อุดมไปด้วย Flavonoids มีฤทธิ์ต้านการอักเสบ ดูแลผิวพรรณอย่างอ่อนโยน[cite: 3]
fleur d'or Anti-oxidant Cream
ครีมบำรุงพร้อมสารต้านอนุมูลอิสระจากดอกบัวตอง ป้องกันแบคทีเรีย[cite: 3]
Workshop: แยกชิ้นส่วน (Components)
สร้างไฟล์ Component ย่อยในโฟลเดอร์ src/components/ เช่น Banner.jsx เพื่อให้โค้ดหน้าหลักกระชับและรองรับ Responsive ในระดับ Component[cite: 4]
1. ตัวอย่างไฟล์ Banner.jsx
export default function Banner() { return ( <section className="relative min-h-[50vh] sm:min-h-[60vh] md:min-h-[70vh] flex items-center justify-center bg-black px-4 py-16"> <img src="https://images.unsplash.com/photo-1605235889708-3232bb82a7a9?q=80&w=2000" className="absolute inset-0 w-full h-full object-cover opacity-60" /> <div className="relative z-10 text-center text-white max-w-4xl mx-auto"> <h1 className="text-4xl sm:text-6xl md:text-7xl font-bold mb-4 drop-shadow-lg tracking-wider font-serif">fleur d'or</h1> <p className="text-base sm:text-xl md:text-2xl font-light leading-relaxed"> มนต์เสน่ห์สีทองแห่งขุนเขา: รากเหง้าประวัติศาสตร์ นวัตกรรมคุณค่า และความงามจาก "ดอกบัวตอง" แม่ฮ่องสอน </p> </div> </section> ); }
🔥 ภารกิจท้าทาย (Final Challenge)
📄 เปิดดูไฟล์ข้อมูลรายละเอียดเว็บ (PDF)
ให้น้องนำเนื้อหาทั้งหมดจากไฟล์ PDF ด้านบน มาสร้างเป็น Component แยกกัน เช่น History.jsx, Location.jsx, Research.jsx และ Products.jsx ในโฟลเดอร์ src/components/
เกณฑ์สำคัญ: ทุก Component ต้องใส่คลาสรองรับ Responsive (`sm:`, `md:`, `lg:`) ให้แสดงผลสวยงามทั้งบนมือถือและคอมพิวเตอร์!