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