目次
HTML5 パフォーマンスの最適化
ホームページ ウェブフロントエンド htmlチュートリアル HTML5 パフォーマンスの最適化_html/css_WEB-ITnose

HTML5 パフォーマンスの最適化_html/css_WEB-ITnose

Jun 24, 2016 am 11:24 AM

HTML5 パフォーマンスの最適化

これら 2 つの章を読んだ後、私はまだ満足できなかったので、インターネットで「Java Web High Performance」というキーワードを検索したところ、IBM コミュニティで 2 つの良い記事を見つけました。さらに驚くべきことは、これら 2 つの記事の内容が「ハイパフォーマンス HTML5」の最初の 2 章と非常に似ていることがわかりました。その信憑性は以下に添付されています。 。

-lo-javawebhiperf1/

http://www.ibm.com/developerworks/ cn/java/j-lo-javawebhiperf2/

前は读後感、下は我针对最近几天学习到的上昇Web パフォーマンス私は、第一に初心者に役立つように、第二に自分自身でメモを取り、記憶を深めるために、長い要約を作成しました。

パフォーマンス フロントエンド

  • -- 再描画の削減
  • HTML ページが表示された後、ページ要素を動的に変更したり、CSS スタイルを調整したりするとブラウザの再描画が発生し、パフォーマンスの低下は、動的に変更されるスコープ: 要素の色など​​の情報のみを変更した場合は、要素のみが再描画されます。ノードを追加または削除したり、ノードの位置を調整したりすると、その兄弟ノードも再描画されます。

    再描画を減らすということは、再描画しないということではなく、再描画範囲に注意することです。 ① DOM 要素の変更が深くなるほど影響が小さくなるため、より深いノード変更を行うようにしてください。 ② 複数の変更をマージしてみてください。いくつかの DOM スタイルを一緒に変更します。

    例として、 タグの背景色、幅、色を変更してみましょう。

    <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 レンダリングに必要な要素であるため、 ヘッダーに配置する必要があります。読み込みのブロックを避けるために、スクリプトはドキュメントの最後に配置し、CSS は先頭に配置する必要があります。

    <head><link rel="stylesheet" href="common.css">......<script src="example.js"></script></body>
    ログイン後にコピー

    -- ノードの深いレベルのネストを避ける

    深くネストされたノードは、初期化と構築中により多くのメモリを必要とする傾向があり、ノードを通過するときに遅くなります。ブラウザのDOM ドキュメントを構築するためのメカニズム。ブラウザは、HTML ドキュメント全体の構造を DOM の「ツリー」構造として保存します。ドキュメントノードのネストレベルが深くなると、構築される DOM ツリーのレベルも深くなります。

    次のコードは、
    または タグの 1 つを完全に削除できます。

    <div>  <span>    <label>嵌套</label>  </span></div>
    ログイン後にコピー

    ページキャッシュ


    通常、キャッシュを設定しないと、ページが更新されるたびにサーバーのファイルが再読み込みされますが、キャッシュを設定すると、すべてのファイルをローカルで取得できます。明らかにページ効率の向上に大きな問題があります。

    ページ ヘッダーで Expires を設定することでページの有効期限を定義でき、有効期限をより長く設定して「永続的な」キャッシュを実現できます。もちろん、プロジェクトのコードが変更された場合、クライアントはファイルをキャッシュするため、最新のファイルを取得できなくなり、必然的に表示エラーが発生します。この問題の解決策は、リンクされたファイルにタイムスタンプを追加することです。タイムスタンプが変更されると、ブラウザはそれが新しいファイルであると認識し、サーバーに最新のファイルを要求します。

    <meta http-equiv="expires" content="Sunday 26 October 2099 01:00 GMT" />
    ログイン後にコピー

    マージされたファイルを圧縮する

    JavaScript ファイル、CSS ファイル、画像ファイルなど、リクエスト データに関連するすべてのファイル、特に高解像度の要件がない場合は、可能な限り圧縮する必要があります。圧縮して再利用できます。大量の小さな容量のファイルの数は、小さなサイズのファイルの数よりも高速であるため、場合によっては、複数の JS ファイルと複数の CSS ファイルを一緒にマージすることを検討できます。

    HTML文書のサイズを小さくする以外にも、次のような方法もあります。


    ①HTM文書の実行結果に影響を与えないスペース、空行、コメントを削除する ②テーブルレイアウトを避ける

    ③使用HTML5

    --HTML+CSS3+Javascript各司其职

    让三元素各司其职才能做出高性能的网页:HTML是页面之本也是内容之源,有了它就能跟CSS和Javascript交互;CSS3可以说是展现大师,而且日渐强大的CSS能代替Javascript做很多动态的事情如渐变、移动等动态效果;Javascript是动态数据之王,旧浏览器依靠js来完成动态效果展现,但现在的CSS也能完成js的工作,所以尽量将工作交给css,这样会获得更好的性能。(这个说得有点大)

    --图像合并实现CSS Sprites

    图像合并其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS 的“background-image”,“background- repeat”,“background-position”的组合进行背景定位,background-position可以用数字能精确的定位出背景图片的位置。

    一个页面要用到多个图标,完全可以将多个图标合并成一个图,然后只需要发一次图片请求,通过css定位分割图标即可。

    --避免使用Iframe

    使用iframe并不会增加同域名下的并行下载数,浏览器对同域名的连接总是共享浏览器级别的连接池,在页面加载过程中iframe元素还会阻塞父文档onload事件的触发。并且iframe是html标签中最消耗资源的标签,它的开销比DIV、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个差不多),多了可能造成不同服务器连接时间差异,反而影响速度。

    --避免空链接属性

    这样的设置方式是非常不可取的,即使链接为空,在旧的浏览器也会以固定步骤发送请求信息。

    另外也不可取,最好的方式是在链接中加一个空的js代码

    --使用图像的BASE64编码

    base64是一串字符串,他可以代表一个图片的所有信息,也就是可以通过(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也不会报错只会直接忽略)。

    <div class="someClass"></div> .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机制

    当一个页面非常大,内容非常多,可以采用flush的形式分部分返回给页面,这样能告诉用户我正在工作,显示一部分内容比白屏等很长时间要好得多。在Java Web技术中,实现Flush非常简单,只要调用 HttpServletResponse.getWriter输出流的flush方法,就可以将已经完成加载的内容写回给客户端。

    这种方式只适用于返回数据特别多、请求时间特别长的情况,常规数据还是用正常的实时全部返回最佳。这种实现方式实际会增加浏览器渲染时间和用户整体等待时间,但从用户体验上会更加优秀。

  • 性能之服务器优化
  • --CDN机制

    所谓的CDN,就是一种内容分发网络,它采用智能路由和流量管理技术,及时发现能够给访问者提供最快响应的加速节点,并将访问者的请求导向到该加速节点,由该加速节点提供内容服务。

    通俗点说,你在成都(浏览器)购买了北京卖家(服务器)的产品,北京卖家通过快递(CDN服务)寄送包裹,从北京到成都可以走路、坐汽车、火车或飞机,而采用CND的快递会选择飞机直达,因为这种寄送方式最快。

    当然使用CDN有两个注意事项:

    1、CDN加速服务很贵,如果你觉得你的网站值得加速,可以选择购买;

    2、CDN不适合局域性网站,比如你的网站只有某一个片区访问或者局域网访问,因为区域性网络本来就很近,无需CDN加速。

    --HTTP协议的合理使用

    浏览器缓存带来的性能提升已经众人皆知了,而很多人却并不知道浏览器的缓存过期时间、缓存删除、什么页面可以缓存等,都可以由我们程序员来控制,只要您熟悉HTTP协议,就可以轻松的控制浏览器。

    扩展阅读:深入理解HTTP协议

    --动静分离

    所谓的动静分离,就是将Web应用程序中静态和动态的内容分别放在不同的Web服务器上,有针对性的处理动态和静态内容,从而达到性能的提升。我们知道如果一个HTML有多个域名请求数据文件会提高

    Tomcat服务器在处理静态和并发问题上比较弱,所以事先动静分离的方式一般会用Apache+Tomcat、Nginx+Tomcat等。

    以Apache+Tomcat为例,其运行机理是:页面请求首先给Apache,然后Apache分析请求信息是静态还是动态,静态则本机处理,动态则交给Tomcat做处理。

    这其实是负载均衡的雏形,这样的实现不用让开发人员做任何特殊开发,一个交给服务器即可,至于这个文件是从Apache还是从Tomcat取得,开发人员完全无需关注。

    --HTTP持久连接

    持久连接(Keep-Alive)也叫做长连接,它是一种TCP的连接方式,连接会被浏览器和服务器所缓存,在下次连接同一服务器时,缓存的连接被重新使用。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文件大小。

     

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    HTMLは初心者のために簡単に学ぶことができますか? HTMLは初心者のために簡単に学ぶことができますか? Apr 07, 2025 am 12:11 AM

    HTMLは、簡単に学習しやすく、結果をすばやく見ることができるため、初心者に適しています。 1)HTMLの学習曲線はスムーズで簡単に開始できます。 2)基本タグをマスターして、Webページの作成を開始します。 3)柔軟性が高く、CSSおよびJavaScriptと組み合わせて使用​​できます。 4)豊富な学習リソースと最新のツールは、学習プロセスをサポートしています。

    HTML、CSS、およびJavaScriptの役割:コアの責任 HTML、CSS、およびJavaScriptの役割:コアの責任 Apr 08, 2025 pm 07:05 PM

    HTMLはWeb構造を定義し、CSSはスタイルとレイアウトを担当し、JavaScriptは動的な相互作用を提供します。 3人はWeb開発で職務を遂行し、共同でカラフルなWebサイトを構築します。

    HTMLでの開始タグの例は何ですか? HTMLでの開始タグの例は何ですか? Apr 06, 2025 am 12:04 AM

    Anexampleapalofastartingtaginhtmlis、それはaperginsaparagraph.startingtagsaresentionentientiontheyinitiateelements、definetheirtypes、およびarecrucialforurturingwebpagesandcontingthomedomを構築します。

    HTML、CSS、およびJavaScriptの理解:初心者向けガイド HTML、CSS、およびJavaScriptの理解:初心者向けガイド Apr 12, 2025 am 12:02 AM

    webdevelopmentReliesOnhtml、css、andjavascript:1)htmlStructuresContent、2)cssStylesit、および3)Javascriptaddsinteractivity、形成、

    Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Apr 04, 2025 pm 11:54 PM

    GiteEpages静的Webサイトの展開が失敗しました:404エラーのトラブルシューティングと解像度Giteeを使用する

    WebアノテーションにY軸位置の適応レイアウトを実装する方法は? WebアノテーションにY軸位置の適応レイアウトを実装する方法は? Apr 04, 2025 pm 11:30 PM

    Y軸位置Webアノテーション機能の適応アルゴリズムこの記事では、単語文書と同様の注釈関数、特に注釈間の間隔を扱う方法を実装する方法を探ります...

    CSS3とJavaScriptを使用して、クリック後に周囲の写真を散乱および拡大する効果を実現する方法は? CSS3とJavaScriptを使用して、クリック後に周囲の写真を散乱および拡大する効果を実現する方法は? Apr 05, 2025 am 06:15 AM

    画像をクリックした後、散乱と周囲の画像を拡大する効果を実現するには、多くのWebデザインがインタラクティブな効果を実現する必要があります。特定の画像をクリックして周囲を作成してください...

    Routerフォルダーの下のindex.jsファイルでvue.use(vuerouter)を呼び出す必要があるのはなぜですか? Routerフォルダーの下のindex.jsファイルでvue.use(vuerouter)を呼び出す必要があるのはなぜですか? Apr 05, 2025 pm 01:03 PM

    Vueアプリケーションを開発するときに、ルーターフォルダーの下にindex.jsファイルにvuerouterを登録する必要性があるため、ルーティング構成で問題が発生することがよくあります。特別...

    See all articles