ทำเว็บ Blog ด้วย Next.js และ Strapi
/ 5 min read
สามารถดู video ของหัวข้อนี้ก่อนได้ ดู video
** เนื่องจากบทความนี้มีลักษณะเป็น hand-ons ค่อนข้างมาก จะไม่ได้ลง detail ไว้ในบทความ (บทความจะเป็นเหมือนสารบัญร่วมกันกับคลิปที่ทำ) หากท่านใดที่แวะเวียนเข้ามา สามารถดูได้ผ่าน Video นะครับ
Strapi คืออะไร ?
Ref: https://strapi.io/
Strapi คือ open-source project ที่ใช้สำหรับทำ CMS แบบ Headless โดยเป็นตัวช่วยอำนวยความสะดวกในการทำ API และทำหน้า CMS สำหรับจัดการ API ให้แบบอัตโนมัติ
ทีนี้ก่อนจะไปต่อ เราต้องเข้าใจก่อนว่า “Headless CMS” เนี่ยมันคืออะไร
CMS คือ software application ที่ใช้สำหรับจัดการ digital content ซึ่งปกติก็ใช้สำหรับจัดการเว็บที่เกี่ยวข้องกับการแสดงเนื้อหาเช่น
- Landing Page
- Blog
ทีนี้ โดยปกติ Technology ใช้ทำ CMS นั้นมันก็มี software บางประเภทที่ได้เตรียม feature สำหรับจัดการ CMS ให้อยู่แล้ว ซึ่งปกติเราจะแบ่งเป็น 3 หมวดใหญ่ๆคือ
- Traditional CMS = ทั้งส่วนแสดง Content และ ส่วนจัดการ content อย่าง CMS จะรวมกันอยู่ใน application เดียวกัน
- หมายความว่า ทั้ง Backend (ที่จัดการสร้าง / แก้ไข content) และ Frontend (ที่แสดงผล content) รวมอยู่ใน service เดียวกัน
- CMS ที่มีไอเดียนี้เช่น Wordpress, Joomla
- Headless CMS = มีแค่ส่วน CMS และ API มาให้ ที่เหลือฝั่ง Frontend ต้องไปจัดการเอง (จึงเรียกสิ่งนี้ว่า Headless)
- จึงทำให้มีความยืนหยุ่นสูงตอนทำ Frontend สำหรับการแสดงผล
- API อาจจะเตรียมมาให้ในรูปแบบของ Rest API หรือ GraphQL
- CMS ที่มีไอเดียนี้เช่น Strapi, Sanity, Wordpress Headless (*)
Ref: https://www.contentstack.com/cms-guides/headless-cms-vs-traditional-cms
เราสามารถใช้งานร่วมกับ Frontend ได้ยังไง ?
ดังนั้นเมื่อ Strapi เป็น Headless CMS เท่ากับว่า
- Content Management ทั้งหมดจัดการบน Strapi (แยกเว็บออกมาจัดการต่างหาก)
- และหากต้องการ Content จาก Strapi ไปใช้ จะสื่อสารผ่าน API ที่เป็น protocal กลางแทน
- ทำให้ทั้ง 2 Service แยกออกจากกัน = ไม่ขึ้นตรงต่อกัน ต่างคนต่างทำไป จะทำให้ไม่กระทบต่อกัน เวลามีการแก้ไขได้ (ยกเว้นแต่มีการแก้ไขส่วนของ API)
Overview feature ของ Strapi
Ref: https://docs.strapi.io/dev-docs/quick-start
มา Start project strapi + เล่นไปพร้อมๆกัน
- เลือกเป็น quickstart = ใช้ SQLite database ซึ่งเป็น database ที่เก็บเป็น file (อำนวยความสะดวกทำให้ไม่ต้อง setup database เพิ่ม)
- เมื่อ command run เสร็จลงตาม step ให้เรียบร้อย (มันจะพาสร้าง admin คนแรก)
- สร้างเสร็จจะเจอหน้าตาประมาณนี้ออกมา
เล่น 3 แบบคือ
- แบบ Schema (Content แบบมี Schema ควบคุม)
- Single Component (เช่น landing page)
- ควบคุมการแสดงผลออกมาทั้งแบบ Authentication และไม่ Authentication
- ความเจ๋งของ Strapi ก็คือ เราจะสามารถได้ API และ Service ออกมาจากการจัดการผ่าน UI ได้เลย ! = เราไม่ต้อง code สำหรับส่วนของ API เลย
เราจะทำอะไรกันบ้าง
แบ่งทำเป็น 2 path ครับ
Strapi = CMS
- สร้าง 2 collections มาคือ
- Blog = ให้คนทั่วไปใช้
- Special Blog = เฉพาะคน Login ใช้ได้
- สร้าง 1 collection สำหรับการใช้งานเพื่อ generate landing page
Next.js (แต่ง style เร็วๆด้วย daisyUI)
- ดึงข้อมูล Blog มาแสดง
- ทำ Login เพื่อทำการเช็ค Account กับ Strapi
- ทำ Middleware เช็คว่า ต้อง Login เรียบร้อย ถึงจะดู Special Blog ได้
Deploy Strapi + Next.js ขึ้น Heroku + Vercel กัน (ให้เห็นภาพการนำไปใช้งานจริง)
** Require 1 อย่างก่อน follow ตาม = ควรดูหัวข้อ Next.js มาก่อน
เริ่มต้นทำจาก Strapi
Ref: https://docs.strapi.io/user-docs/intro
โจทย์
- สร้าง 2 collections มาคือ
- Blog = ให้คนทั่วไปใช้
- Special Blog = เฉพาะคน Login ใช้ได้
- สร้าง 1 collection สำหรับการใช้งานเพื่อ generate landing page
(อ่านตาม user guide หรือดูตามคลิปได้เลย)
Recheck Rest API
- Login
- Register
- Get Me
- Get thumbnail
ต่อเข้ากับ nextjs
ที่ฝั่งของ Next.js นั้น
- เนื่องจากเป็นการต่อ API แบบ Server-side อยู่แล้ว (จากหลักการของ Server component) = ไม่ต้องเปิด CORS อะไรออกมา
- สามารถคุย API ผ่าน fetch หรือ axios ของ Server Component ได้เลย
Structure ของ next
เพื่อให้ project ลดจำนวน code ของการต่อ API = จะขอใช้ axios สำหรับการดึง API ออกมา
และทำการเพิ่ม .env.local
ไว้สำหรับการเรียกผ่าน path ของ STRAPI โดยกำหนด .env.local
เป็น
code หน้าหลัก
ที่ page.js
code ส่วน blog
ที่ blog/[id]/page.js
code ส่วน login
- ที่
login/page.js
- ที่
login/action.js
code ส่วน middleware และ special blog
ที่ middleware.js
- ต้องมี token ก่อน
- และ token ต้องสามารถดึงข้อมูลจาก
api/users/me
ถึงจะอนุญาตให้เข้าไปได้ - ท้ายสุด เอาข้อมูล user แนบไปกับ header
ที่ special-blogs/pages.js
- มีการใช้ token เพิ่มเพื่อดึงข้อมูล
และทั้งหมดก็จะได้ผลลัพธ์ตามที่เราต้องการออกมาได้
Deploy จริง
- strapi ใช้ heroku (เพราะ deploy ง่ายสุด)
- Ref: https://docs.strapi.io/dev-docs/deployment/heroku
- Package Postgres: https://elements.heroku.com/addons/heroku-postgresql
- Next.js ใช้ vercel
- deploy เหมือนหัวข้อของ Nuxt
- ปรับ ENV ของ url สำหรับการต่อให้ถูกต้อง
Reference
- มาเรียนรู้พื้นฐาน Functional Programming กันมี Video
มาเรียนรู้พื้นฐาน Functional Programming กันว่ามันคืออะไร
- มาลองเล่น LIFF และ Messaging API กันมี Video มี Github
พามาทำความรู้จักกับ LIFF (LINE Frontend Framework) กันว่ามันคืออะไร เราสามารถพัฒนา Web app ลงบน LINE ได้อย่างไร
- Astro และ Static site generatorมี Video
มารู้จักกับ Astro Framework สำหรับทำเว็บ Static สำหรับเว็บทำ Content โดยเฉพาะกัน
- รู้จักกับ Next.js 14 แบบ Quick Overviewมี Video มี Github
พาทัวร์ feature ต่างๆของ Next.js กันแบบรวดเร็วกัน ดูทุก feature ของ Next กัน