WebP: รูปแบบการบีบอัดเว็บเพจ
อุปสรรค
- ทำ HTML ให้มีขนาดเล็กที่สุดเพื่อเพิ่มการเข้าถึงของเว็บไซต์และลดเวลาโหลดหน้า
- GitHub Pages ไม่รองรับการบีบอัดแบบ Brotli
- มีการใช้ gzip เป็นค่าเริ่มต้น แต่ Brotli ให้อัตราการบีบอัดที่ดีกว่า
ไอเดียง่าย ๆ
- เนื่องจาก GitHub Pages ไม่รองรับ Brotli จึงพิจารณาวิธีคลายการบีบอัดด้วย JavaScript ฝั่งไคลเอนต์
- สามารถคลายการบีบอัด Brotli ได้ด้วย
brotli-dec-wasm และ tiny-brotli-dec-wasm
ความพยายามครั้งที่สอง
- Compression Streams API รองรับรูปแบบ gzip และ DEFLATE แต่ไม่รองรับ Brotli
- สามารถใช้ไลบรารี Zopfli เพื่อบีบอัด gzip ให้มีประสิทธิภาพยิ่งขึ้นได้ แต่ก็ยังด้อยกว่า Brotli อยู่ดี
ทำผิดกฎ
- พิจารณาวิธีบีบอัดข้อมูลด้วยการบีบอัดภาพ
- PNG และ GIF ใช้อัลกอริทึม DEFLATE แต่ WebP ให้ประสิทธิภาพที่ดีกว่า
ข้อดีของ WebP
- WebP ใช้ predictive transform คล้ายกับ PNG แต่ใช้วิธีที่ Google พัฒนาขึ้นแทน DEFLATE
- ให้การบีบอัดที่มีประสิทธิภาพมากขึ้นด้วยการใช้ต้นไม้ฮัฟฟ์แมนที่หลากหลาย
- ใช้ color cache เพื่อจัดเก็บสีที่ซ้ำกันได้อย่างมีประสิทธิภาพ
การทดลอง
- ลองใช้ crate
webp เพื่อบีบอัดไฟล์ HTML
- ผลลัพธ์เบื้องต้นแสดงให้เห็นว่าขนาดเล็กกว่า gzip 2 เท่า
การปรับให้เหมาะสมเพิ่มเติม
- ปรับขนาดของภาพเพื่อให้ได้ประสิทธิภาพการบีบอัดที่ดีขึ้น
- ทดลองวิธีบีบอัดหลายแบบเพื่อหาผลลัพธ์ที่ดีที่สุด
เบนช์มาร์ก
- เปรียบเทียบ gzip, bzip2, Brotli และ WebP กับไฟล์หลายรูปแบบ
- WebP แสดงประสิทธิภาพที่ดีกว่า gzip ในกรณีส่วนใหญ่
- แม้จะด้อยกว่า Brotli แต่ก็ยังให้การปรับปรุงที่มีนัยสำคัญ
ถอดรหัสด้วย JavaScript
- อธิบายวิธีถอดรหัส WebP ด้วย Canvas API
- ใช้ WebGL เพื่อหลบเลี่ยงเทคนิคป้องกันการทำ browser fingerprinting
การปรับขั้นสุดท้าย
- คงสไตล์และส่วนบนไว้ใน gzip เพื่อลดอาการหน้ากระพริบระหว่างโหลดหน้า
- เสนอวิธีแก้ชั่วคราวสำหรับการคงตำแหน่งการเลื่อน
การฝัง
- ฝัง WebP ลงใน JavaScript โดยตรงเพื่อลด latency
- ใช้ base64 data URL เพื่อลดขนาดให้เล็กที่สุด
ตัวอย่าง
- ยกตัวอย่างการบีบอัดด้วย WebP จากเว็บเพจจริง
- ยืนยันได้ว่าขนาดหน้าเล็กลงหลังการบีบอัด
สรุปโดย GN⁺
- บทความนี้สำรวจวิธีต่าง ๆ เพื่อปรับปรุงประสิทธิภาพการบีบอัดของเว็บเพจ
- รูปแบบ WebP ให้ประสิทธิภาพดีกว่า gzip แต่ด้อยกว่า Brotli
- อธิบายวิธีถอดรหัส WebP ฝั่งไคลเอนต์ด้วย JavaScript และ WebGL
- เสนอเทคนิคการปรับแต่งหลายแบบเพื่อลดเวลาโหลดหน้า
- โปรเจ็กต์อื่นที่ให้ความสามารถคล้ายกัน ได้แก่ Brotli และ Zopfli
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
แม้ขนาดของโพสต์ยาวจะลดจาก 92 KiB เหลือ 37 KiB แต่อัตราการเพิ่มขึ้นของเวลาโหลดจริงมีเพียง 0.001%
ไม่เข้าใจว่าทำไม
readPixelsจึงไม่ถูกใช้กับฟีเจอร์ป้องกันการทำ browser fingerprintingมีการนำ zstd มาใช้ใน Chrome แล้ว และควรนำไปใช้กับ Safari ด้วย
การลบ Google Fonts อาจช่วยให้เวลาโหลดหน้าเว็บดีขึ้น
เมื่อตรวจดูซอร์สโค้ดพบว่าไม่มีช่องว่างในคำประกาศ doctype
<!doctypehtml>แต่ควรแก้เป็น<!doctype html>สามารถแพ็กหน้า HTML เป็นไฟล์ ZIP แบบ self-extracting ได้
หน้าเว็บแสดงผลเพี้ยนในเบราว์เซอร์ของ Sailfish OS
แม้ Brotli จะมี dictionary ขนาดใหญ่ แต่ก็ให้ประสิทธิภาพใกล้เคียงกับ gzip
เหตุผลที่ไม่ได้ใช้ Brotli ใน CompressionStream API คือมันทำให้ขนาดเบราว์เซอร์เพิ่มขึ้นมาก