1 ポイント 投稿者 GN⁺ 2024-09-08 | 1件のコメント | WhatsAppで共有

WebP: ウェブページ圧縮フォーマット

障害

  • ウェブサイトのアクセシビリティを高め、ページの読み込み時間を短縮するためにHTMLを最小化
  • GitHub PagesはBrotli圧縮をサポートしていない
  • gzipは標準で使われるが、Brotliのほうがより高い圧縮率を提供する

単純なアイデア

  • GitHub PagesがBrotliをサポートしていないため、クライアント側でJavaScriptを使って展開する方法を検討
  • brotli-dec-wasmtiny-brotli-dec-wasmを使ってBrotliの展開が可能

2回目の試み

  • Compression Streams APIはgzipとDEFLATE形式をサポートしているが、Brotliはサポートしていない
  • Zopfliライブラリを使えばgzipをより効率的に圧縮できるが、それでもBrotliより性能は劣る

掟破り

  • 画像圧縮を使ってデータを圧縮する方法を検討
  • PNGとGIFはDEFLATEアルゴリズムを使うが、WebPはより優れた性能を提供する

WebPの利点

  • WebPはPNGに似た予測変換を使うが、DEFLATEの代わりにGoogleが開発した方式を使う
  • 複数のハフマン木を使ってより効率的な圧縮を実現する
  • カラーキャッシュを使って繰り返し現れる色を効率的に保存する

実験

  • webpクレートを使ってHTMLファイルを圧縮してみた
  • 初期結果ではgzipより2倍小さいサイズを示した

追加の最適化

  • 画像のサイズを調整してより良い圧縮性能を得る
  • さまざまな圧縮方法を試して最適な結果を探す

ベンチマーク

  • さまざまなファイル形式についてgzip、bzip2、Brotli、WebPを比較
  • WebPはほとんどの場合でgzipより良い性能を示す
  • Brotliには及ばないものの、それでも有意な改善を提供する

JavaScriptでデコード

  • Canvas APIを使ってWebPをデコードする方法を説明
  • WebGLを使ってフィンガープリンティング対策技術を回避

最終調整

  • ページ読み込み時のちらつきを減らすため、スタイルと上部部分はgzipのまま維持
  • スクロール位置を維持するための一時的な回避策を提案

埋め込み

  • WebPをJavaScriptに直接埋め込んで遅延を減らす
  • base64データURLを使ってサイズを最小化

  • 実際のウェブページでWebPを使って圧縮した例を提供
  • 圧縮後にページサイズが小さくなることを確認

GN⁺の要約

  • この記事はウェブページの圧縮性能を改善するためのさまざまな方法を探っている
  • WebP形式はgzipより優れた性能を提供するが、Brotliには劣る
  • JavaScriptとWebGLを使ってクライアント側でWebPをデコードする方法を説明
  • ページの読み込み時間を短縮するためのさまざまな最適化手法を提案
  • 類似の機能を提供する他のプロジェクトとしてBrotliとZopfliがある

1件のコメント

 
GN⁺ 2024-09-08
Hacker News のコメント
  • 長い投稿のサイズは 92 KiB から 37 KiB に減っているにもかかわらず、実際の読み込み時間の増加率は 0.001% にすぎない

    • 展開時間のせいでユーザー体験がむしろ悪化する可能性がある
  • readPixels にフィンガープリント対策が適用されていない理由が理解できない

    • ページ上部のスタイルを維持し、ビューポート下のコンテンツだけを WebP で圧縮する技術がある
    • LibreWolf で WebGL を無効にするとページが切れなくなる
  • zstd は Chrome に導入されており、Safari にも適用すべきだ

  • Google Fonts を削除すればページの読み込み時間が改善される可能性がある

    • リモートサーバーから読み込まれるため、追加のハンドシェイクが必要になる
  • ソースコードを確認すると doctype 宣言に空白がない

    • 現在は <!doctypehtml> になっているが、<!doctype html> に修正すべきだ
  • HTML ページを自己展開型 ZIP ファイルとしてパッケージ化できる

    • PNG 画像を含め、HTML・ZIP・PNG と互換性のあるファイルを生成できる
    • たとえば HTML ページ内で PNG 画像を表示できる
  • Sailfish OS のブラウザではページが崩れる

    • 段落の後ろに長い空白がある
    • gzip と brotli による HTML 圧縮のオーバーヘッドは、現在のウェブサイトで使われている JS / 画像 / 動画の量と比べればごくわずかだ
  • Brotli は大きな辞書 (dictionary) を持っているにもかかわらず、gzip と似た性能を示している

    • 圧縮アルゴリズムの方が劣っているのか、それとも辞書の重要性が思ったより低いのか気になる
  • Brotli が CompressionStream API で使われていない理由は、ブラウザのサイズを大きく増やしてしまうためだ

    • 圧縮辞書がより大きい理由は、辞書に事前計算された最も効率的な表現が含まれているためである可能性が高い