日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web性能优化:What? Why? How?

發布時間:2025/4/5 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web性能优化:What? Why? How? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么要提升web性能?

Web性能黃金準則:只有10%~20%的最終用戶響應時間花在了下載html文檔上,其余的80%~90%時間花在了下載頁面組件上。

  web性能對于用戶體驗有及其重要的影響,根據著名的`2-5-8`原則:

  • 當用戶在2秒以內得到響應,會感覺系統的響應非常快
  • 當用戶在2-5秒之內得到響應,會感覺系統的響應速度還可以
  • 當用戶在5-8秒之內得到響應,會感覺系統的響應非常慢,但還可以接受
  • 當用戶在8秒之后都沒有得到響應,會感覺系統糟透了,甚至系統已經掛掉;要么打開競爭對手的網站,要么重新發起第二次請求

  凡事都需要研究,通過科學的研究我們就可以找到事物的發展規律。這里要感謝雅虎的工程師總結的14條前端優化法則,使得我們可以站在巨人的肩膀上。《高性能網站建設》這本書中的14條優化原則,總結起來主要是以下個方面的優化:

  • 減少HTTP請求
  • 頁面內部優化
  • 啟用緩存
  • 減少下載量
  • 網絡連接上的優化
  •   

    為什么減少HTTP請求可以提高Web性能?

      要回答這個問題,我們就要了解當瀏覽器向服務器發送一個http請求知道獲取數據都經歷哪些過程:

      開啟一個鏈接(tcp/ip的三次握手過程)?-》?發送請求?-》?等待(網絡延遲跟服務器的處理時間)-》?下載數據

      我們看一下百度首頁中的http請求在各階段耗費的時間,上面不同的顏色代表下圖中的不同階段

    ?

      可以看到除了圖片之外,其余大部分http請求的事件花在了建立連接與等待階段。

      http協議建立在TIC/IP協議之上,在TCP/IP協議中,TCP協議提供可靠的連接服務,采用三次握手建立一個連接。 簡單來說三次握手就是一個身份確認的過程:

      (第一次握手:主機A發送位碼為syn=1,隨機產生seq number=1234567的數據包到服務器,主機B由SYN=1知道,A要求建立聯機;)

    晴兒:你是瀟哥哥嗎,我是晴兒

      (第二次握手:主機B收到請求后要確認聯機信息,向A發送ack number=(主機A的seq+1),syn=1,ack=1,隨機產生seq=7654321的包)

    瀟劍:這貨是誰,一簫一劍走江湖,下一句是什么?

      (第三次握手:主機A收到后檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到后確認seq值與ack=1則連接建立成功。)

    晴兒:這首詩。。。你真的是瀟哥哥,一蕭一劍走江湖,千古情愁酒一回。。。

    瀟劍:晴兒,你真的是晴兒。。。。

    (啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪。。。。。。。。。。。。)

      言歸正傳,這個過程也是需要消耗時間的,在百度首頁找到一個極端的例子:

      而等待的時間通常也大于內容下載的時間,這里同樣找到一個極端例子:

      由此我們可以得出結論:一個http請求絕大多數的時間消耗在了建立連接跟等待的時間,優化的方法是減少http請求。

    ?

    如何提高web性能?

      1、減少HTTP請求

      一般來說要減少http請求通常從兩個方面下手:減少圖片的請求、減少腳本文件與樣式表的請求

      圖片的減少通常有兩種方式:css sprites、內聯圖片、IconFont。

      CSS Sprites:將多張圖片合并成一幅單獨的圖片,使用css的background-position屬性,將html元素的背景圖片放到sprites 圖片中的期望位置上。使用這項技術的附加優點是他降低了下載量,合并后的圖片比分離的圖片和更小,因為它降低了圖片自身的開銷(顏色表、格式信息等等)。實際項目中css sprites是一項體力活,因為開發過程中需要對這張大圖進行維護(添加、減少圖片),張鑫旭同學的文章中有介紹如何管理sprites圖片可以作為參考(這里)。如果需要在頁面中為背景、鏈接、導航欄提供大量的圖片,css sprites絕對是一種優秀的解決方案(干凈的標簽、較少的圖片、較短的響應時間)。

      內聯圖片:通過使用data:URL模式可以再頁面中包含圖片而無需任何額外的請求。缺點就是IE8以下的瀏覽器不支持這種方式,而IE8在數據大小上有限制,只能支持23kb以內的數據。對于較小的圖片來說可以直接內聯到web頁面中,但對于大圖片內聯到頁面里會導致頁面變大,聰明的做法是使用css,將內聯的圖片作為背景使用,并放到外部樣式表中,這意味著數據可以緩存在樣式表內部。使用外部樣式表雖然增加了一個http請求,但樣式可以被瀏覽器緩存,得到額外的收獲。另外一點需要注意:base64是有損壓縮。

      IconFont:圖標字體,這是近年來新流行的一種以字體代替圖片的技術。它可以適應任何分辨率而不會出現圖片模糊問題,與圖片相比它具有更小的容量,更高的靈活性(像字體一樣可以設置圖標大小、顏色、透明度、hover狀態、反轉等),IE8以上的瀏覽器都支持該技術。在使用IconFont之前,你首先要確定你選則的字體庫是否是收費。詳細內容可以參考這篇文章:圖標字體化淺談

      減少腳本與樣式表的請求主要原則就是合并。在實際開發中我們遵循模塊化的原則將代碼分散到許多小文件中,按照軟件開發的原則這是完全正確的,但對于上線頁面來說,每一個文件都會產生一個http請求,嚴重影響性能。和css sprites一樣,將這些小文件合并到一個文件中,可以減少http請求的數量并縮短最終用戶響應時間。在合并過程中我們還需要使用工具精簡(移除不必要的字符以減小文件大小縮減下載時間)和混淆(除了移除不必要字符外,還會改寫源代碼,比如函數和變量名使用更短的標量名)Javascript代碼。對于采用AMD或CMD進行模塊化開發的同學,在合并過程中通常會將依賴的其他模塊打包到一個文件中,而模板html通常以字符串的方式內聯到Javascript文件中。目前最常用的前端構建工具就是glup,這里有一篇初步應用的文章:前端 | gulp 打包 require.js 模塊依賴

      

      2、頁面內部優化

      關于頁面內部優化主要方向:樣式表放在頂部、腳本文件放在底部、避免css表達式、把腳本的樣式表放在外部、移除重復腳本

      關心性能的工程師都希望頁面能否盡快的展現在用戶面前,對于頁面中很多內容的頁面我們都希望內容能夠逐步加載,為用戶提供可視化回饋。而將樣式表放在底部會導致瀏覽器阻止內容逐步呈現。為避免當頁面變化時重繪頁面元素,瀏覽器會阻塞頁面呈現,直到樣式表解析完畢(詳細內容可以查看我的這篇博客)。所以如果將樣式表放在頂部并不會減少資源的加載時間,它減少的是頁面的呈現時間。小米主頁曾經犯過這樣的錯誤:

      將樣式表放在底部會阻塞頁面的逐步呈現,而將script文件放在頁面頂部同樣會阻塞頁面的逐步呈現。script元素會阻塞后續內容的解析,因為script中可以同過document.write來更改頁面。解決的辦法就是將script標簽放在頁面底部。這樣既可以讓內容逐步呈現,也可以提高下載的并行度。如果我們確定不需要document.write那可以為script標簽加上asyn屬性(Ie中要加上defer)提高并行下載度。

      CSS表達式是ie支持的可以用來動態更改css屬性的一種方式,我們不需要了解太多,她的書寫方式如下,一旦在產品中發現expression關鍵字就要徹底消滅。

      

      使用外部腳本和樣式這一條,我想凡是有點經驗的工程師都會這么干。

      移除重復腳本:這條說的主要是避免在頁面中多次加入同一份Javascript代碼,如果我們的開發中有依賴管理的方式比如AMD、CMD,基本不會出現這種情況。

    ?

      3、啟用緩存

      關于緩存的使用這里介紹兩套方案:expires/If-Modified-Since、Cache-Control/Etag;前者是HTTP1.0中的緩存方案,后者是HTTP1.1中緩存方案,若http頭部中同時出現二者,后者的優先級更高。

      If-modified-since的方式通常被稱為條件Get。瀏覽器緩存中保存了一個文件的副本,但需要向服務器詢問此副本是否可用。If-Modified-Since是瀏覽器將最后修改時間發送給服務器,服務器相應頭中Last-Modified進行對比;若If-Modified-Since = Last-Modified 則瀏覽器讀取本地副本。此時響應狀態為304 Not Modified, 并不在發送響應體。

      Expries:雖然使用條件GET和304響應能夠節省時間,但瀏覽器跟服務器端仍然要發送一次請求進行確認。通過明確設置副本的過期時間可以避免條件GET。當瀏覽器發現響應頭中的expires時,會將過期時間和文件一起保存到緩存中去。在過期之前一直從緩存中讀取。expires頭使用一個特定的時間來指定緩存的有效期,他要求瀏覽器與服務器時間完全一致。而且一旦過期,服務器端配置中需要重新設頂一個過期時間。

      ETag(實體標簽):是服務器用于檢查瀏覽器緩存有效性的一種機制。ETag在HTTP1.1中引入,ETag是唯一標識了一個組件的一個特定版本的字符串。唯一的格式約束是這個字符串必須使用雙引號。如果瀏覽器要驗證一個組件是否有效他會使用If-None-Match將etag字符串傳送給服務器。如果ETag是匹配的,服務器端會返回304.(如果實體數據需要根據User-Agent或Accept-Language來改變時,ETag提供了更高的靈活性)。對于使用服務器集群的網站來說,從一臺服務器到另一臺服務器,ETag通常是無法匹配的。這是ETag的問題。而且即便同時使用If-Modified-Since和If-None-Match也并不能達到預期效果。解決方法總是有的:自定義Etag格式

      

      Cache-Control:HTTP1.1引入了來代替Expires,它使用max-age指令來指定副本被緩存多久,該指令以秒為單位定義了一個更新窗,組件從被請求開始到現在的秒數小于設定值,則一直使用副本。避免了一次http請求。相比Expries,Cache-Control指令提供了更細粒度的控制。詳細內容請看大額同學的文章:透過瀏覽器看HTTP緩存

    ?

      4、減少下載量

      減少下載量最有效的方式就是開啟gzip壓縮,gzip是GNU開發的一種免費格式。壓縮組件通過減小http響應的大小來加快響應速度。HTTP1.1通過使用Accept-Encoding來標識支持的壓縮,如果服務器看到這個標識,會使用請求頭中的一種方式來壓縮響應。并通過Content-Encoding來通知web客戶端。很多網站會壓縮html文件,實際上包括xml跟json在內的任何文本都可以壓縮,但圖片和pdf不應該壓縮。根據經驗通常可以對大于1kb或2kb的文件進行壓縮。壓縮通常能將響應的數據量減少70%。壓縮的成本在于:服務器需要耗費額外的cpu進行壓縮,客戶端需要解壓縮。所以需要在cpu的消耗和數據塊的大小之間進行取舍。

    ?

      5、優化網絡連接

      網絡連接的優化主要有三個規則:使用CDN加速、減少DNS查找、避免重定向

      CDN:CDN是地理上分布的web server的集合,用于更高效地發布內容。通常基于網絡遠近來選擇給具體用戶服務的web server。?這縮短了資源的傳輸響應時間,有效提高web性能。

      DNS用于映射主機名和IP地址,一般一次解析需要20~120毫秒。瀏覽器會首先根據頁面的主機名進行域名解析,在有ISP返回結果之前頁面不會加載任何內容,所以減少DNS查找可以有效降低等待時間。為達到更高的性能,DNS解析通常被多級別地緩存,如由ISP或局域網維護的caching server,本地機器操作系統的緩存(如windows上的DNS Client Service),瀏覽器。IE的缺省DNS緩存時間為30分鐘,Firefox的缺省緩沖時間是1分鐘。?我們能做的是盡量減少一個頁面的主機名,但要在瀏覽器最大并行下載數跟dns查找之間做權衡。根據雅虎的研究,最好將主機名控制在2-4個內。

      重定向:將一個URL重新路由到另一個URL。重定向功能是通過301和302這兩個HTTP狀態碼完成的,如:?
       HTTP/1.1 301 Moved Permanently?
       Location: http://example.com/newuri?
       Content-Type: text/html?

      瀏覽器自動重定向請求到Location指定的URL上,重定向的主要問題是降低了用戶體驗。?種最耗費資源、經常發生而很容易被忽視的重定向是URL的最后缺少/,導致自動產生結尾斜線的原因是,瀏覽器在進行get請求是必須指定一些路徑;如果沒有路徑它就會簡單的使用文檔根。(主機缺少結尾斜線是不會發生重定向:http://www.baidu.com)缺少結尾斜線發生重定向是很多web服務器的默認行為。需要在服務器端設置方可消除。以下圖片是豆瓣的一個url請求:

    ?

      雅虎的14條優化規則在很長的一段時間里發揮著重要作用,隨著技術的發展,單單這十四條原則已經不能夠滿足前端性能優化。在一些大公司出現了前端工程化這一概念,詳細內容可以參考一下這篇文章:前端性能優化工程化進階

      參考資料:

    web前端性能意思、關注重點、測試方案、

    WEB站點性能優化實踐(加載速度提升2s)

    HTTP協議三次握手過程

    高性能WEB開發 - 為什么要減少請求數,如何減少請求數!

    我是如何對網站CSS進行架構的

    圖標字體化淺談

    利用ETag緩存優化請求

    透過瀏覽器看HTTP緩存

    Web應用性能優化黃金法則——轉

    ?

    轉載于:https://www.cnblogs.com/zxh930508/p/5492517.html

    總結

    以上是生活随笔為你收集整理的Web性能优化:What? Why? How?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日日人人| 国产精品一区二区三区免费观看 | 欧美字幕| 男人添女人下部高潮全视频 | 四虎最新站名点击进入 | av成人动漫 | 美人被强行糟蹋np各种play | aⅴ天堂网 | 久久99精品久久久久久 | 欧美乱做爰xxxⅹ久久久 | 亚洲综合日韩 | 黄页av | 激情亚洲视频 | 精品无码国产一区二区三区51安 | 国产外围在线 | 小辣椒福利视频导航 | 国产一级视频在线 | 亚洲一级视频在线观看 | 亚洲精品成人片在线观看精品字幕 | 强乱中文字幕av一区乱码 | 成人在线国产精品 | 在线观看sm | 老司机深夜网站 | 动漫美女放屁 | 成人做爰9片免费视频 | 美国免费高清电影在线观看 | 色中色av| 日本黄页视频 | 久久久久久久亚洲av无码 | 视频在线观看网站免费 | 日本在线精品 | 中文字幕十一区 | www.黄色网址 | 人人澡人人澡人人 | 中文资源在线播放 | 欧美色亚洲 | 欧洲亚洲自拍 | 欧美大片视频在线观看 | 91麻豆精品国产理伦片在线观看 | 成人精品一区二区三区中文字幕 | 日本三级中文 | 四虎影院在线免费播放 | 精品久久久久久中文字幕 | 欧美在线观看视频一区 | 观看av在线 | 热热色原网址 | 亚洲男女av | 老狼影院伦理片 | 中文在线8资源库 | 成人av影院在线观看 | 久久精品久久99 | 久久精品九九 | 亚洲天堂影院 | 色七七网站 | 亚洲一区在线观 | 狠狠操2019 | 国产一久久| 国偷自产视频一区二区久 | 亚洲精品入口 | 亚洲高清免费观看 | 久久狠狠爱 | 噼里啪啦国语版在线观看 | 日b影院| 色日韩| 国产原创精品 | 成年人网站免费在线观看 | 久久久777 | 国产成人av在线播放 | 国精产品一二三区精华液 | 日韩欧美亚洲精品 | 国产露脸91国语对白 | 国产suv精品一区二区 | 校园激情亚洲 | 鲁一鲁一鲁一鲁一av | 一区久久 | a级片在线免费看 | 99爱精品视频 | 中文字幕乱码一区 | 男女黄床上色视频 | 国产福利一区在线 | 伦乱天堂 | 加勒比综合| 成人毛片18女人 | 超碰免费在线观看 | 法国空姐在线观看免费 | 韩日成人| 国产一二三区在线 | 爱爱福利社 | 国产女人18水真多18精品一级做 | 亚洲精品~无码抽插 | 嫩草社区 | 牛牛在线视频 | 综合 欧美 亚洲日本 | 免费欧美一级视频 | 欧美日韩久久久久久 | 黄色一级免费网站 | 图片一区二区 | 黄色片一区二区 | 成人午夜又粗又硬又大 |