すべてのブラウザに対応したデータURIとMHTMLの完全なソリューション

すべてのブラウザに対応したデータURIとMHTMLの完全なソリューション

データURI

Data URI は、小さなファイルをドキュメントに直接埋め込むために RFC 2397 で定義されたスキームです。次の構文を使用すると、小さなファイルを指定されたエンコーディングに変換し、ページに直接埋め込むことができます。

data:[<MIMEタイプ>][;base64],<データ>

  1. MIME タイプ: 埋め込まれたデータの MIME タイプを指定します。形式は [type]/[subtype]; パラメータです。たとえば、png 画像に対応する MIME は image/png です。パラメータは追加情報を指定するために使用できますが、text/plain や text/htm などのテキスト エンコードの charset パラメータを指定するために使用されることが多いです。デフォルトは text/plain;charset=US-ASCII です。
  2. base64: 次のデータが base64 でエンコードされることを宣言します。それ以外の場合は、データをパーセントエンコードする必要があります (つまり、コンテンツを urlencode します)。

Data URI スキームは、前世紀の HTML4.01 で導入されました。現在、IE6 と IE7 を除くすべての主要ブラウザがこれをサポートしています。ただし、IE8 では Data URI のサポートがまだ限定されており、オブジェクト (画像のみ)、img、input type=image、link、および CSS の URL のみがサポートされ、データ サイズは 32K を超えることはできません。

アドバンテージ:

  1. HTTP リクエストの数を減らし、TCP 接続の消費と、同じドメイン名でのブラウザの同時実行数の制限を排除します。
  2. 小さなファイルの場合、帯域幅が減少します。エンコード後はデータ量が増えますが、http ヘッダーは削減されます。http ヘッダーのデータ量がファイルエンコードの増加量よりも多い場合、帯域幅は削減されます。
  3. HTTPS サイトの場合、HTTPS と HTTP を混在させるとセキュリティ プロンプトが表示されます。また、HTTPS のオーバーヘッドは HTTP よりもはるかに大きいため、この点では Data URI の方が明らかに有利です。
  4. マルチメディア ページ全体をファイルとして保存できます。

欠点:

  1. 再利用できません。同じドキュメント内で同じコンテンツを複数回使用すると、複数回繰り返す必要があり、データ量とダウンロード時間が大幅に増加します。
  2. 独立してキャッシュすることはできないため、それを含むドキュメントが再読み込みされると再読み込みされます。
  3. クライアントは再度デコードして表示する必要があり、消費量が増加します。
  4. データ圧縮はサポートされていません。Base64 エンコードではサイズが 1/3 増加し、URL エンコードされたデータではサイズがさらに増加し​​ます。
  5. セキュリティソフトウェアのフィルタリングには役立たず、一定のセキュリティリスクがあります。

HTML の

MHTML は MIME HTML (Multipurpose Internet Mail Extension HTML) の略称で、RFC 2557 ではマルチメディア ページのすべてのコンテンツを同じドキュメントに保存するためのソリューションとして定義されています。このソリューションは Microsoft によって提案され、IE5.0 からサポートされており、Opera9.0 でもサポートされるようになりました。Safari は .mht (MHTML ファイル サフィックス) 形式でファイルを保存できますが、表示はサポートされていません。

MHTML は Data URI と非常に似ていますが、より強力な機能とより複雑な構文を備えており、Data URI の「再利用できない」という欠点はありません。ただし、MHTML は柔軟性と使いやすさに欠けています。たとえば、mht ファイル内のリソース参照の URL は相対アドレスにすることができますが、そうでない場合は絶対アドレスにする必要があります。 hedger の「HTML に埋め込まれたクロスブラウザ Base64 エンコード画像」の IE 向けソリューションが相対パスを使用する理由は、Content-type:message/rfc822 の宣言により、IE が MHTML に従って解析するようになるためです。Content-type が変更されていない場合は、MHTML プロトコルを使用する必要があります。このとき、「MHTML - データが必要な場合: IE7 およびそれ以下の URI」のように絶対パスを使用する必要があります。

応用

Data URI と MHTML を組み合わせると、すべての主流ブラウザの問題を完全に解決できます。キャッシュして再利用できないため、Web ページで直接使用するのは適していませんが、CSS および JavaScript ファイル内の画像に適切に使用すると大きな利点があります。

  1. リクエスト数を大幅に削減します。現在、大規模な Web サイトの CSS は大量の画像リソースを参照しています。
  2. CSS と JavaScript の両方をキャッシュすることができ、間接的にデータ キャッシュを実装します。
  3. CSSを使用するとデータURIの再利用の問題を解決できる
  4. CSS スプライトとはお別れです。CSS スプライトはリクエスト数を減らすために作成されました。しかし、不確実な状況で例外が発生するだけでなく、CSS スプライトでは手動で画像をマージする必要もあります。マージ ツールを使用した場合でも、パズルを効果的に組み立てる方法を手動で見つけ出すのに多くの時間を費やす必要があり、メンテナンスが困難になります。特定の設計原則に従うと、CSS を記述するために CSS スプライトを完全に放棄し、最終的に「data-uri を使用してスタイルシートと画像をマージする」で Python に実装されているツールなど、画像をサーバーにアップロードするときにデータを URI と MHTML に変換するツールを使用できるようになります。これにより、多くの時間を節約できます。
  5. Base64エンコードでは画像ファイルのサイズが1/3増加し、Data URIとMHTMLを併用すると2/3増加するのと同等です。しかし、CSSとJavaScriptはgzipを使用して圧縮できるため、2/3のデータを節約できます。そのため、gzip圧縮後の最終データサイズは(1 + 1/3) * 2 * (1/3) = 8/9となり、最終的な通信量が削減されます。

CSS でのデータ URI と MHTML の実装を容易にするために、データ URI と MHTML のジェネレーターを作成しました。これを使用してデータ URI と MHTML のアプリケーション例を生成する方法を確認できます。

CSS ファイルで MHTML を使用する場合、URL は絶対パスを使用する必要がありますが、これは非常に柔軟性に欠けます。したがって、この問題を解決するには、CSS 式の使用を検討できます (DEMO)。次に例を示します。

/*
http://old9.blogsome.com/2008/10/26/css-expression-reloaded/
http://dancewithnet.com/2009/07/27/get-right-url-from-html/
*/
*背景画像:式(関数(ele){
ele.style.backgroundImage = 'url(mhtml:' +
document.getElementById('data-uri-css').getAttribute('href',4) +
'!03114501408821761.gif)';
}(これ));

<<:  Vue のライフサイクルとフック関数の詳細な説明と典型的な面接の質問

>>:  CSS3 3Dクールキューブ変形アニメーションの実装

ブログ    

推薦する

JavaScript における変数と関数の昇格の詳細な例

js 実行字句解析フェーズ: 形式パラメータ解析、変数宣言解析、関数宣言解析の 3 つの部分が含まれ...

MySQL 文字セットの文字化けとその解決方法

序文文字セットは、一連のシンボルとエンコード規則です。Oracle データベースでも MySQL デ...

jsを使用してシンプルな虫眼鏡効果を実現します

この記事では、簡単な虫眼鏡効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な内...

JavaScript は、マウスがテーブル行を通過するときに色の識別を実装します。

この記事では、マウスがテーブルの行を通過するときにJavaScriptを使用して色ラベルを表示する方...

Zabbix は DingTalk のアラーム機能を画像付きで設定します

実装のアイデア:まず、アラーム情報にはitemidが必要です。これは前提条件です。情報に渡されるパラ...

MySQL データベース トランザクション例のチュートリアル

目次1. トランザクションとは何ですか? 2. トランザクションに関連するステートメントは、挿入、削...

HTML ページでギリシャ文字を使用する方法

ギリシャ文字は、特に数学や物理学などの科学技術分野で非常によく使用される記号列であり、特定の意味を持...

ドラッグアンドドロップでVueユーザーインターフェースを生成する方法

目次序文1. 技術原理1.1 レイアウト1.2 コンポーネント1.3 ステータス1.4 イベント1....

Vue3コンポーネントの開発詳細

目次1. はじめに2. コンポーネント開発1. コンポーネントの構成2. ヘッダーコンポーネントの開...

MySQL 8.0.20 winx64 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.20 winx64 のインストールと設定方法を次のように説明します...

Linuxはiptablesを使用して複数のIPからのサーバーへのアクセスを制限します

序文Linux カーネルでは、netfilter は、パケット フィルタリング、ネットワーク アドレ...

vuex データの永続化のための 2 つの実装ソリューション

目次ビジネス要件:解決策 1: vuex-persistedstate解決策2: vuex-pers...

フロントエンドアプリケーションのjenkins+gitlab+nginxデプロイメント

目次関連する依存関係のインストールドッカーDockerでJenkinsをインストールするDocker...

25 個の CSS フレームワーク、ツール、ソフトウェア、テンプレートを共有

スプライトカウダウンロード CSS リントダウンロード プレフィックスダウンロード 1140px C...

Vue テンプレートのコンパイルの詳細

目次1. 解析する1.1 傍受のルール1.2 傍受プロセス部分1.3 パーサーの概要2. 最適化する...