updated at: 20 Jan 2024
ทุกอย่างก็ควรมีการพัฒนา ต้องมีการเปลี่ยนแปลงไปในทางที่ดีขึ้น(มั้ง) และในโลกของซอฟต์แวร์ สิ่งที่เป็นเรื่องปกติอย่างหนึ่งก็คือการอัพเกรดเวอร์ชั่น เวอร์ชันใหม่อาจจะมีฟีเจอร์ใหม่ ๆมาให้เราใช้งาน อาจจะมีการแก้ปัญหาของเวอร์ชันที่แล ้ว หรืออาจจะเป็นการยกเครื่อง core หลักของระบบใหม่ด้วย ซอฟต์แวร์ที่ถูกอัพเดทนั้นอาจจะเป็นส่วนหนึ่งของอีกซอฟต์แวร์หนึ่งก็เป็นเรื่องปกติเช่นกัน อย่างเช่น เว็บไซต์หนึ่งใช้งานระบบ "Google Sign-in", เว็บไซต์ Facebook ใช้ React ในการเขียนเว็บ, เว็บไซต์ PageSpeed Insights ใช้ Lighthouse ในการวัด performance (หากใครสนใจเกี่ยวกับเรื่อง Website Performance สามารถตามไปอ่านได้ ที่นี่) ฯลฯ เว็บไซต์นี้ก็ใช้ Gatsby ครับ แล้วมันก็มีการอัพเกรดเวอร์ชันเป็น 5 เป็นที่เรียบร้อย และแน่นอนว่าเวอร์ชันที่ใช้ก็คือ 4 นั่นเอง ดังนั้นก็เลยเป็นโอกาสอันดีที่จะพาทุกคนไปดูว่า แค่ผมจะอัพเกรดมันให้เป็นเวอร์ชัน 5 นั้น ผมต้องทำอะไรบ้าง...
ก่อนอื่น ผมอยากให้ทำความเข้าใจกับ Semantic Versioning กันก่อน สามารถอ่านได้ ที่นี่
อันดับแรกสุดเลยก็คือ "การหาข้อมูล" เกี่ยวกับซอฟต์แวร์ที่เราจะทำการอัพเดทครับ โดยปกติแล้วเราจะสามารถอ่านเกี่ยวกับข้อควรระวังและขั้นตอน ต่าง ๆในการอัพเดทเวอร์ชันนั้น ๆได้ใน document ของซอฟต์แวร์(แต่ถ้าไม่มีก็อาจจะต้องใช้ประสบการณ์และดวงอยู่สักหน่อยในการอัพเดท 😅) การหาข้อมูลจะช่วยให้เราเข้าใจขั้นตอนการอัพเดทเวอร์ชันของซอฟต์แวร์นั้น ๆที่ถูกต้อง รวมถึงข้อควรระวังในการอัพเดท
ปัญหาที่จะเจอก็มักจะเป็นเรื่องของ compatibility หรือความเข้ากันได้ระหว่างซอฟต์แวร์ที่เราใช้ เช่น
เครื่องของเราติดตั้ง NodeJS เวอร์ชัน 14
มี package A ที่เวอร์ชัน 1.2.0 รองรับ NodeJS เวอร์ชัน >=14 และ <=16
มี package B ที่เวอร์ชัน 2.1.0 รองรับ NodeJS เวอร์ชัน >=12 และ <= 14
ดังนั้นหากเราอัพเกรด NodeJS ไปเป็น เวอร์ชัน 16 สิ่งที่อาจจะเกิดขึ้นก็คือ package B จะมีสิทธิ์ที่จะทำงานผิดพลาดหรืออาจจะทำงานไม่ได้เลย (บาง package ก็จะมีการเขียนกฎบางอย่างซึ่งเจาะจงเวอร์ชันของ NodeJS ไปเลย หากเราใช้เวอร์ชันที่ไม่ตรงตามที่กำหนด มันก็จะรันไม่ขึ้นตั้งแต่แรกเลย เช่น การกำหนด engines ใน package.json)
จากที่ยกตัวอย่างไปด้านบนนั้นเป็นแค่เคสพื้นฐาน ซึ่งในความเป็นจริงแล้วซอฟต์แวร์ต่าง ๆนั้นก็จะมี package ย่อย ๆข้างในอยู่มากกว่า 2 อยู่แล้ว และยิ่งมันมีความเกี่ยวโยงกันมากเท่าไหร่ ความปวดหัวของเราในการที่จะอัพเกรดมันก็จะมากขึ้นเท่านั้น
สิ่งหนึ่งที่ช่วยลดความปวดหัวเวลาที่จะอัพเกรดเวอร์ชันซอฟต์แวร์ของเรานั่นก็คือ การหาเวลามาอัพเกรดเวอร์ชันของสิ่งที่เราใช้อยู่อย่างสม่ำเสมอ ไม่ปล่อยให้มัน outdated เพราะยิ่งเวอร์ชันยิ่งเก่าเท่าไหร่ การที่จะอัพเกรดมันก็จะยากเท่านั้น เปรียบเสมือนปมของเชือกที่ค่อย ๆผูกกันเยอะขึ้นไปเรื่อย ๆ
สามารถอ่าน ref นี้ประกอบไปด้วยได้นะครับ
gatsby develop
ก็เจอ error ซะแล้วว
npm install
เพื่อให้มัน install/resolve dependencies ทั้งหมดใหม่อีกครั้ง
children
มาให้ใน type แล้ว (ref) ดังนั้นสิ่งที่ต้องทำในที่นี้ก็คือการไปแก้ไขเกี่ยวกับเรื่อง type ของ component ต่าง ๆที่ต้องการใช้งานเกี่ยวกับ property children
ให้มีอยู่ใน type ด้วย
สำหรับปัญหาเกี่ยวกับ ESLint และ Typescript ที่เจอก็ยังถือว่าไม่ได้เป็นปัญหาใหญ่ สามารถแก้ไขได้ง่ายและใช้เวลาไม่นาน
@uiw/react-markdown-preview
ซึ่งผมได้ทำการอัพเกรดพร้อมกับ package อื่น ๆไปก่อนหน้านี้จากเวอร์ชัน 4 ไปเป็นเวอร์ 5
ตอนแรกผมคิดว่ามันเกิดจาก package gatsby-plugin-sharp
เนื่องจากมันมีบอกว่า job บางอย่างของมันทำงานไม่สำเร็จ ซึ่ง package นี้ผมใช้คู่กับ "gatsby-plugin-image" เพื่อที่จะใช้งาน component "StaticImage" ของมัน แต่หลังจากที่ผมทำการนำโค้ดที่เกี่ยวข้องกับ package นั้นออกไปและทำการ build อีกครั้ง มันก็ยังเกิด error แบบเดิม ดังนั้นถัดมาผมจึงคิดว่าอาจจะเป็นที่ webpack ที่ต้องไปเพิ่ม configuration บางอย่าง... หลังจากลองสักพักก็ยังไม่เวิร์ค มันดันไปเจอ error บางอย่างเพิ่มอีก 😅
ผมก็เลยรีเสิร์ชเพิ่มเติมและก็ได้ไล่ดู package อื่น ๆ จากนั้นก็มาเอะใจ package นั้นเข้า ผมจึงลอง downgrade มันกลับไปเป็นเวอร์ชันก่อนหน้า (เวอร์ชัน 4) แล้วทำการลอง build อีกครั้ง ปรากฎว่ามันผ่านไปได้ด้วยดี ไม่มี error เกิดขึ้นแล้ว ก็เลยสรุปได้ว่าต้นตอของ error ก็คือ package นั้นนั่นเอง (จะเห็นได้ว่านี่ก็เป็นอีกตัวอย่างที่จะทำให้เข้าใจว่าการอัพเกรด package หลาย ๆตัวพร้อมกันนั้นก็มีความเสี่ยงที่จะเกิดปัญหาขึ้นโดยยากที่จะรู้ได้ว่าสาเหตุหรือต้นตอมันมาจากอะไร)
*Disclaimer: จริง ๆแล้วถ้าเป็นไปได้เราควรจะเข้าใจถึงปัญหาที่เกิดขึ้นจริง ๆก่อนเพื่อที่จะแก้ไขมันได้ถูกจุด ซึ่งสิ่งผมทำก็เป็นเพียงการแก้ไขปัญหาเบื้องต้นเท่านั้น ผมตัดสินใจที่จะใช้วิธี "ตัดปัญหาจากต้นลม" แทนที่จะ "ทำความเข้าใจและแก้ไขปัญหาให้ถูกจุด" เนื่องจากผมไม่อยากใช้เวลาไปกับการแก้ปัญหานี้มากจนเกินไปครับ
สำหรับคนที่อ่านมาถึงตรงนี้ก็น่าจะพอเห็นถึงสิ่งที่ จะเจอ สิ่งที่ต้องระวัง และสิ่งที่ควรทำ/ไม่ควรทำทั้งก่อนและหลังการอัพเกรดเวอร์ชัน ก็หวังว่าบทความนี้จะมีประโยชน์แก่ผู้ที่เข้ามาอ่านนะครับ ^^