ホームページ >ウェブフロントエンド >htmlチュートリアル >HTML5におけるパフォーマンス最適化の詳細説明
-- 再描画の削減
HTML ページが表示された後、ページ要素を動的に変更したり、CSS スタイルを調整したりすると、ブラウザーの再描画が発生し、パフォーマンスの低下は動的変更の範囲に直接依存します。 : 要素の色などの情報を変更すると要素のみが再描画される場合、ノードの追加または削除、またはノードの位置の調整を行うと、その兄弟ノードも再描画されます。
再描画を減らすということは、再描画しないという意味ではなく、再描画の範囲に注意を払うことです。 ① DOM 要素がより深く変更されるほど影響は小さくなるため、より深いノード変更を行うようにしてください。 ② 複数の変更をいくつかにマージしてみてください。 DOM スタイルを一緒に変更します。
例として、3499910bf9dac5ae3c52d5ede7383485 タグの背景色、幅、色の変更を考えてみましょう。
<a href="javascript:void(0);" id="example">传统的代码</a> <script> var example = document.getElementById("example"); example.ondblclick = function() { example.style.backgroundColor = "red"; example.style.width = "200px"; example.style.color = "white"; } </script>
上記は3回再描画されますが、JavaScriptではなくCSS経由で複数回実行した場合、再描画は1回のみです。
<style> .dblClick { width: 200px; background: red; color: white; } </style> <a href="javascript:;" id="example">CSS优化的代码</a> <script> var example = document.getElementById("example"); example.ondblclick = function() { example.className = "dblClick"; } </script>
スクリプトの読み込みブロックを避ける
ブラウザが通常のスクリプトタグを解析するとき、解析して実行する前にスクリプトがダウンロードされるまで待つ必要があり、後続の HTML コードは待つことしかできません。 CSS ファイルの導入は、HTML レンダリングに必要な要素であるため、93f0f5c25f18dab9d176bd4f6de5d30e ヘッダーに配置する必要があります。読み込みのブロックを避けるために、スクリプトはドキュメントの最後に配置し、CSS は先頭に配置する必要があります。
<head> <link rel="stylesheet" href="common.css">......<script src="example.js"></script> </body>
--ノードの深いレベルのネストを避ける
深くネストされたノードは、多くの場合、初期構築中により多くのメモリを必要とし、ブラウジングとは異なり、ノードを横断するときに遅くなります。これによりブラウザは DOM ドキュメントを構築します。ブラウザは、HTML ドキュメント全体の構造を DOM の「ツリー」構造として保存します。ドキュメント ノードのネスト レベルが深くなると、構築される DOM ツリーのレベルも深くなります。
次のコードは、タグ e388a4556c0f65e1904146cc1a846bee または 45a2772a6b6107b401db3c9b82c049c2 の 1 つを完全に削除できます。
<p> <span> <label>嵌套</label> </span> </p>
ページキャッシュ
通常、キャッシュを設定しないと、ページが更新されるたびにサーバーのファイルが再読み込みされますが、キャッシュを設定すると、すべてのファイルをローカルで取得できます。ページの効率が大幅に向上することは明らかです。
ページヘッダーでexpiresを設定することでページの有効期限を定義でき、有効期限を長く設定することで「永続的な」キャッシュを実現できます。
<meta http-equiv="expires" content="Sunday 26 October 2099 01:00 GMT" />
もちろん、プロジェクトのコードが変更された場合、クライアントはファイルをキャッシュするため、最新のファイルを取得できなくなり、必然的に表示エラーが発生します。この問題の解決策は、リンクされたファイルにタイムスタンプを追加することです。タイムスタンプが変更されると、ブラウザはそれが新しいファイルであると認識し、サーバーに最新のファイルを要求します。
<script src="example2014-6-17.js"> </script>//如果是JSP,可以用EL表达式来取时间戳信息,这样管理更加方便 <script src="example${your time param}.js"> </script>//或者这样的写法更优秀: <script src="example.js?time=2014-6-7"></script> <script src="example.js?time=${your time param}"></script>
マージされたファイルを圧縮する
JavaScriptファイル、CSSファイル、画像ファイルなど、リクエストデータに関わるすべてのファイル、特に高解像度の要件がない場合は、可能な限り圧縮する必要があります。圧縮して再利用できます。大量の大きなボリュームを持つファイルは、小さなサイズのファイルよりも高速であるため、場合によっては、複数の JS ファイルと複数の CSS ファイルを一緒にマージすることを検討できます。
HTML文書のサイズを小さくする以外にも、次のような方法もあります。
①HTM文書の実行結果に影響のないスペース、空行、コメントを削除する
②テーブルレイアウトを避ける
③HTML5を使用する
--HTML+CSS3+JavaScript はそれぞれ独自の役割を果たします3 つの要素にそれぞれの役割を実行させることによってのみ、高性能の Web ページを作成できます: HTML はページとソースの基礎ですCSS は、CSS と Javascript を連携させることができ、ますます強力になっている CSS は、JavaScript に代わって、グラデーション、動き、その他の動的効果などを実行できます。動的データの王様。古いブラウザは動的効果の表現を js に依存していましたが、現在は CSS で js の作業も完了できるため、パフォーマンスが向上する css に作業を任せてみてください。 (これは少し大きいです)
--CSS スプライトを実装するための画像の結合画像の結合は、実際には、Web ページ内のいくつかの背景画像を画像ファイルに統合し、CSS "background-image", " を使用します。 「background -repeat」と「background-position」は、背景の位置を指定するために使用されます。background-position では、数値を使用して背景画像の位置を正確に特定できます。 1 つのページで複数のアイコンを使用する必要がある場合は、複数のアイコンをグラフに結合することができ、CSS の配置を通じて分割アイコンを配置するだけで済みます。
-- Iframe の使用を避ける使用iframe并不会增加同域名下的并行下载数,浏览器对同域名的连接总是共享浏览器级别的连接池,在页面加载过程中iframe元素还会阻塞父文档onload事件的触发。并且iframe是html标签中最消耗资源的标签,它的开销比p、SCRIPT、STYLE等DOM高1~2个数量级。
避免onload事件被阻塞,可使用JavaScript动态的加载iframe元素或动态设置iframe的src属性(但其仅在高级浏览器IE9及以上有效)。
<iframe id="if"></iframe> document.getElementById("if").setAttribute("src","url");
--多域名请求
一般来说,浏览器对于相同域名的图片,最多用2-4个线程并行下载(不同浏览器的并发下载数是不同的)。而相同域名的其他图片,则要等到其他图片下载完后才会开始下载。
有时候,图片数据太多,一些公司的解决方法是将图片数据分到多个域名的服务器上,这在一方面是将服务器的请求压力分到多个硬件服务器上,另一方面,是利用了浏览器的特性。(大家可以去新浪、腾讯门户网站查看,这些大型站点同一页面加载的图片可能由多个站点提供)
注:一个HTML请求的域名也不要太多(2~3个差不多),多了可能造成不同服务器连接时间差异,反而影响速度。
--避免空链接属性
如624a480c6387e73c22b4f60ddcc0f14e8fb0647cc270c6c60ce1679670afa6fc这样的设置方式是非常不可取的,即使链接为空,在旧的浏览器也会以固定步骤发送请求信息。
另外9dba6f1f949f5e07bed667bf670fd9c45db79b134e9f6b82c0b36e0489ee08ed也不可取,最好的方式是在链接中加一个空的js代码af60cb7cd5eb3467eaa609628cdd0ba95db79b134e9f6b82c0b36e0489ee08ed
--使用图像的BASE64编码
base64是一串字符串,他可以代表一个图片的所有信息,也就是可以通过09522e18412c10a262484dd8ba0b09ee(S表示一串base64码)来显示图片,这种方式不需要再向服务器发送请求,完全由浏览器解析成图片。
目前高级浏览器都支持此功能,但要注意两点:①低版本浏览器(如IE7)不支持;②base64字符串长度随图片的大小及复杂度成正比,base64也像URL一样,也有超出长度的情况(在IE8下很常见)。所以要根据情况来使用。
--显式设置图片的宽高
如果HTML里的图片没有指定尺寸(宽和高),或者代码描述的尺寸与实际图片的尺寸不符时,浏览器则要在图片下载完成后再“回溯”该图片并重新显示,这会消耗额外时间。
<iframe id="if"></iframe> document.getElementById("if").setAttribute("src","url");
--显式指定文档字符集
如果浏览器不能获知页面的编码字符集,一般都会在执行脚本和渲染页面前,把字节流缓存,然后再搜索可进行解析的字符集,或以默认的字符集来解析页面代码,这会导致消耗不必要的时间。
<iframe id="if"></iframe> document.getElementById("if").setAttribute("src","url");
--渐进式增强设计
渐进式增强设计的通俗解释就是:首先写一段满足所有浏览器的基本样式,再在后面针对不同高级浏览器编写更漂亮的样式
如下代码,所有浏览器都支持background-color: #2067f5;满足了浏览器基本现实需求,而后面的background-image: -webkit-gradient等则为不同高级浏览器使用,只要浏览器识别就能执行这段代码(不识别,CSS也不会报错只会直接忽略)。
<p class="someClass"></p> .someClass { width: 100px; height: 100px; background-color: #2067f5; background-image: -webkit-gradient(linear, left top, left bottom, from(#2067f5), to(#154096)); background-image: -webkit-linear-gradient(top, #2067f5, #154096); background-image: -moz-linear-gradient(top, #2067f5, #154096); background-image: -ms-linear-gradient(top, #2067f5, #154096); background-image: -o-linear-gradient(top, #2067f5, #154096); background-image: linear-gradient(to bottom, #2067f5, #154096); }
--懒加载与预加载
预加载和懒加载,是一种改善用户体验的策略,它实际上并不能提高程序性能,但是却可以明显改善用户体验或减轻服务器压力。
预加载表示当前用户在请求到需要的数据之后,页面自动预加载下一次用户可能要看的数据,这样用户下一次操作的时候就立刻呈现,依次类推。
懒加载表示用户请求什么再显示什么,如果一个请求要响应的时间非常长,就不推荐懒加载。
--Flush机制
ページが非常に大きく、多くのコンテンツがある場合、フラッシュの形でページに部分的に返すことができます。これにより、コンテンツの一部を表示する方が、待機するよりも作業中であることをユーザーに伝えることができます。空白の画面が長時間続く。 Java Web テクノロジでは、Flush の実装は非常に簡単です。HttpServletResponse.getWriter 出力ストリームのフラッシュ メソッドを呼び出して、ロードされたコンテンツをクライアントに書き戻すだけです。
この方法は、返されるデータが大量にあり、通常のデータの場合はリクエスト時間が特に長い場合にのみ適しており、通常のリアルタイムですべてのデータを返すことが最適です。この実装方法では、実際にはブラウザのレンダリング時間とユーザー全体の待ち時間が長くなりますが、ユーザー エクスペリエンスの観点からは優れています。
パフォーマンスサーバーの最適化
--CDNメカニズム
いわゆるCDNは、インテリジェントなルーティングとトラフィック管理テクノロジーを使用して、時間内に検出し、訪問者に最速の応答を提供するコンテンツ配信ネットワークです 加速ノード、訪問者のリクエストをアクセラレーション ノードに送り、コンテンツ サービスを提供します。一般的に、成都の北京の販売者 (サーバー) から商品を購入した場合、北京の販売者は速達便 (CDN サービス) で荷物を発送します。これは、この配送方法が最も速いためです。
もちろん、CDN を使用する際には次の 2 つの点に注意してください:
1. CDN アクセラレーション サービスは非常に高価であると思われる場合は、CDN を購入することを選択できます。ローカル Web サイト (Web サイトなど) の場合 地域ネットワークが非常に近いため、特定のエリアまたはローカル エリア ネットワークにのみアクセスできるため、CDN アクセラレーションの必要はありません。
-- HTTP プロトコルの合理的な使用ブラウザのキャッシュによってもたらされるパフォーマンスの向上は誰もがよく知っていますが、ブラウザのキャッシュの有効期限、キャッシュの削除、キャッシュできるページなどについては多くの人が知りません。 HTTP プロトコルに精通していれば、ブラウザを簡単に制御できます。 拡張読書: HTTP プロトコルの深い理解
-- 静的コンテンツと動的コンテンツの分離いわゆる動的コンテンツと静的コンテンツの分離とは、Web アプリケーション内の静的コンテンツと動的コンテンツを配置することです。それぞれ異なる Web サーバーを使用し、動的コンテンツをターゲットを絞った方法で処理し、静的コンテンツを処理してパフォーマンスの向上を実現します。 HTML に複数のドメイン名がある場合、Tomcat サーバーは静的および同時実行性の問題の処理が比較的弱いため、事前に静的と動的を分離する方法は一般に Apache+Tomcat、Nginx+Tomcat です。 、など。 Apache+Tomcat を例にとると、その動作メカニズムは次のとおりです。まずページリクエストが Apache に送信され、次に Apache はリクエストされた情報が静的か動的かを分析し、静的処理はローカルで行われ、動的処理は に引き渡されます。トムキャット。
これは実際には負荷分散のプロトタイプです。この実装では、開発者は特別な開発を行う必要はありません。このファイルが提供されるかどうかについては、 Apache または Tomcat から取得できるため、開発者はまったく注意を払う必要はありません。
--HTTP 永続接続永続接続 (Keep-Alive) は、次回接続するときにブラウザとサーバーによってキャッシュされる TCP 接続方法です。同じサーバー、キャッシュ接続が再利用されます。 HTTP のステートレスな性質は、HTTP が長時間接続に属さないことを意味しますが、HTTP/1.1 は長時間接続のサポートを提供します (ただし、これは、HTTP の最も一般的な例として、長時間接続機能をサポートするためにブラウザーとサーバーの両方に依存する必要があります)。長い接続は「ブレークポイントダウンロード」です。
ブラウザは、リクエストのヘッダーに Connection:Keep-Alive を追加して、サーバーに「私は長い接続をサポートしています。サポートしている場合は、私との長い接続を確立してください。」と伝えます。サーバーが長い接続をサポートしている場合は、それを行います。ヘッダーに「Connection:Keep-Alive」を追加して、ブラウザに「サポートしているので、長い接続を確立しましょう」と伝えます。サーバーは、Keep-Alive:timeout=..., max=... ヘッダーを通じてブラウザに長い接続有効期限を通知することもできます。 長い接続を構成するには、通常、サーバーのサポート設定が必要です。テストデータによると、長い接続を使用した場合と使用しない場合のパフォーマンスの比較では、Tomcat を maxKeepAliveRequests を 50 に設定すると、効率が 5 倍近く向上することが示されています。
--GZIP 圧縮テクノロジーHTTP プロトコルは GZIP 圧縮形式をサポートしており、サーバーから返された HTML 情報ヘッダーに Content-Encoding:gzip が含まれている場合、応答データが GZIP 形式に圧縮されていることをブラウザーに伝えます。 . の場合、ブラウザはデータを取得した後に解凍操作を実行する必要があるため、サーバーへのデータ送信の負荷がある程度軽減されます。
很多服务器已经支持通过配置来自动将HTML信息压缩成GZIP,比如tomcat、又比如很火的Nginx。如果无法配置服务器级别的GZIP压缩机制,可以改为程序压缩。
// 监视对 gzipCategory 文件夹的请求 @WebFilter(urlPatterns = { "/gzipCategory/*" }) public class GZIPFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String parameter = request.getParameter("gzip"); // 判断是否包含了 Accept-Encoding 请求头部 HttpServletRequest s = (HttpServletRequest)request; String header = s.getHeader("Accept-Encoding"); //"1".equals(parameter) 只是为了控制,如果传入 gzip=1,才执行压缩,目的是测试用 if ("1".equals(parameter) && header != null && header.toLowerCase().contains("gzip")) { HttpServletResponse resp = (HttpServletResponse) response; final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); HttpServletResponseWrapper hsrw = new HttpServletResponseWrapper( resp) { @Override public PrintWriter getWriter() throws IOException { return new PrintWriter(new OutputStreamWriter(buffer, getCharacterEncoding())); } @Override public ServletOutputStream getOutputStream() throws IOException { return new ServletOutputStream() { @Override public void write(int b) throws IOException { buffer.write(b); } }; } }; chain.doFilter(request, hsrw); byte[] gzipData = gzip(buffer.toByteArray()); resp.addHeader("Content-Encoding", "gzip"); resp.setContentLength(gzipData.length); ServletOutputStream output = response.getOutputStream(); output.write(gzipData); output.flush(); } else { chain.doFilter(request, response); } } // 用 GZIP 压缩字节数组 private byte[] gzip(byte[] data) { ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(10240); GZIPOutputStream output = null; try { output = new GZIPOutputStream(byteOutput); output.write(data); } catch (IOException e) { } finally { try { output.close(); } catch (IOException e) { } } return byteOutput.toByteArray(); } …… }
总结
细节决定成败,系统慢是由一个又一个不良的小细节造成的,所以开发初期做好充足的准备,开发中认真负责、不偷工减料,维护期更要注重代码质量,这样才能让我们的系统稳定高效。
个人觉得一个产品的新版本质量可以从核心js文件看出来:如果核心js文件大小比上一版本大太多,明显在性能上就会有问题,我们要争做像谷歌、亚马逊这样优秀的团队--能够在功能升级的同时减小核心js文件大小。
以上がHTML5におけるパフォーマンス最適化の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。