編程學(xué)習(xí)網(wǎng) > WEB開發(fā) > 網(wǎng)站運(yùn)營 > 提高網(wǎng)站加載速度的解決方案有多少(下)
2016
01-12

提高網(wǎng)站加載速度的解決方案有多少(下)

網(wǎng)站加載速度優(yōu)化

在方案上中我介紹了一些常見的網(wǎng)站加載速度優(yōu)化方案,今天看了一下幾個(gè)帖子的回復(fù),有人說只要在頁面不放上大圖片就OK,看起來這句話是理所當(dāng)然的,其實(shí)并非如此,圖片對于整體頁面加載速度的影響是有區(qū)分的,大家看看下面一張圖:

網(wǎng)站加載速度優(yōu)化

 

這是我的博客中幾張img圖片加載情況,可以看到雖然延遲了onload的時(shí)間,但是絲毫不影響domcontentloaded事件發(fā)生,這是因?yàn)闉g覽器一般只對css中的圖片進(jìn)行阻塞,只有在css文件(包括background-image)全部加載完才會開始解析頁面,html中的img對此影響并不是特別的大,僅僅只是縮小圖片就認(rèn)為降低了頁面的加載速度并不是一個(gè)合理的說法,希望能對前面留言的朋友有幫助。接著上次說到的幾個(gè)加載速度優(yōu)化方法,我們再來看看剩下的幾點(diǎn):

js放在頁面尾部。幾乎在所有的html教程中都說,將javascript外部文件引入在head中,其實(shí)這并不是一個(gè)完美的解決方案,雖然如今的大多數(shù)瀏覽器在下載css/js時(shí)是并行的,但還是不能忽略瀏覽器是單線程運(yùn)行js的,這也就意味著一個(gè)js文件在被解析的同時(shí)瀏覽器不能對任何事件做出響應(yīng),直到瀏覽器弄明白這個(gè)js是干什么的才會轉(zhuǎn)向下一個(gè)js文件,可想而知的是,如果在head中放入大量的javascript就會嚴(yán)重拖慢網(wǎng)站速度甚至造成假死。現(xiàn)在的問題是,為什么放在尾部就會加載更快呢?其實(shí)下載與解析的速度仍舊是相同的,只是瀏覽器優(yōu)先下載了html/css等文件,這樣會給用戶一些錯(cuò)覺,認(rèn)為網(wǎng)站已經(jīng)加載完,從而達(dá)到更好的用戶體驗(yàn)。
更深入地優(yōu)化js。將js放在頁面底部看起來是一個(gè)不錯(cuò)的辦法,但仍舊沒有實(shí)際解決問題,這里提供一個(gè)目前使用廣泛的非阻塞方法:

方法一

document.write(“外部js加載字符串”);//需要在dom結(jié)構(gòu)渲染完畢之前讀取到document.write,這也就是很多教程不推薦大家頻繁的使用document.write的原因之一

方法二

function loadScript(url, callback){  var script = document.createElement_x("script")//創(chuàng)建一個(gè)節(jié)點(diǎn)  script.type = "text/javascript";//設(shè)置屬性  if (script.readyState){  //IE  script.onreadystatechange = function(){  if (script.readyState == "loaded" ||  script.readyState == "complete"){  script.onreadystatechange = null;  callback();  }  };  } else {  //Others  script.onload = function(){  callback();  };  }  script.src = url;  document.body.appendChild(script);//添加新節(jié)點(diǎn)  }

這是目前使用廣發(fā)的添加節(jié)點(diǎn)法,除了一個(gè)判斷ie之外沒有什么新東西,如果要做的更好,甚至可以先判斷時(shí)間再進(jìn)行執(zhí)行函數(shù)。除此之外還有不少其他非阻塞加載方法,例如根據(jù)時(shí)間詢問事件的可用性然后加載,defer加載等等,涉及篇幅就不逐一講解。

減少DNS解析與重定向。一個(gè)頁面中如果頻繁出現(xiàn)向其他域名請求數(shù)據(jù),而且使用的是域名,則會出現(xiàn)頻繁的DNS解析,雖然dns解析速度很快,但當(dāng)整體的請求較多時(shí)就會明顯拖慢加載速度。推薦大家盡量將各種文件下載到服務(wù)端進(jìn)行加載,在減少dns解析時(shí)間的同時(shí)也保證了安全性。重定向則是一個(gè)老生常談的問題,http://wittsay.cc會重定向到http://wittsay.cc/,這么說大家都懂了吧。
錯(cuò)誤請求。這是最容易解決的問題,保證代碼的規(guī)范性避免404頁面,保證每個(gè)資源能夠正常加載,同時(shí)刪除無屬性的src/href,因?yàn)榧幢銢]有屬性它們也會向服務(wù)端進(jìn)行一次錯(cuò)誤請求,在高并發(fā)站點(diǎn)中很容易造成資源浪費(fèi),而且也有安全隱患。
頁面緩存。我舉一個(gè)例子,至今仍舊有不少站點(diǎn)在用公共庫cdn資源,比如jQuery或者bootstrap,這是為什么,難道上面說的外部請求與DNS解析不會影響時(shí)間嗎?在沒有弄清頁面緩存前我也是這樣認(rèn)為的,在觀察很多網(wǎng)站后我們不難發(fā)現(xiàn),他們都使用了這一方法,這就使得很多訪客的緩存中已經(jīng)存在這些公共庫的資源,也就完全避免了下載的時(shí)間。我也沒有統(tǒng)計(jì)分析過這種方法的利弊,這里頁面緩存所指的是頁面的外部文件可以開啟緩存,這也就是外部引入css/js的意義所在,在加載網(wǎng)站的第二張頁面時(shí),如果使用的是同一個(gè)外部css/js文件,就減少了下載時(shí)間。具體的用法可以百度http緩存設(shè)置(或許以后我也會寫這樣一篇文章)。

動手開始寫優(yōu)化網(wǎng)站加載速度這樣一篇文章時(shí)我完全沒有想到要寫這么多,只是想到哪就寫到哪,后來發(fā)現(xiàn)關(guān)于這方面的技術(shù)實(shí)在太多,如果事無巨細(xì)每個(gè)都拿出來細(xì)講那就肯定不是上下兩篇,估計(jì)得用一二三四來命名。如果有關(guān)于網(wǎng)站任何的疑問也可以來我的博客留言。

掃碼二維碼 獲取免費(fèi)視頻學(xué)習(xí)資料

Python編程學(xué)習(xí)

查 看2022高級編程視頻教程免費(fèi)獲取