すべてのブラウザに対応したデータ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クールキューブ変形アニメーションの実装

推薦する

MySQLのデッドロックチェック処理の通常の方法

通常、デッドロックが発生すると、重みが最も小さい接続が強制終了され、ロールバックされます。ただし、最...

VMWare を使用して Windows 上で Linux 環境を構築する手順 (画像とテキスト)

Mac を返却して以来、元のラップトップは使用されていません。このラップトップの構成は非常に良好で...

MySQL で lower_case_table_names を記録する際の落とし穴の詳細な説明

1 原因プロジェクトがデータベースを移行して再起動した後、「T_AAAテーブルが存在しません」という...

MySQLの保存時間の不一致の問題を解決する

Java を使用してシステム時間を取得し、それを MySQL データベースに保存した後、時間タイプが...

ZabbixはPSK共有キーを使用してサーバーとエージェント間の通信を暗号化します。

Zabbix バージョン 3.0 以降、Zabbix サーバー、Zabbix プロキシ、Zabbi...

nginx 503 サービスが一時的に利用できない問題を解決する方法

最近、ウェブサイトを更新すると、503 Service Temporarily Unavailabl...

MySQL公式パフォーマンステストツールmysqlslapの使い方の紹介

目次導入説明書実際の経験まとめ導入MySQL は最も人気のあるオープンソース データベースとして、さ...

HTML の基本概要推奨事項 (段落)

HTML段落段落は <p> タグによって定義されます。例<p>これは段落で...

開発者がデータベースロックを詳細に理解する必要がある理由

1.ロックしますか? 1.1 ロックとは何ですか?ロックの本当の意味は、鍵またはコードで開くことがで...

JavaScript は大容量ファイルのアップロード処理を実装します

数十 MB 程度の小さいものから 1G 以上の大きいものまで、ビデオ ファイルなどのファイルのアップ...

Linux でショートカットアイコンを設定する方法

序文Linux でショートカットを作成すると、アプリケーションをより速く開くことができます。ここで、...

Linux で静的ルーティングを追加するための 2 つの実装方法の分析

ルートを追加するコマンド: 1.ルート追加route add -net 192.56.76.0 ne...

Jenkins の Publish Over SSH プラグインを使用してプロジェクトをリモート マシンにデプロイする手順

SSH プラグインの使用による公開Publish Over SSH を使用する前に、SSH 秘密キー...

dig/nslookup コマンドを使用して DNS 解決手順を表示する方法

dig - DNS ルックアップ ユーティリティドメイン名のアクセス障害が発生した場合、ドメイン名の...

Centos7.6にTomcat-8.5.39をインストールする方法

Centos7.6 に Tomcat-8.5.39 をインストールする方法は次のとおりです。詳細は次...