WebP: รูปแบบการบีบอัดเว็บเพจ
(purplesyringa.moe)- นี่คือการทดลองลดปริมาณข้อมูลที่ส่ง เมื่อ GitHub Pages ไม่รองรับ Brotli โดยเข้ารหัส HTML เป็นภาพ WebP แบบไม่สูญเสียข้อมูล แล้วกู้คืนด้วยตัวถอดรหัสภาพของเบราว์เซอร์และ JavaScript
- ตัวถอดรหัส Brotli แบบ WASM มีต้นทุนเพิ่ม
71 KiB~200 KBและ Compression Streams API รองรับแค่gzip,deflate,deflate-rawจึงยากจะใช้เป็น ทางเลี่ยงสำหรับการถอดรหัส Brotli - VP8L ซึ่งเป็น WebP แบบไม่สูญเสียข้อมูล สามารถให้ผลลัพธ์ที่เล็กกว่า gzip ได้แม้กับข้อมูลลักษณะข้อความ ด้วย predictive transform, การใช้ Huffman tree ซ้ำตามบล็อก 16x16, และ color cache
- HTML ทดสอบขนาด
439,478ไบต์ลดลงเหลือ gzip94,683ไบต์ และ WebP43,182ไบต์ แม้จะใหญ่กว่า Brotli37 KiBแต่เล็กกว่า gzip ประมาณ 2.2 เท่า - ด้วยปัญหา noise ป้องกัน fingerprinting ของ Canvas 2D, การเปลี่ยนแปลงของ WebGL
readPixels, หน้าจอว่างช่วงแรก และการกู้คืนตำแหน่งสกรอลล์ วิธีนี้จึงใกล้เคียงกับ แฮ็กที่เผยข้อจำกัดของเบราว์เซอร์ มากกว่าการนำไปใช้จริง
ปัญหาที่ GitHub Pages ใช้ Brotli ไม่ได้
- เมื่อต้องการลดเวลาโหลดหน้าเว็บ การบีบอัด HTTP ให้ผลมากกว่า HTML minify
- HTTP รองรับ gzip และ Brotli ผ่านเฮดเดอร์
Content-Encoding- gzip มีต้นทุนต่ำ จึงมักเปิดใช้เป็นค่าเริ่มต้น
- Brotli โดยทั่วไปมีอัตราบีบอัดดีกว่า gzip แต่ช้ากว่ามาก
- GitHub Pages ไม่รองรับ Brotli ทำให้บทความที่ยาวที่สุดของไซต์อย่าง
Recovering garbled Bitcoin addressesจากที่อาจมีขนาด37 KiBหากใช้ Brotli กลายเป็น92 KiBเมื่อใช้ gzip - ความต่างนี้ทำให้เวลาโหลดเพิ่มขึ้นโดยไม่จำเป็นถึง 2.5 เท่า
ทางเลือกแรกที่คิดถึงและจุดที่ติดขัด
- หาก GitHub รองรับการอัปโหลดและให้บริการไฟล์ Brotli ที่บีบอัดไว้ล่วงหน้า ก็เลี่ยงปัญหาได้ แต่ไม่มีฟีเจอร์แบบนั้น
- วิธีคลายการบีบอัดโดยตรงฝั่งไคลเอนต์ด้วย JavaScript ให้ประโยชน์ลดลงเพราะขนาดของตัวถอดรหัส WASM
- brotli-dec-wasm มีขนาดประมาณ
200 KB - tiny-brotli-dec-wasm มีขนาด
71 KiB - สิ่งที่ต้องเปรียบเทียบจึงกลายเป็น gzip
92 KiBกับเนื้อหา Brotli37 KiB + 71 KiBทำให้ข้อได้เปรียบหายไป
- brotli-dec-wasm มีขนาดประมาณ
- ใน HTTP stack ของเบราว์เซอร์มีตัวถอดรหัส Brotli อยู่ แต่ DecompressionStream ของ Compression Streams API รับเฉพาะ
gzip,deflate,deflate-raw - แม้จะบีบอัด
gzipล่วงหน้าด้วย Zopfli ก็ยังมีขนาด86 KiBซึ่งยังใหญ่กว่า Brotli
ใช้ฟอร์แมตภาพเหมือนคอนเทนเนอร์บีบอัด
- เบราว์เซอร์ถอดรหัสภาพได้อยู่แล้ว ดังนั้นหากใส่ข้อมูลลงในพิกเซลของภาพ แล้วอ่านกลับด้วย Canvas API ก็ไม่ต้องใส่ลอจิกคลายการบีบอัดใหม่
- GIF กระจายข้อมูลตามลำดับ row-major แล้วใช้ LZW แต่ DEFLATE ของ gzip ถูกออกแบบมาเพื่อแทนที่ LZW อยู่แล้ว จึงคาดหวังประโยชน์ได้ยาก
- PNG ใช้ DEFLATE แต่ก่อนบีบอัดจะใช้ predictive transform กับผลต่างระหว่างพิกเซลข้างเคียง ไม่ใช่พิกเซลดิบ
- ตัวอย่าง: บีบอัด
[a, b-a, c-b, d-c]แทน[a, b, c, d] - ยิ่งผลต่างระหว่างค่าที่ทำนายกับค่าจริงน้อย ก็ยิ่งเป็นประโยชน์ต่อการบีบอัด Huffman
- ตัวอย่าง: บีบอัด
- แกนหลักของการทดลองคือการนำ VP8L ซึ่งเป็น WebP แบบไม่สูญเสียข้อมูล มาใช้สำหรับบีบอัดข้อมูลไบต์ทั่วไป
VP8L ต่างจาก gzip อย่างไร
- WebP มีทั้งแบบสูญเสียข้อมูลและไม่สูญเสียข้อมูล โดยที่นี่กล่าวถึงเฉพาะ VP8L ซึ่งเป็นฟอร์แมตไม่สูญเสียข้อมูล
- VP8L ใช้ predictive transform เหมือน PNG แต่ใช้วิธีคล้าย DEFLATE ที่ Google สร้างขึ้น แทน DEFLATE
- DEFLATE สามารถแบ่งไฟล์เป็นหลายชิ้น และให้แต่ละชิ้นมี Huffman tree ที่เหมาะกับชิ้นนั้นได้
- หาก JavaScript, SVG และมาร์กอัปปะปนกันใน HTML เดียวกัน tree ที่ต่างกันอาจให้ผลดีกว่า
- VP8L กำหนดตาราง Huffman tree ที่ใหญ่ตามต้องการได้ และแต่ละ บล็อกพิกเซล 16x16 สามารถใช้ tree ต่างกันได้
- ในกรณีที่มี JavaScript ตามด้วย CSS แล้วกลับมาเป็น JavaScript อีก DEFLATE อาจต้องเข้ารหัส tree ที่คล้ายกันซ้ำหลายครั้ง
- VP8L ใช้ tree ซ้ำได้ จึงเปลี่ยน tree ได้บ่อยกว่าและถูกกว่า
- color cache ของ VP8L สามารถแทนค่าด้วยรูปแบบสั้น ๆ เช่นให้คัดลอกพิกเซลล่าสุดที่มีคุณสมบัติบางอย่าง
การทดลองบีบอัด WebP ครั้งแรก
- ไฟล์ทดสอบคือ HTML ของ
Recovering garbled Bitcoin addresses- ขนาดต้นฉบับ:
439,478ไบต์ gzip --best:94,683ไบต์
- ขนาดต้นฉบับ:
- ใช้ crate webp ของ Rust แปลงไบต์เป็นภาพ RGB grayscale แล้วบีบอัดเป็น WebP แบบไม่สูญเสียข้อมูล
- เหตุผลที่ใช้ grayscale คือ transform
subtract greenของ WebP- ใน grayscale หากนำช่อง G ไปลบออกจาก R/B ช่อง R/B ก็แทบจะกลายเป็น 0
- WebP เข้ารหัสสามช่องด้วย Huffman tree แยกกัน ดังนั้นช่องค่าคงที่จึงใช้พื้นที่ใกล้เคียง
O(1)
- ตอนแรกตั้งใจทำเป็นภาพ
1xNแต่ WebP รองรับสูงสุดเพียง16383x16383จึงเกิดข้อผิดพลาดVP8_ENC_ERROR_BAD_DIMENSION - เมื่อปรับเป็นรูปแบบ
16383xNผลลัพธ์ได้45,604ไบต์ เล็กกว่า gzip 2 เท่า และยังเล็กกว่า bzip249,764ไบต์ด้วย
การปรับแต่งเฉพาะ WebP
- หากใช้ลำดับ row-major กับภาพที่กว้าง ไบต์ที่อยู่ไกลกันในอินพุตจะถูกปะปนกันในบล็อก 16x16
- เมื่อเปลี่ยนรูปร่างภาพเป็นแบบสูงและแคบ
27x16383ผลการบีบอัดลดลงเหลือ43,232ไบต์ - เปรียบเทียบการตั้งค่าประสิทธิภาพการบีบอัดของ
cwebpคือ method ตั้งแต่0~6- method 0:
48,902 - method 1:
43,546 - method 2:
43,442 - method 3:
43,292 - method 4:
43,232 - method 5:
43,182 - method 6:
43,182
- method 0:
- เลือก method
5เพราะได้ขนาดเท่ากับ method6แต่เร็วกว่า - ในสภาพนี้ WebP เล็กกว่า gzip 2.2 เท่า และใหญ่กว่า Brotli 1.2 เท่า
เบนช์มาร์กหลายไฟล์
- ชุดเปรียบเทียบคือ snappy testdata, Canterbury Corpus และ Large Corpus และไฟล์ SVG 2 ไฟล์
- ฟอร์แมตที่เปรียบเทียบคือ
gzip --best,brotli --best,bzip2 --bestและสคริปต์บีบอัด WebP - WebP แทบจะดีกว่า gzip เสมอ ยกเว้นไฟล์ขนาดเล็กมากอย่าง
grammar.lsp,xargs.1และบางกรณี - ข้อยกเว้นคือ
kennedy.xlsและpaper-100k.pdfpaper-100k.pdfมีข้อมูลที่ถูกบีบอัดอยู่หลัง XML ขนาด19 KBทำให้แทบจะเป็นการวัดข้อมูลขนาดเล็กkennedy.xlsมีประสิทธิภาพเทียบกับ Brotli/bzip2 ที่แปลกเช่นกัน และอาจเป็นไฟล์ที่คอมเพรสเซอร์จัดการยากเพราะมีข้อมูลต่างชนิดกันจำนวนมากอยู่ใกล้กัน
- WebP โดยรวมแย่กว่า bzip2 เล็กน้อย แต่บางกรณีก็ทำได้ดีกว่า
- WebP แย่กว่า Brotli เสมอ ยกเว้นกรณีอย่าง
fireworks.jpegที่แทบเป็น blob สุ่มสม่ำเสมอ - สำหรับข้อมูล plain-text ขนาดใหญ่ มีการปรับปรุงที่วัดได้เมื่อเทียบกับ gzip
- ไฟล์ SVG ก็มีการปรับปรุงเช่นกัน
- ใน
html_x_4WebP มีอัตราบีบอัด3.3%ซึ่งแย่กว่า Brotli2.8%แต่ดีกว่า gzip13%มาก
กู้คืนด้วย JavaScript
- การถอดรหัส WebP เองสามารถทำได้ด้วย
fetch,createImageBitmap,OffscreenCanvas,getImageData,TextDecoder - โครงสร้างคือใช้ช่อง R ของพิกเซลเป็นไบต์ HTML ต้นฉบับ ถอดรหัสเป็น UTF-8 แล้วใส่ลงใน
document.documentElement.innerHTML - Canvas API ถูกใช้ทำ fingerprinting บ่อย เบราว์เซอร์บางตัวจึงเพิ่ม noise ลงในผลลัพธ์ของ
getImageData- ใน strict tracking protection ของ Firefox พิกเซลน้อยกว่า 1% อาจได้รับผลกระทบ
- ใน HTML noise นี้จะปรากฏเหมือนตัวสะกดผิด
- หากใช้
readPixelsของ WebGL ในตอนนั้นจะทำงานได้โดยไม่มี noise- WebGL รองรับเท็กซ์เจอร์ได้อย่างเสถียรถึง
2048x2048เท่านั้น จึงต้องปรับข้อจำกัดด้านขนาดใหม่ - โค้ดกู้คืนนี้มีขนาดประมาณ
550ไบต์หลัง minify
- WebGL รองรับเท็กซ์เจอร์ได้อย่างเสถียรถึง
- รวม WebP และโค้ดแล้วได้
44 KiBเทียบกับ gzip92 KiBและ Brotli37 KiB - หลังวันที่ 15 เมษายน 2026 Firefox เพิ่ม anti-fingerprinting ให้กับ
readPixelsด้วย ทำให้วิธีนี้ไม่ทำงานเหมือนเดิมอีกต่อไป
ปัญหาหน้าจอกะพริบและการสกรอลล์
awaitถูกประมวลผลแบบอิง promise ดังนั้นก่อนที่การดาวน์โหลด WebP จะเสร็จ เบราว์เซอร์จะถือว่าการรันสคริปต์จบแล้ว- DOM ยังว่างอยู่ ผู้ใช้จึงเห็น หน้าจอขาวว่าง ชั่วครู่
- วิธีบรรเทาคือคงสไตล์และส่วนบนของหน้าประมาณ
8 KiBไว้ใน HTML แบบ gzip แล้วบีบอัดเฉพาะเนื้อหาใต้ viewport ด้วย WebP - การกู้คืนตำแหน่งสกรอลล์ตอนรีเฟรชก็เป็นปัญหาเช่นกัน
- เช่น หากรีเฟรชที่ตำแหน่ง
Y = 5000pxแต่ความสูงหน้าเป็น0pxตำแหน่งจะถูกรีเซ็ต - การเพิ่ม
divชั่วคราวขนาดใหญ่มากช่วยได้
- เช่น หากรีเฟรชที่ตำแหน่ง
- ต้องกำหนดค่าให้
document.documentElement.innerHTMLแทนdocument.writeเพื่ออัปเดตโดยไม่แทนที่เอกสารปัจจุบันด้วยเอกสารใหม่
ใส่ WebP ลงใน JavaScript โดยตรง
- เพื่อลด latency เพิ่มอีกเล็กน้อย สามารถฝัง WebP ลงใน JavaScript โดยตรงได้
- วิธีที่ง่ายที่สุดคือ base64 data URL
- base64 ทำให้ขนาดเดิมเพิ่มเป็น
1.33 เท่าแต่ gzip แทบจะชดเชยส่วนเพิ่มนี้ได้ทั้งหมด- เมื่อแปลง
compressed.webpเป็น base64 จะได้57,576ไบต์ - เมื่อนำไปบีบอัดด้วย gzip
--bestจะได้43,519ไบต์
- เมื่อแปลง
- blob ที่ถูกบีบอัดอย่าง WebP เป็นข้อมูลสุ่มที่เกือบสม่ำเสมอ และ Huffman tree ของ gzip ทำงานกับผลลัพธ์การแปลง 8 บิตเป็น 6 บิตของ base64 แทบเหมือนการแปลงกลับ
- อาจใช้ Unicode และ UTF-16 ได้เช่นกัน แต่ base64 ยังเป็นวิธีแก้แรกที่เพียงพอ
การนำไปใช้จริงและสถานะภายหลัง
- ณ เวลาที่เขียนบทความ หน้าเว็บนี้เองถูกบีบอัดด้วย WebP ตั้งแต่ส่วน “Fool me twice” เป็นต้นไป หากไม่ใช่เบราว์เซอร์เก่าหรือสภาพแวดล้อมที่ปิด JavaScript
- ภาพ WebP ของหน้าในโค้ดจริงสูงและแคบในแนวตั้ง แต่มีตัวอย่าง WebP แบบสี่เหลี่ยมจัตุรัสที่ดูสวยงามให้ด้วย
- ส่วนบนและล่างที่สว่างในภาพคือข้อความและโค้ด พื้นที่ลายแฮตช์ราว 1/5 ของภาพคือไดอะแกรม และพื้นที่มืดส่วนใหญ่คือข้อความในไดอะแกรม
- ปริมาณที่ลดได้จริงมีจำกัด
- หน้า gzip เดิม:
88 KiB - หน้า gzip หลังใช้ WebP:
83 KiB - คาดการณ์ Brotli:
69 KiB
- หน้า gzip เดิม:
- หลังวันที่ 15 เมษายน 2026 เพื่อไม่ให้ผู้เข้าชมผ่าน Firefox เห็นเนื้อหาที่เสียหาย ปัจจุบันจึงเปลี่ยนกลับเป็นหน้าแบบไม่บีบอัด
- โค้ด Rust, corpus และไฟล์อื่น ๆ เผยแพร่บน GitHub
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ถ้าไม่นับเรื่อง latency ก็คงใช่ แต่ในทางปฏิบัติดูเหมือนเวลาโหลดจะเพิ่มขึ้นราว ๆ 0.001% เท่านั้น
ขนาดที่เพิ่มขึ้นไม่มีนัยสำคัญเมื่อเทียบกับ round-trip latency และเวลาที่ใช้คลายการบีบอัดอาจมากกว่าเวลาที่ประหยัดได้จากการส่งข้อมูลน้อยลง 55KiB ด้วยซ้ำ
แม้จะเป็นการทดลองที่น่าสนุก แต่ในกรณีนี้ประสบการณ์ผู้ใช้น่าจะแย่ลงมากกว่า และความเร็วแทบจะเท่าเดิม แต่ความเข้ากันได้ลดลงเท่านั้น
ปัญหาคือมีคนอย่างผู้เขียน TFA ที่พยายามลด 100KB ให้เหลือ 50KB แต่ก็มีที่ที่ส่งรูปภาพหลายสิบ MB มาให้ผมอย่างไม่แยแส ทั้งที่ผมแค่อยากดูเวลาเปิดร้านอาหารผ่านดาต้าโรมมิง
ความตระหนักเรื่องทรัพยากรมีอยู่จริง แต่น่าเสียดายที่กระจายตัวไม่สม่ำเสมออย่างมาก
ถ้าการเชื่อมต่อหลุดก็เสียทั้งหมด และแม้แต่การอ่านเฉพาะส่วนที่ดาวน์โหลดมาแล้วก็ทำไม่ได้
บนการเชื่อมต่อทั่วไปความต่างไม่มีนัยสำคัญ และบนการเชื่อมต่อที่ช้ามากหรือไม่เสถียรจน 50KB มีความสำคัญ วิธีนี้จะแย่กว่าอย่างชัดเจน เป็นการทดลองที่น่าสนุก แต่ไม่อยากให้เอาไปใช้กับไซต์จริง
Symbols-2048-em%20Nerd%20Font%20Complete.woff2ขนาด 850K อยู่ ซึ่งแทบจะกลบความต่างนั้นหมดคงไม่ต่าง 2.5 เท่า แต่ก็ไม่ใช่ 0.001% แน่
บนเครือข่ายที่มีการสูญหายของแพ็กเก็ตอาจมีความต่างได้ แต่ก็ไม่แน่ใจ
ไม่เข้าใจว่าทำไม
readPixelsถึงไม่ถูกจัดเป็นเป้าหมายของการป้องกัน fingerprinting สำหรับผมไม่เป็นไร เพราะคงไม่มีใครโปรย typo ที่แทบมองไม่เห็นไปทั่วทั้งหน้าพอเห็นส่วนที่บอกว่าใน HTML ที่ gzip แล้วจะเหลือไว้แค่สไตล์กับราว 8KiB ตอนบนของหน้า ส่วนเนื้อหาใต้ viewport จะถูกบีบอัดเป็น WebP ก็อธิบายได้ว่าทำไมบทความถึงถูกตัดกลางคันหลังประโยคแบบสุ่มแล้วตามด้วยหน้าว่าง
ผมใช้ LibreWolf อยู่จึงปิด WebGL ไว้ และเกมเว็บสุ่ม ๆ ที่ต้องใช้ WebGL ก็ใช้ Chromium แทน พอเปิด WebGL บทความก็ทำงานได้ดี และพูดตามตรง เทคนิคนี้ค่อนข้างเรียบร้อยดี
WWW ควรเข้าถึงได้ทั่วไปโดยเริ่มจาก HTML ธรรมดา แล้วค่อย ๆ ยกระดับแบบ progressive enhancement
ในเว็บเบราว์เซอร์ การใช้ Brotli โดยตรง ก็เป็นไปได้ แต่แน่นอนว่ามีข้อจำกัด
ผมคิดว่างานที่ส่งเข้าประกวด JS1024 ปี 2022 [1] เป็นการสาธิตแนวคิดนี้ครั้งแรก และยังมีโค้ด proof of concept สำหรับการบีบอัดแบบ arbitrary ด้วย น่าเสียดายที่มันไม่เหมาะกับเป้าหมายเดิมคือ size coding
ข้อจำกัดหลักคือแทบจะถูกจำกัดอยู่กับอักขระ ASCII และด้วยเหตุผลที่ชัดเจน มันไวต่อ rendering stack มาก ตอนนี้ดูเหมือนจะใช้กับ Firefox ไม่ได้
[1] https://js1024.fun/demos/2022/18/readme
[2] https://gist.github.com/lifthrasiir/1c7f9c5a421ad39c1af19a9c...
ทำได้แค่ใช้ รูปแบบไฟล์ฟอนต์ WOFF2 ซึ่ง Brotli ถูกออกแบบมาแต่เดิม แต่ถ้าจะใช้ประโยชน์จากมันก็ต้องสร้างไฟล์ฟอนต์ทั้งไฟล์
เบราว์เซอร์ยุคใหม่มักทำความสะอาดฟอนต์ด้วย OpenType Sanitizer (OTS) เพราะการเอาไฟล์ฟอนต์ที่ไม่น่าเชื่อถือใส่ระบบโดยตรงนั้นอันตรายมาก ดังนั้นจึงต้องสร้างไฟล์ WOFF2 ที่ปกติพอให้ OTS ยอมรับ แต่ในขณะเดียวกันก็มีลำดับไบต์ที่ต้องการอยู่ข้างในและสามารถดึงออกมาได้
ไอเดียที่หลังจากล้มเหลวมาหลายครั้งแล้วไปลงตัวที่ความกว้างของ glyph หรือ advance ซึ่งถูกเข้ารหัสเป็นลำดับจำนวนเต็มมีเครื่องหมาย 2 ไบต์แทบไม่มีข้อจำกัดนั้นยอดเยี่ยมมาก
ฝั่ง Chromium ขวางไว้มานาน แต่ zstd ก็กำลังเข้ามาในเว็บแล้ว ตอนนี้ในที่สุดก็เข้า Chrome แล้ว เหลือแค่ Safari ตามมาให้ทัน
กำลังทำ Batch Compress(https://batchcompress.com/en) อยู่ และไม่นานหลังจากที่เพิ่งเพิ่ม การรองรับ WebP ก็เปลี่ยนให้เป็นค่าเริ่มต้น
เท่าที่ผมรู้ เครื่องมือนี้ก็ทำ JPEG ได้เล็กที่สุดในบรรดาเครื่องมือบีบอัดบนเว็บอยู่แล้ว แต่ WebP ออกมาเหลือแค่ราว 50% ของขนาด JPEG เท่านั้น การเปลี่ยนให้เป็นค่าเริ่มต้นไม่นานหลังเพิ่มการรองรับจึงเป็นการตัดสินใจที่ง่ายมาก
เว็บไซต์มีผู้ใช้ค่อนข้างมาก เลยคิดว่าหลังเปลี่ยน WebP เป็นค่าเริ่มต้นน่าจะมีเสียงบ่นอยู่บ้าง แต่ตอนนี้ผ่านมาประมาณหนึ่งเดือนแล้ว มีคำถามหรือข้อร้องเรียนเกี่ยวกับ WebP แค่เรื่องเดียวเท่านั้น
ตอนนี้ดูเหมือนว่าเครื่องมือและเบราว์เซอร์แทบทั้งหมดรองรับ WebP แล้ว ช่วงหลังเห็นแค่เว็บไซต์หนึ่งที่จัดการอัปโหลดภาพ WebP ได้ไม่ถูกต้องจนติดอยู่ในขั้นตอนถัดไป นอกนั้นทุกวันนี้แทบทั้งหมดรองรับได้ดี
ถ้าบีบอัดและปรับแต่ง JPEG ให้ดี ก็ไม่ควรตามหลัง WebP มากนัก
คุณสามารถสร้าง WebP ที่ดูแทบเหมือน JPEG แล้วลดขนาดไฟล์ได้เสมอ แต่การบีบอัดกลับเป็น JPEG ที่ดูแทบเหมือนกันก็เป็นเช่นเดียวกัน
นี่เป็นลักษณะของโคเดกบีบอัดแบบสูญเสียข้อมูลทุกชนิด และเพราะเมื่อคุณภาพสูงขึ้น ขนาดไฟล์จะเพิ่มขึ้นแบบทวีคูณ ผู้คนจึงมักประหลาดใจเสมอที่คุณภาพลดลงเพียงเล็กน้อยจนแทบมองไม่เห็น ก็ทำให้ขนาดไฟล์ต่างกันมากได้
WebP เคยขึ้นชื่อในทางแย่เรื่องค่าเริ่มต้นที่แย่มาก ซึ่งทำลายรายละเอียดในบริเวณมืด
ระหว่างดูซอร์ส เห็นว่า การประกาศ doctype ขาดช่องว่างไป รูปแบบปัจจุบันไม่ถูกต้องและควรมีช่องว่าง
การละช่องว่างใน
DOCTYPEทำให้สั้นลงได้พูดอย่างเคร่งครัดแล้วไม่ใช่ HTML ที่ถูกต้อง แต่ก็ยังทริกเกอร์โหมดมาตรฐานได้สำเร็จ
อ้างอิง: https://GitHub.com/kangax/html-minifier/pull/970 / https://HTML.spec.WHATWG.org/multipage/parsing.html#parse-er...
ผมเองก็ใช้ทริกนั้นที่ https://FreeSolitaire.win
ดูเหมือนเป็นผลลัพธ์จาก minifier ที่ตัดออกให้มากที่สุดเท่าที่จะทำได้ [0]
0: https://github.com/KTibow/KTibow/issues/3#issuecomment-23367...
ผมเคยใช้ทริกนี้มาก่อน น่าแปลกที่จำไม่ได้ว่าใช้กับอะไร แต่คงแค่อยากดูว่าทำได้ไหม และเคยทิ้งคอมเมนต์ไว้ตรงนี้ด้วย: https://gist.github.com/gasman/2560551?permalink_comment_id=...
ยังเจอต้นแบบเก่า ๆ ด้วย ซึ่งดูเหมือนจะเป็นแค่การทดสอบ: https://retr0.id/stuff/bee_movie.webp.html
เดี๋ยวนี้สิ่งพวกนั้นเหมือนการฉีดสคริปต์มากกว่า และเรียกว่าส่วนขยายไม่ใช่แอดออนแล้ว แต่ไม่ว่าอย่างไร แนวทางที่ตอนแรกส่ง “ขยะ” ไป แล้วต่อท้าย JS เพื่อส่งกลับเข้าไปในหน้าก็น่าสนใจ
คนบ้าความปลอดภัยในตัวผมสงสัยว่าจะทำให้โจมตีได้หรือไม่ เมื่อมีข้อมูลที่ผู้ใช้ป้อนเข้ามาอย่างฟอร์มคอมเมนต์
อาจเป็นไปได้ไหมที่ใครสักคนจะหาลำดับไบต์มาใส่ในคอมเมนต์ แล้วหลังบีบอัดมันไปอยู่ก่อนสคริปต์ของผมและกลายเป็นแท็ก
scriptที่ถูกเรียกใช้งานเพราะสิ่งที่ WebP lossless เพิ่มให้ PNG ส่วนใหญ่เป็นเรื่องการทำโมเดล ไม่ใช่การเข้ารหัส และการบีบอัดข้อความแบบนี้จะใช้เฉพาะส่วนการเข้ารหัสของ WebP เท่านั้น
ถ้าเอา Google Fonts ออก เวลาโหลดหน้าก็น่าจะดีขึ้นเล็กน้อย เพราะโหลดจากเซิร์ฟเวอร์ระยะไกลและต้องมีการแฮนด์เชกเพิ่มเติม
หน้านี้แสดงผลพังอย่างน้อยใน เบราว์เซอร์ Sailfish OS มีช่องว่างยาว ๆ หลังย่อหน้าต่อไปนี้
“Alright, so we’re dealing with 92 KiB for gzip vs 37 + 71 KiB for Brotli. Umm…”
ถึงอย่างนั้น โอเวอร์เฮดของการบีบอัด HTML ด้วย gzip และ Brotli ก็แทบไม่มีความหมายเมื่อเทียบกับปริมาณ JS, รูปภาพ และวิดีโอที่เว็บไซต์สมัยนี้ใช้
ส่วนตัวไม่ค่อยชอบฟอร์แมตนี้ ถ้าบันทึกรูปภาพแล้วมันถูกบันทึกเป็น WebP นอกจากเว็บเบราว์เซอร์แล้วแทบไม่มีที่ไหนรองรับ จึงต้องแปลงก่อนจะแก้ไขหรือใช้งานอย่างมีความหมายได้
รู้สึกเหมือนถูกบังคับให้ทำขั้นตอนเพิ่มเฉย ๆ
แต่ถ้าการรองรับเพิ่มขึ้นก็คงโอเค การมีฟอร์แมตใหม่สักครั้งในรอบ 20 ปีก็พอรับได้
ส่วน
.webmหายไปได้เลย