updated at: 11 Nov 2023
หลาย ๆคนก็คงอยากรู้ performance ของเว็บไซต์ตัวเองว่าเป็นอย่างไร (ใช่ไหมนะ ใช่ไหมนะ) ผมก็เป็นหนึ่งในนั้นแหละ และเพื่อการนั้น เราลองมาทำความเข้าใจกับมันไปพร้อมกันดีกว่า รวมถึงว่าผมได้ทำการปรับปรุงเว็บไซต์อย่างไรเพื่อทำให้เว็บไซต์นี้มี performance ที่ดีขึ้น
สิ่งที่สำคัญของการพัฒนาเว็บไซต์นอกจากเนื้อหาและฟีเจอร์นั่นก็คือ performance ของเว็บไซต์นั่นเอง และเพื่อให้สามารถวัดมันออกมาได้นั้น ก็จำเป็นจะต้องมีการกำหนดวิธีและเมตริกต่าง ๆขึ้นมา ซึ่งทาง Google ก็ได้คิดสิ่งที่เรียกว่า Core Web Vitals ขึ้นมาเพื่อกำหนด metric และ algorithm ต่าง ๆที่เกี่ยวกับการวัด performance ของเว็บไซต์ขึ้นมา และที่สำคัญก็คือทาง Google ก็ได้ประกาศอย่างเป็นทางการว่าลำดับของผลลัพธ์ของการค้นหาในเว็บไซต์ Google นั้นก็ มีการใช้ผลลัพธ์จากการวัด performance ด้วยหลักการของ Core Web Vitals เป็นหนึ่งในปัจจัยในการจัดลำดับด้วย แต่ก่อนอื่นผมอยากให้เข้าใจก่อนว่าการวัด performance ของเว็บไซต์นั้นขึ้นอยู่กับผู้ที่กำหนดกฎเกณฑ์ในการวัด ซึ่งจริง ๆแล้วนั้นบนโลกใบนี้ก็มีกฎเกณฑ์ที่ถูกสร้างขึ้นมาหลากหลาย ดังนั้นเราต้องจึงต้องเลือกกณเกณฑ์ที่เกี่ยวข้องกับเป้าหมายของเรามากที่สุด และเนื่องจากผมต้องการที่จะให้ความสำคัญกับลำดับของผลลัพธ์การค้นหาในเว็บไซต์ Google ผมจึงเลือกศึกษา Core Web Vitals และจะทำการปรับปรุง performance ของเว็บไซต์โดยตั้งอยู่บนกฎเกณฑ์นี้
ถ้าจะสรุปสั้น ๆง่าย ๆ มันก็คือเมตริกต่าง ๆที่ใช้สำหรับวัด performance ของเว็บไซต์ ที่ทาง Google ได้กำหนดขึ้นมา และได้มีการพัฒนามาอย่างต่อเนื่องจนถึงปัจจุบันและต่อไปยังอนาคต (เป็น Present Perfect Continuous Tense) หมายความว่าเมตริกที่ถูกกำหนดขึ้นอาจจะมีการปรับปรุง เปลี่ยนแปลง หรือถูกแทนที่ด้วยเมตริกอื่นได้ ดังนั้นเราในฐานะผู้พัฒนาเว็บไซต์ก็ควรที่จะต้องคอยอัพเดทความรู้ตามไปด้วยอยู่ตลอด (ซึ่งมันก็ไม่น่าจะมีปัญหาอะไร มันเป็นนิสัยของพวกเราอยู่แล้ว... ใช่ไหมนะ ใช่ไหมนะ)
สำหรับเมตริก ณ ปัจจุบัน (8 ตุลาคม 2023) ของ Core Web Vitals นั้น จะมีอยู่ด้วยกัน 3 อย่างได้แก่
จากที่ได้อธิบายไปเบื้องต้น สิ่งที่เราต้องการนั่นก็คือเครื่องมือที่จะใช้วัด โดยต้องรองรับการวัดด้วยเมตริกของ Core Web Vitals ซึ่งจริง ๆแล้วก็มีอยู่หลายตัว (สามารถค้นหาจากอากู๋ได้เลยครับ มีหลายตัวจริง ๆ) โดยผมจะเลือกใช้ PageSpeed Insights เนื่องจากมันสามารถวัดอย่างอื่นที่สำคัญเช่น SEO ได้ด้วย และที่สำคัญคือใน Google Search Console ก็แนะนำให้ใช้ตัวนี้ (มี bias นิดหน่อย ฮ่าฮ่าฮ่า)
เราลองมาดูหน้าตาของมันคร่าว ๆกันดีกว่า (ขออภัยในคว ามเบลอของรูป เอาแค่ให้พอดูรู้เรื่องก็พอเนอะ ไม่ต้องคมชัดมาก คุณจะได้ประหยัด internet bandwidth ด้วย)จากที่ผมตรวจสอบมาทั้งจากรีพอร์ทที่จะมีบอกว่าจุดไหนที่มีปัญหาเรื่อง layout shift และจากที่ทดสอบอะไรหลาย ๆอย่างก็ได้ข้อสรุปว่า ปัญหามันอยู่ที่ "รูปภาพ" ในหน้านั้น ๆ โดยปัญหาก็คือ "browser มันไม่รู้ว่าต้องใช้พื้นที่ขนาดเท่าไหร่สำหรับแสดงผลรูปภาพในจังหวะแรก" เมื่อมันไม่รู้ มันจึงไม่สามารถสงวนพื้นที่ส่วนนั้น ๆไว้สำหรับรูปภาพได้จนกว่ารูปภาพจะถูกดาวน์โหลดและแสดงผล ดังนั้นสิ่งที่จะเกิดขึ้นคือเมื่อมันดาวน์โหลดรูปภาพเสร็จและเอามาแสดงผล เนื้อหาด้านล่างรูปภาพนั้น ๆก็จะ "ถูกดันลง" ทำให้เกิด layout shift นั่นเอง... ดังนั้นงานของผมก็คือ "การทำให้ browser มันรู้ว่าต้องสงวนพื้นที่ไว้ขนาดเท่าไหร่สำหรับรูปภาพนั้น ๆ"
ผมได้ไปเจอ บทความนี้ ซึ่งได้อธิบายวิธีจัดการกับ layout shift ได้ค่อนข้างดี และโดยสรุปก็ได้วิธีการที่เหมาะสมสำหรับเคสที่เจอมาซึ่งก็คือการใส่ attribute ที่ชื่อว่า "width" และ "height" ให้กับ img tag ซึ่งการใส่สองสิ่งนี้ จะทำให้ browser (ที่นิยมใช้กันและเป็นเวอร์ชันใหม่ ๆ) รู้ขนาดพื้นที่ที่ใช้แสดงรูปภาพได้
ตัวอย่าง:
<img src="[URL]" alt="[TEXT]" width="700" height="762">
หลายคนอาจจะสงสัยว่าการกำหนด width และ height ให้กับรูปภาพแบบนี้ รูปภาพจะไม่เป็น responsive รึปล่าว จริง ๆแล้วขนาดของรูปภาพนั้นไม่ได้ขึ้นอยู่กับ attributes พวกนี้เพียงอย่างเดียว เราสามารถใช้การกำหนด style attribute หรือการใช้ CSS ในการจัดการกับขนาดของรูปภาพได้อีกที ซึ่งสิ่งที่ผมต้องการสำหรับการใส่ width และ height ในที่นี้จริง ๆคือผมต้องการให้ browser มันทำการกำหนด default aspect ratio ให้กับรูปภาพนั่นเอง ซึ่งกฎก็คือถ้ารูปภาพมี attribute ทั้ง width และ height แล้ว browser ก็จะสามารถกำหนดอัตราส่วนของพื้นที่ที่จะใช้แสดงรูปภาพได้ (เสมือนว่าเราใช้ CSS aspect-ratio นั่นเอง) เมื่อมีอัตราส่วนแล้ว เราก็จะกำหนดแค่ขนาดของด้านใดด้านหนึ่งได้ ส่วนอีกด้านหนึ่งก็ให้มันกำหนดให้ตามอัตราส่วนโดยอัตโนมัติ ดังนั้นสิ่งที่ผมจะทำต่อไปก็คือการกำหนด CSS เพื่อให้รูปภาพมันเป็น responsive ดังนี้:
img {
max-width: 100%;
height: auto;
}
max-width: 100%;
: อันดับแรก ผมจะทำการกำหนดความกว้างที่มากที่สุดให้กับ img tag เป็น 100% ของ container ดังนั้นรูปภาพของผมก็จะไม่มีทางเกินกว่าขนาดของ container (หรือ parent element) ที่ตัวมันเองอยู่ หมายความว่าเริ่มต้นรูปภาพก็จะมีความกว้างตามที่กำหนดไว้ในตอนแรกด้วย width attribute แต่ถ้ามันใหญ่กว่าความกว้างของ container มันก็จะถูกลดให้เท่ากับ container นั่นเอง และเนื่องจากผมวาง layout ของหน้าให้ browser สามารถคำนวณขนาดความกว้างของมันได้ตั้งแต่แรก (ขออภัยที่ไม่ได้อธิบายว่าทำยังไงเพราะเดี๋ยวมันจะยาวเกินไป) ดังนั้น browser จึงสามารถกำหนดความกว้างของพื้นที่แสดงผลรูปภาพได้ตั้งแต่แรก ไม่จำเป็นต้องรอให้ดาวน์โหลดรูปภาพเสร็จและนำมาแสดงผลheight: auto;
: ผมทำการเปลี่ยนขนาดของความสูงโดยให้มันถูกคำนวณใหม่แทนที่จะเป็นการ fix ค่าตามที่กำหนดให้ในตอนแรก ซึ่งถ้ามีการกำหนดอัตราส่วนไว้และมีขนาดของด้านกว้างแล้ว (ตามที่ได้อธิบายไปด้านบน) ด้วยการใช้ CSS นี้ browser ก็จะสามารถกำหนดขนาดความสูงให้มันได้โดยอัตโนมัติ
...สามารถอ่านต่อได้ ที่นี่