Nuxt.js Fundamental ตอนที่ 4 - Nuxt.js Concept
เนื้อหาของบทเรียน Nuxt.js
- ตอนที่ 1 - Getting Started with Nuxt.js
- ตอนที่ 2 - สร้าง Nuxt.js ด้วย create-nuxt-app
- ตอนที่ 3 - การกำหนด Routing
- ตอนที่ 4 - Nuxt.js Concept
- ตอนที่ 5 - Nuxt Content และ Async Data
- ตอนที่ 6 - การดึงข้อมูลจาก APIs
- ตอนที่ 7 - การใช้งานร่วมกับ Vuex Store
- ตอนที่ 8 - ทำระบบ Authentication ด้วย Nuxt.js
- ตอนที่ 9 - การ Deploy Nuxt.js
- ตอนที่ 10 - การทำ Internal API และ Middleware
- ตอนที่ 11 - ทำ SEO และ Meta tags
- ตอนที่ 12 - Workshop
สำหรับหัวข้อนี้จะเป็นเรื่องของทฤษฎี อาจจะอ่านแล้วเข้าใจยากซักหน่อย แต่เชื่อเถอะว่าเนื้อหาส่วนนี้ค่อนข้างสำคัญครับ และมีประโยชน์มาก หากเราเข้าใจ Concept เข้าใจการทำงานของมัน เราก็สามารถประยุกต์และใช้งานได้ครับ ในหัวข้อนี้ จะมี
- View คืออะไร?
- Modules คืออะไร?
- Nuxt Context ใช้ยังไง?
- Nuxt Life Cycle ทำงานยังไงบ้าง
เริ่มกันเลยครับ
Views
ในทีนี้คือหมายถึงตัว View หรือ UI เช่น Layout, Template หรือหน้า Page ซึ่งเราสามารถที่จะ customize เพิ่มเติม หรือกำหนดพวก SEO Meta Tag ได้ด้วย
Reference: Nuxt.js Views
ถ้าดูจากภาพด้านบน จะเห็นว่ามีส่วน
- Layout ที่จะหมายถึง Component, Head, Middleware ที่ให้เรากำหนดรูปแบบ layout template ได้ เช่น layout แบบมี sidebar, layout แบบ full-width, layout แบบ admin เป็นต้น
- ส่วน Page ก็จะมี ส่วนย่อยๆ เต็มเลย เช่น
asyncData
,fetch
,head
,middleware
,transition
,validate
เป็นต้น
Layout
เราสามารถกำหนด default layout ได้ เช่นสร้างไฟล์ default.vue
ใน folder layouts
ซึ่งทุกๆ Page (ไฟล์อยู่ใน folder pages
) ก็จะใช้ default layout ถ้าเราไม่ได้กำหนด layout ให้มัน แต่ถ้าเราอยากกำหนด layout นอกเหนือจาก default ละ ทำยังไง?
ก็แค่สร้างไฟล์ มาอีกไฟล์เช่น dashboard.vue
ไว้ใน layouts
ทีนี้ในหน้า pages
ที่เราสร้าง เราก็แค่กำหนด layout
แบบนี้ เช่น สร้างไฟล์ pages/dashboard.vue
- เราสังเกตว่า เอะเราใช้
layout
ในexport default {}
ได้ แสดงว่า ตัวอื่นในรูปบน ก็ใช้ได้นี้นา?
ตัวอย่าง เช่น เราใช้ head
แบบนี้ครับ เพื่อกำหนด HTML Meta tag
ตัวอย่าง อื่นๆ เช่น middleware
, validate
, asyncData
ก็ได้ดังนี้ (เดี๋ยวจะพูดถึงรายละเอียดอีกทีครับ อันนี้แค่ overview)
ตัวอย่าง
validate
ลองย้อนกลับไปดูเรื่อง Routing ได้ครับ เป็นการเช็คว่าหน้าที่เรา navigate มามันถูกหรือไม่ ส่วนการกำหนดhead
นอกจากการกำหนด แต่ละ Page แล้ว เราก็สามารถกำหนด แบบ global ที่ไฟล์nuxt.config.js
ได้ด้วย
Context
Context เป็นก้อน Data ใน Nuxt.js ที่เราสามารถเรียกใช้งานผ่าน Nuxt Life Cycle hook ต่างๆ เช่น ใน asyncData
ดึงข้อมูล Vuex Store, เข้าถึง req
, res
, query
ต่างๆ เข้าถึง nuxtState
เต็มไปหมดเลย
ตัวอย่างด้านล่าง คือ context
มีอะไรอยู่ข้างในบ้าง และบางตัวแปร ก็เข้าถึงได้เฉพาะ server
หรือ client
เป็นต้น
สามารถอ่านรายละเอียด หรือดูรูปภาพจาก Nuxt Context & Helpers เพิ่มเติมครับ เพื่อให้เห็นภาพ
Modules
ใน Nuxt.js ตัว modules เปรียบเสมือน Extensions นั่นเอง ที่ช่วยให้เราสามารถเพิ่ม feature หรือส่วนเสริม และหากมองแล้ว จริงๆ Modules ก็เป็นเพียงแค่ function นั่นเอง ตัวอย่าง modules เช่น
@nuxt/content
- เป็น Module ที่ทำให้เราสามารถอ่านไฟล์ JSON, CSV, Markdown, YAML จาก foldercontent
ได้@nuxt/axios
- เป็น Module ที่ Nuxt เอา axios library ที่ไว้ fetch HTTP ยอดนิยม มาใช้ได้เลย@nuxt/auth
- เป็น Module ที่จัดการเรื่อง Authentication กำหนด schema และ strategy ได้เลย
และหากเราต้องการใช้ module ก็แค่ไปเพิ่มในไฟล์ nuxt.config.js
คล้ายๆแบบนี้ครับ
นอกจาก Modules ด้านบนที่กล่าวมา เรายังสามารถสร้าง Module ขึ้นมาใช้เองได้ด้วยนะ เช่น สร้างไฟล์ขึ้นมาใหม่ชื่อ simple.js
ไว้ใน folder modules
เหมือนกับ Module ของ Nuxt หากเราเขียน Module ขึ้นเอง เราก็ต้องไปกำหนดในไฟล์ nuxt.config.js
เหมือนกันครับ แบบนี้
Nuxt Life Cycle
Life Cycle ของ Nuxt.js จะแบ่งออกเป็น 2 ส่วนคือ Server และ Client และก็แบ่งย่อยตามเหตุการณ์ได้อีก 2 คือ ตอน build time
และ ตอนเปลี่ยนหน้าเวลา User click link (ด้วย NuxtLink
)
Server
- แบบ SSR จะใช้คำสั่ง
nuxt start
จะ execute ทุกๆครั้ง ที่มีการ request ไปที่ Server - ถ้าโหมด SSG
nuxt generate
จะ execute ครั้งเดียว ตอน build แต่ทุกๆเพจที่ถูก generate เช่นเว็บมี 5 หน้า ก็จะรัน 5 ครั้ง ตอน build
Reference : Nuxt Life Cycle
Hints & Questions?
- เพื่อนๆ ลองเล่นพวก
middleware
,plugins
,validate
หรือasyncData
,head
ดูนะครับ ว่าทำอะไรเพิ่มได้บ้าง (บางเนื้อหา มีในหัวข้อถัดไป) - ลองเรียกใช้งาน
context
ในแต่ละบริบท เช่นผ่านasyncData
หรือผ่านmiddleware
หรือผ่านnuxtState
มันทำได้เหมือนกันมั้ย? - พยายามทำความเข้าใจ Life Cycle ตัวอย่างรูปภาพ จาก Nuxt Docs นั้น อ่านเข้าใจ และมีประโยชน์มาก (ควรเซฟเก็บไว้ดุเลย) เพราะเวลา development ยังไงก็ต้องดูเป็น reference แน่นอน :)
อ่านบทถัดไป 👉 ตอนที่ 5 - Nuxt Content และ Async Data
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust