国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

頁面性能優(yōu)化辦法有哪些?

raoyi / 1232人閱讀

摘要:那我們?nèi)绾蝺?yōu)化頁面性能,提高頁面加載速度呢這是本文主要要探討的問題,然而性能優(yōu)化是個(gè)綜合性問題,沒有標(biāo)準(zhǔn)答案,想要面面俱到羅列出來,并非易事。三利用瀏覽器緩存對(duì)于應(yīng)用來說,緩存是提升頁面性能同時(shí)減少服務(wù)器壓力的利器。

引子

互聯(lián)網(wǎng)有一項(xiàng)著名的8秒原則。用戶在訪問Web網(wǎng)頁時(shí),如果時(shí)間超過8秒就會(huì)感到不耐煩,如果加載需要太長(zhǎng)時(shí)間,他們就會(huì)放棄訪問。大部分用戶希望網(wǎng)頁能在2秒之內(nèi)就完成加載。事實(shí)上,加載時(shí)間每多1秒,你就會(huì)流失7%的用戶。8秒并不是準(zhǔn)確的8秒鐘,只是向網(wǎng)站開發(fā)者表明了加載時(shí)間的重要性。那我們?nèi)绾蝺?yōu)化頁面性能,提高頁面加載速度呢?這是本文主要要探討的問題,然而性能優(yōu)化是個(gè)綜合性問題,沒有標(biāo)準(zhǔn)答案,想要面面俱到羅列出來,并非易事。

本文只關(guān)注一些核心要點(diǎn),以下是我結(jié)合慕課網(wǎng)課程《Web前端性能優(yōu)化》,總結(jié)性能優(yōu)化常見的辦法:

如果覺得文章對(duì)你有些許幫助,歡迎在我的GitHub博客點(diǎn)贊和關(guān)注,感激不盡!

一、資源壓縮與合并

主要包括這些方面:html壓縮、css 壓縮、js的壓縮和混亂和文件合并
資源壓縮可以從文件中去掉多余的字符,比如回車、空格。你在編輯器中寫代碼的時(shí)候,會(huì)使用縮進(jìn)和注釋,這些方法無疑會(huì)讓你的代碼簡(jiǎn)潔而且易讀,但它們也會(huì)在文檔中添加多余的字節(jié)。

1.html壓縮

html代碼壓縮就是壓縮這些在文本文件中有意義,但是在HTML中不顯示的字符,包括空格,制表符,換行符等,還有一些其他意義的字符,如HTML注釋也可以被壓縮。

如何進(jìn)行html壓縮:

使用在線網(wǎng)站進(jìn)行壓縮(開發(fā)過程中一般不用)

nodejs 提供了html-minifier工具

后端模板引擎渲染壓縮

2.css代碼壓縮:

css代碼壓縮簡(jiǎn)單來說就是無效代碼刪除和css語義合并

如何進(jìn)行css壓縮:

使用在線網(wǎng)站進(jìn)行壓縮(開發(fā)過程中一般不用)

使用html-minifier工具

使用clean-css對(duì)css壓縮

3.js的壓縮和混亂

js的壓縮和混亂主要包括以下這幾部分:

無效字符的刪除

剔除注釋

代碼語義的縮減和優(yōu)化

代碼保護(hù)(代碼邏輯變得混亂,降低代碼的可讀性,這點(diǎn)很重要)

如何進(jìn)行js的壓縮和混亂

使用在線網(wǎng)站進(jìn)行壓縮(開發(fā)過程中一般不用)

使用html-minifier工具

使用uglifyjs2對(duì)js進(jìn)行壓縮

其實(shí)css壓縮與js的壓縮和混亂比html壓縮收益要大得多,同時(shí)css代碼和js代碼比html代碼多得多,通過css壓縮和js壓縮帶來流量的減少,會(huì)非常明顯。所以對(duì)大公司來說,html壓縮可有可無,但css壓縮與js的壓縮和混亂必須要有!

4.文件合并


從上圖可以看出不合并請(qǐng)求有以下缺點(diǎn):

文件與文件之間有插入的上行請(qǐng)求,增加了N-1個(gè)網(wǎng)絡(luò)延遲

受丟包問題影響更嚴(yán)重

keep-alive方式可能會(huì)出現(xiàn)狀況,經(jīng)過代理服務(wù)器時(shí)可能會(huì)被斷開,也就是說不能一直保持keep-alive的狀態(tài)

壓縮合并css和js可以減少網(wǎng)站http請(qǐng)求的次數(shù),但合并文件可能會(huì)帶來問題:首屏渲染和緩存失效問題。那該如何處理這問題呢?----公共庫合并和不同頁面的合并。

如何進(jìn)行文件合并

使用在線網(wǎng)站進(jìn)行文件合并

使用nodejs實(shí)現(xiàn)文件合并(gulp、fis3)

二、非核心代碼異步加載異步加載的方式 1、異步加載的方式

異步加載的三種方式——async和defer、動(dòng)態(tài)腳本創(chuàng)建

① async方式

async屬性是HTML5新增屬性,需要Chrome、FireFox、IE9+瀏覽器支持

async屬性規(guī)定一旦腳本可用,則會(huì)異步執(zhí)行

async屬性僅適用于外部腳本

如果是多個(gè)腳本,該方法不能保證腳本按順序執(zhí)行

② defer方式

兼容所有瀏覽器

defer屬性規(guī)定是否對(duì)腳本執(zhí)行進(jìn)行延遲,直到頁面加載為止

如果是多個(gè)腳本,該方法可以確保所有設(shè)置了defer屬性的腳本按順序執(zhí)行

如果腳本不會(huì)改變文檔的內(nèi)容,可將defer屬性加入到script標(biāo)簽中,以便加快處理文檔的速度

③動(dòng)態(tài)創(chuàng)建script標(biāo)簽
在還沒定義defer和async前,異步加載的方式是動(dòng)態(tài)創(chuàng)建script,通過window.onload方法確保頁面加載完畢再將script標(biāo)簽插入到DOM中,具體代碼如下:

function addScriptTag(src){  
    var script = document.createElement("script");  
    script.setAttribute("type","text/javascript");  
    script.src = src;  
    document.body.appendChild(script);  
}  
window.onload = function(){  
    addScriptTag("js/index.js");  
}  
2、異步加載的區(qū)別

1)defer是在HTML解析完之后才會(huì)執(zhí)行,如果是多個(gè),按照加載的順序依次執(zhí)行

2)async是在加載完之后立即執(zhí)行,如果是多個(gè),執(zhí)行順序和加載順序無關(guān)

其中藍(lán)色線代表網(wǎng)絡(luò)讀取,紅色線代表執(zhí)行時(shí)間,這倆都是針對(duì)腳本的;綠色線代表 HTML 解析。

三、利用瀏覽器緩存

對(duì)于web應(yīng)用來說,緩存是提升頁面性能同時(shí)減少服務(wù)器壓力的利器。

瀏覽器緩存類型

1.強(qiáng)緩存:不會(huì)向服務(wù)器發(fā)送請(qǐng)求,直接從緩存中讀取資源,在chrome控制臺(tái)的network選項(xiàng)中可以看到該請(qǐng)求返回200的狀態(tài)碼,并且size顯示from disk cache或from memory cache;

相關(guān)的header:

Expires :response header里的過期時(shí)間,瀏覽器再次加載資源時(shí),如果在這個(gè)過期時(shí)間內(nèi),則命中強(qiáng)緩存。它的值為一個(gè)絕對(duì)時(shí)間的GMT格式的時(shí)間字符串, 比如Expires:Thu,21 Jan 2018 23:39:02 GMT

Cache-Control :這是一個(gè)相對(duì)時(shí)間,在配置緩存的時(shí)候,以秒為單位,用數(shù)值表示。當(dāng)值設(shè)為max-age=300時(shí),則代表在這個(gè)請(qǐng)求正確返回時(shí)間(瀏覽器也會(huì)記錄下來)的5分鐘內(nèi)再次加載資源,就會(huì)命中強(qiáng)緩存。比如Cache-Control:max-age=300,

簡(jiǎn)單概括:其實(shí)這兩者差別不大,區(qū)別就在于 Expires 是http1.0的產(chǎn)物,Cache-Control是http1.1的產(chǎn)物,兩者同時(shí)存在的話,Cache-Control優(yōu)先級(jí)高于Expires;在某些不支持HTTP1.1的環(huán)境下,Expires就會(huì)發(fā)揮用處。所以Expires其實(shí)是過時(shí)的產(chǎn)物,現(xiàn)階段它的存在只是一種兼容性的寫法。強(qiáng)緩存判斷是否緩存的依據(jù)來自于是否超出某個(gè)時(shí)間或者某個(gè)時(shí)間段,而不關(guān)心服務(wù)器端文件是否已經(jīng)更新,這可能會(huì)導(dǎo)致加載文件不是服務(wù)器端最新的內(nèi)容,那我們?nèi)绾潍@知服務(wù)器端內(nèi)容較客戶端是否已經(jīng)發(fā)生了更新呢?此時(shí)我們需要協(xié)商緩存策略。

2.協(xié)商緩存:向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器會(huì)根據(jù)這個(gè)請(qǐng)求的request header的一些參數(shù)來判斷是否命中協(xié)商緩存,如果命中,則返回304狀態(tài)碼并帶上新的response header通知瀏覽器從緩存中讀取資源;另外協(xié)商緩存需要與cache-control共同使用。

相關(guān)的header:

①Last-Modified和If-Modified-Since:當(dāng)?shù)谝淮握?qǐng)求資源時(shí),服務(wù)器將資源傳遞給客戶端時(shí),會(huì)將資源最后更改的時(shí)間以“Last-Modified: GMT”的形式加在實(shí)體首部上一起返回給客戶端。

Last-Modified: Fri, 22 Jul 2016 01:47:00 GMT

客戶端會(huì)為資源標(biāo)記上該信息,下次再次請(qǐng)求時(shí),會(huì)把該信息附帶在請(qǐng)求報(bào)文中一并帶給服務(wù)器去做檢查,若傳遞的時(shí)間值與服務(wù)器上該資源最終修改時(shí)間是一致的,則說明該資源沒有被修改過,直接返回304狀態(tài)碼,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量 。如果兩個(gè)時(shí)間不一致,則服務(wù)器會(huì)發(fā)回該資源并返回200狀態(tài)碼,和第一次請(qǐng)求時(shí)類似。這樣保證不向客戶端重復(fù)發(fā)出資源,也保證當(dāng)服務(wù)器有變化時(shí),客戶端能夠得到最新的資源。一個(gè)304響應(yīng)比一個(gè)靜態(tài)資源通常小得多,這樣就節(jié)省了網(wǎng)絡(luò)帶寬。

但last-modified 存在一些缺點(diǎn):

Ⅰ.某些服務(wù)端不能獲取精確的修改時(shí)間

Ⅱ.文件修改時(shí)間改了,但文件內(nèi)容卻沒有變

既然根據(jù)文件修改時(shí)間來決定是否緩存尚有不足,能否可以直接根據(jù)文件內(nèi)容是否修改來決定緩存策略?----ETag和If-None-Match

②ETag和If-None-Match:Etag是上一次加載資源時(shí),服務(wù)器返回的response header,是對(duì)該資源的一種唯一標(biāo)識(shí),只要資源有變化,Etag就會(huì)重新生成。瀏覽器在下一次加載資源向服務(wù)器發(fā)送請(qǐng)求時(shí),會(huì)將上一次返回的Etag值放到request header里的If-None-Match里,服務(wù)器只需要比較客戶端傳來的If-None-Match跟自己服務(wù)器上該資源的ETag是否一致,就能很好地判斷資源相對(duì)客戶端而言是否被修改過了。如果服務(wù)器發(fā)現(xiàn)ETag匹配不上,那么直接以常規(guī)GET 200回包形式將新的資源(當(dāng)然也包括了新的ETag)發(fā)給客戶端;如果ETag是一致的,則直接返回304知會(huì)客戶端直接使用本地緩存即可。

兩者之間對(duì)比
首先在精確度上,Etag要優(yōu)于Last-Modified。Last-Modified的時(shí)間單位是秒,如果某個(gè)文件在1秒內(nèi)改變了多次,那么他們的Last-Modified其實(shí)并沒有體現(xiàn)出來修改,但是Etag每次都會(huì)改變確保了精度;如果是負(fù)載均衡的服務(wù)器,各個(gè)服務(wù)器生成的Last-Modified也有可能不一致。
第二在性能上,Etag要遜于Last-Modified,畢竟Last-Modified只需要記錄時(shí)間,而Etag需要服務(wù)器通過算法來計(jì)算出一個(gè)hash值。
第三在優(yōu)先級(jí)上,服務(wù)器校驗(yàn)優(yōu)先考慮Etag

緩存的機(jī)制

強(qiáng)制緩存優(yōu)先于協(xié)商緩存進(jìn)行,若強(qiáng)制緩存(Expires和Cache-Control)生效則直接使用緩存,若不生效則進(jìn)行協(xié)商緩存(Last-Modified / If-Modified-Since和Etag / If-None-Match),協(xié)商緩存由服務(wù)器決定是否使用緩存,若協(xié)商緩存失效,那么代表該請(qǐng)求的緩存失效,重新獲取請(qǐng)求結(jié)果,再存入瀏覽器緩存中;生效則返回304,繼續(xù)使用緩存。主要過程如下:

用戶行為對(duì)瀏覽器緩存的影響

1.地址欄訪問,鏈接跳轉(zhuǎn)是正常用戶行為,將會(huì)觸發(fā)瀏覽器緩存機(jī)制;

2.F5刷新,瀏覽器會(huì)設(shè)置max-age=0,跳過強(qiáng)緩存判斷,會(huì)進(jìn)行協(xié)商緩存判斷;

3.ctrl+F5刷新,跳過強(qiáng)緩存和協(xié)商緩存,直接從服務(wù)器拉取資源。

如果想了解更多緩存機(jī)制,請(qǐng)猛戳 深入理解瀏覽器的緩存機(jī)制

四、使用CDN

大型Web應(yīng)用對(duì)速度的追求并沒有止步于僅僅利用瀏覽器緩存,因?yàn)闉g覽器緩存始終只是為了提升二次訪問的速度,對(duì)于首次訪問的加速,我們需要從網(wǎng)絡(luò)層面進(jìn)行優(yōu)化,最常見的手段就是CDN(Content Delivery Network,內(nèi)容分發(fā)網(wǎng)絡(luò))加速。通過將靜態(tài)資源(例如javascript,css,圖片等等)緩存到離用戶很近的相同網(wǎng)絡(luò)運(yùn)營(yíng)商的CDN節(jié)點(diǎn)上,不但能提升用戶的訪問速度,還能節(jié)省服務(wù)器的帶寬消耗,降低負(fù)載。

CDN是怎么做到加速的呢?

其實(shí)這是CDN服務(wù)商在全國各個(gè)省份部署計(jì)算節(jié)點(diǎn),CDN加速將網(wǎng)站的內(nèi)容緩存在網(wǎng)絡(luò)邊緣,不同地區(qū)的用戶就會(huì)訪問到離自己最近的相同網(wǎng)絡(luò)線路上的CDN節(jié)點(diǎn),當(dāng)請(qǐng)求達(dá)到CDN節(jié)點(diǎn)后,節(jié)點(diǎn)會(huì)判斷自己的內(nèi)容緩存是否有效,如果有效,則立即響應(yīng)緩存內(nèi)容給用戶,從而加快響應(yīng)速度。如果CDN節(jié)點(diǎn)的緩存失效,它會(huì)根據(jù)服務(wù)配置去我們的內(nèi)容源服務(wù)器獲取最新的資源響應(yīng)給用戶,并將內(nèi)容緩存下來以便響應(yīng)給后續(xù)訪問的用戶。因此,一個(gè)地區(qū)內(nèi)只要有一個(gè)用戶先加載資源,在CDN中建立了緩存,該地區(qū)的其他后續(xù)用戶都能因此而受益

五、預(yù)解析DNS

資源預(yù)加載是另一個(gè)性能優(yōu)化技術(shù),我們可以使用該技術(shù)來預(yù)先告知瀏覽器某些資源可能在將來會(huì)被使用到。
通過 DNS 預(yù)解析來告訴瀏覽器未來我們可能從某個(gè)特定的 URL 獲取資源,當(dāng)瀏覽器真正使用到該域中的某個(gè)資源時(shí)就可以盡快地完成 DNS 解析。例如,我們將來可從 example.com 獲取圖片或音頻資源,那么可以在文檔頂部的 標(biāo)簽中加入以下內(nèi)容:


當(dāng)我們從該 URL 請(qǐng)求一個(gè)資源時(shí),就不再需要等待 DNS 的解析過程。該技術(shù)對(duì)使用第三方資源特別有用。通過簡(jiǎn)單的一行代碼就可以告知那些兼容的瀏覽器進(jìn)行 DNS 預(yù)解析,這意味著當(dāng)瀏覽器真正請(qǐng)求該域中的某個(gè)資源時(shí),DNS 的解析就已經(jīng)完成了,從而節(jié)省了寶貴的時(shí)間。
另外需要注意的是,瀏覽器會(huì)對(duì)a標(biāo)簽的href自動(dòng)啟用DNS Prefetching,所以a標(biāo)簽里包含的域名不需要在head中手動(dòng)設(shè)置link。但是在HTTPS下不起作用,需要meta來強(qiáng)制開啟功能。這個(gè)限制的原因是防止竊聽者根據(jù)DNS Prefetching推斷顯示在HTTPS頁面中超鏈接的主機(jī)名。下面這句話作用是強(qiáng)制打開a標(biāo)簽域名解析

給大家推薦一個(gè)好用的BUG監(jiān)控工具Fundebug,歡迎免費(fèi)試用!

參考文章

Web前端性能優(yōu)化

前端性能優(yōu)化 - 資源預(yù)加載

前端工程之CDN部署

【第887期】瀏覽器的緩存機(jī)制小結(jié)

徹底理解瀏覽器的緩存機(jī)制

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/53116.html

相關(guān)文章

  • 頁面性能優(yōu)化辦法哪些

    摘要:那我們?nèi)绾蝺?yōu)化頁面性能,提高頁面加載速度呢這是本文主要要探討的問題,然而性能優(yōu)化是個(gè)綜合性問題,沒有標(biāo)準(zhǔn)答案,想要面面俱到羅列出來,并非易事。三利用瀏覽器緩存對(duì)于應(yīng)用來說,緩存是提升頁面性能同時(shí)減少服務(wù)器壓力的利器。 引子 互聯(lián)網(wǎng)有一項(xiàng)著名的8秒原則。用戶在訪問Web網(wǎng)頁時(shí),如果時(shí)間超過8秒就會(huì)感到不耐煩,如果加載需要太長(zhǎng)時(shí)間,他們就會(huì)放棄訪問。大部分用戶希望網(wǎng)頁能在2秒之內(nèi)就完成加載...

    MageekChiu 評(píng)論0 收藏0
  • 頁面性能優(yōu)化辦法哪些

    摘要:那我們?nèi)绾蝺?yōu)化頁面性能,提高頁面加載速度呢這是本文主要要探討的問題,然而性能優(yōu)化是個(gè)綜合性問題,沒有標(biāo)準(zhǔn)答案,想要面面俱到羅列出來,并非易事。三利用瀏覽器緩存對(duì)于應(yīng)用來說,緩存是提升頁面性能同時(shí)減少服務(wù)器壓力的利器。 引子 互聯(lián)網(wǎng)有一項(xiàng)著名的8秒原則。用戶在訪問Web網(wǎng)頁時(shí),如果時(shí)間超過8秒就會(huì)感到不耐煩,如果加載需要太長(zhǎng)時(shí)間,他們就會(huì)放棄訪問。大部分用戶希望網(wǎng)頁能在2秒之內(nèi)就完成加載...

    rockswang 評(píng)論0 收藏0
  • 頁面性能優(yōu)化辦法哪些

    摘要:本文只關(guān)注一些核心要點(diǎn),以下是我總結(jié)性能優(yōu)化常見的辦法一資源壓縮與合并主要包括這些方面壓縮壓縮的壓縮和混亂和文件合并。摘要: 性能是最重要的用戶體驗(yàn)之一。 作者:浪里行舟 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 引子 互聯(lián)網(wǎng)有一項(xiàng)著名的8秒原則。用戶在訪問Web網(wǎng)頁時(shí),如果時(shí)間超過8秒就會(huì)感到不耐煩,如果加載需要太長(zhǎng)時(shí)間,他們就會(huì)放棄訪問。大部分用戶希望網(wǎng)頁能在2秒之內(nèi)就完成加...

    mingzhong 評(píng)論0 收藏0
  • 前端面試題大集合:來自真實(shí)大廠的532道面試題(只題,沒答案)

    答案自己谷歌或百度找。 一、來源背景 面試題是來自微博@牛客網(wǎng)發(fā)布的真實(shí)大廠前端面經(jīng)題目,我一直在收集題目長(zhǎng)期一個(gè)一個(gè)的記錄下來的,可能會(huì)有重復(fù),但基本前端的面試大綱和需要掌握的知識(shí)都在其中了,面試題僅做學(xué)習(xí)參考,學(xué)習(xí)者閱后也要用心鉆研其中的原理,重要知識(shí)需要系統(tǒng)學(xué)習(xí)、透徹學(xué)習(xí),形成自己的知識(shí)鏈。 二、532道前端真實(shí)大廠面試題 express和koa的對(duì)比,兩者中間件的原理,koa捕獲異常多種情...

    Kerr1Gan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

raoyi

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<