เลือกใช้ Gatsby เพราะจะได้เอาเวลามาพัฒนาเว็บ ไม่ใช่มานั่งเซ็ตอัพ webpack, Babel, React Router, ฯลฯ
ด้วยว่าเรามีเวลาทำเว็บ ELECT Live! กันแค่ 8 วัน (อย่างกับทำเว็บ Prototype) แต่เนื่องจากไหนๆ ไม่ได้เลือกตั้งมา 8 ปีแล้ว โปรเจกต์แบบนี้นานๆ ที ก็เลยอยากจัดเต็ม และทำให้เป็นเว็บแบบ Production-grade ไปเลย
หนึ่งใน Goal ส่วนตัวของผมคือผมอยากทำให้เว็บนี้โหลดเร็วที่สุดในบรรดาเว็บแสดงผลการเลือกตั้ง ซึ่งจะทำแบบนี้ การมานั่ง Optimize มือ ก็อาจจะไม่ทันเวลาที่ค่อนข้างน้อย
การจะทำเว็บด้วย React ให้โหลดเร็วและพัฒนาสะดวก ต้องคำนึงถึงหลายๆ ปัจจัย:
- เซ็ตอัพ Build tooling ให้มี Development server เพื่อการพัฒนาและทดสอบอย่างรวดเร็ว
- Minification ย่อขนาดโค้ดเพื่อให้โค้ดที่ผู้ใช้ต้องโหลดมีขนาดเล็กๆ
- Caching การตั้งชื่อไฟล์ แล้วตั้งค่า HTTP Header เพื่อให้สามารถ cache โค้ดและข้อมูลได้อย่างมีประสิทธิภาพสูงสุด
- Code splitting แยกโค้ดของแต่ละส่วนออกเป็นไฟล์ย่อยๆ ตอนที่ผู้ใช้เข้ามา จะได้โหลดแค่โค้ดเท่าที่ต้องใช้ ไม่ต้องรอให้โค้ด JavaScript ทั้งหมดโหลดเสร็จก่อนถึงใช้งานได้
- Critical CSS inlining ยัดโค้ด CSS ที่ถูกใช้ในหน้าเว็บไว้ในไฟล์ .html ไปเลย จะได้ไม่ต้องรอโหลดไฟล์ .css
- Pre-rendering แสดงเนื้อหาสำคัญในหน้าเว็บโดยไม่ต้องรอให้โหลดไฟล์ .js
- Preloading and prefetching บอกเว็บเบราว์เซอร์ตั้งแต่เริ่มโหลดหน้าเว็บว่าเดี๋ยวจะต้องการใช้ไฟล์อะไรอีกบ้าง
ซึ่งถ้าต้องมาเซ็ตอัพทั้งหมดนี่เอง คงใช้เวลาหลายวัน
สุดท้ายผมเลือกใช้ Gatsby สำหรับโปรเจกต์นี้ เพราะว่า…
ลงปุ๊ปใช้ได้เลย
ทันทีที่เซ็ตอัพโปรเจกต์ด้วย Gatsby เราสามารถสั่ง yarn start
แล้วเริ่มเขียนโค้ดได้เลย
โดยสามารถใช้ ES2018+, JSX, CSS (ทั้งแบบธรรมดาและ CSS modules) ได้ทันทีโดยไม่ต้องตั้งค่าอะไรเพิ่ม
นอกจากนี้ยังมีการตั้งค่าระบบ Hot Reload ทำให้พอกด Save แล้วสามารถดูผลได้ทันทีโดยไม่ต้อง Refresh เบราว์เซอร์
สำหรับการ Build
สามารถสั่ง yarn build
เพื่อให้ Gatsby สร้างเป็นไฟล์หน้าเว็บที่พร้อมอัพโหลดขึ้นเซิร์ฟเวอร์
โดย Gatsby จะทำการ Minify โค้ด, Inline critical CSS, ใส่แท็ก Preload/Prefetch ต่างๆ, เอา Hash ของไฟล์มาใส่ในชื่อไฟล์เพื่อเพิ่มประสิทธิภาพการ Caching โดยไม่ต้องตั้งค่าอะไรเพิ่ม
ตัว Gatsby รวม Tools หลายๆ ตัวเข้าด้วยกัน โดยที่เราไม่ต้องยุ่งกับไฟล์ Config ของแต่ละตัว (เช่น webpack.config.js
, .babelrc
) เลย
เพิ่มเพจเพียงสร้างไฟล์ใน src/pages
ปกติเวลาทำเว็บด้วย React ถ้าต้องการทำให้เว็บมีหลายๆ หน้า ก็ต้องไปหา Router มาใช้อีก
แต่สำหรับ Gatsby แค่เพิ่มไฟล์ใหม่ในโฟลเดอร์ src/pages
ก็จะได้หน้าใหม่มาเลย
นอกจากนี้เรายังสามารถ Generate หน้าเว็บหลายๆ หน้า จากไฟล์ข้อมูลได้อีกด้วย ทำให้แทบทุกหน้าในเว็บ ELECT Live! มี URL ของมันเอง
มีคู่มือครบครัน
หนึ่งในจุดแข็งสุดๆ ของ Gatsby คือ Documentation ของมันรวมหลากหลายหัวข้อไว้ และมี Recipe หรือสูตรสำเร็จสำหรับการทำสิ่งต่างๆ ใน Gatsby เช่น
- การสร้างลิงก์ไปหน้าต่างๆ
- การจัดสไตล์หน้าเว็บ ไม่ว่าจะใช้ไฟล์ CSS ธรรมดา, CSS module, Styled Components หรือ Emotion
- การเตรียมหน้าเว็บสำหรับอัพโหลดขึ้นเซิร์ฟเวอร์ ไม่ว่าจะเป็นการ Optimize เพิ่มเติม, การตั้งค่า Caching และการอัพโหลดขึ้นเซิร์ฟเวอร์ชนิดต่างๆ
มีปลั๊กอินให้ใช้หลากหลาย
เราสามารถเพิ่มความสามารถให้ Gatsby หลายๆ อย่าง ผ่านการติดตั้งปลั๊กอิน
เมื่อติดตั้งแล้ว ก็สามารถเรียกใช้ โดยการแก้ไฟล์ gatsby-config.js
เพียงไฟล์เดียว
โดยตัวปลั๊กอินสามารถตั้งค่าเครื่องมือเบื้องหลัง เช่น webpack, Babel และการทำงานอื่นๆ ของตัว Gatsby โดยที่เราไม่ต้องไปแก้แต่ละส่วนเองเลย
ปลั๊กอินที่เราใช้ในเว็บ ELECT Live!:
gatsby-plugin-emotion
ช่วยให้เราแต่งหน้าเว็บได้ง่ายขึ้น ด้วย Emotiongatsby-plugin-react-helmet
เอาไว้เพิ่มพวก Meta Tag ต่างๆ เพื่อ Optimize SEOgatsby-plugin-web-font-loader
เอาไว้โหลดฟอนต์จาก Google Fonts โดยที่ไม่บล็อกการ Render หน้าเว็บgatsby-plugin-layout
เอาไว้กำหนด Component สำหรับใช้เป็น Layout เพื่อให้ไม่ถูก Unmount ทุกครั้งที่เปลี่ยนหน้าgatsby-plugin-google-analytics
เอาไว้ใส่โค้ด Google Analytics พร้อมกับ Track Page View ในแต่ละหน้า โดยมีการ Integrate เข้ากับตัว Router ให้เลยgatsby-plugin-facebook-pixel
เอาไว้ใส่โค้ด Facebook Pixelgatsby-plugin-manifest
เอาไว้สร้าง Progressive Web App Manifest File เพื่อให้สามารถ Add เข้า Home Screen ได้gatsby-plugin-htaccess
เอาไว้สร้างไฟล์ .htaccess สำหรับ Apache Web Server เพื่อให้มีการกำหนด Cache-Control header ตรงตามที่คู่มือแนะนำgatsby-plugin-netlify
เอาไว้สร้างไฟล์ Config สำหรับ Netlify ที่เราใช้เพื่อดูตัวอย่างของเว็บ ก่อนที่จะปล่อยขึ้น Production ให้ทุกคนใช้
สรุปแล้ว การใช้ Gatsby ช่วยประหยัดเวลาในการพัฒนาเว็บไซต์ได้เยอะมากๆ เพราะเราสามารถเอาเวลาไปโฟกัสกับการพัฒนาตัวเว็บได้ แทนที่จะต้องมาคิดเรื่องการ Set up เครื่องมือต่างๆ และการ Optimize เว็บแบบเบื้องต้น