【前端雜談】細(xì)數(shù)前端優(yōu)化的化零為整_html/css_WEB-ITnose
Jun 24, 2016 pm 12:03 PM
很高興看到越來(lái)越多的企業(yè)重視前端開(kāi)發(fā)了,前端不再是網(wǎng)站開(kāi)發(fā)人員的附屬技能?;叵胛覄傞_(kāi)始入行時(shí),那時(shí)ASP網(wǎng)站(非ASP.NET)盛行,80%的網(wǎng)站都是用ASP來(lái)做的,一個(gè)網(wǎng)頁(yè)可能就是一個(gè)ASP文件,里面前端代碼和后端代碼混在一起?,F(xiàn)在不同了,前后端分離,前端可以專(zhuān)注于展示了,不用太在意后端的實(shí)現(xiàn)。但是,因?yàn)榍岸税l(fā)展太快,展示環(huán)境也復(fù)雜多變,需要前端開(kāi)發(fā)者掌握更廣的知識(shí)。
這篇雜談,我打算從一個(gè)比較廣的面(包含JS,CSS,網(wǎng)絡(luò)傳輸,HTML5等),以化整為零為出發(fā)點(diǎn),來(lái)和大家介紹一些前端優(yōu)化的方法。(因?yàn)閭€(gè)人知識(shí)和經(jīng)驗(yàn)有限,除了文中提到的幾點(diǎn),一定還有別的優(yōu)化方法有化零為整的特性,歡迎大家一起補(bǔ)充哈,本文會(huì)不定期更新)
何為化零為整?通俗點(diǎn)說(shuō),就是我們將細(xì)碎的東西整合為一個(gè)整體,通過(guò)操作這個(gè)整體,也能達(dá)到逐個(gè)操作細(xì)碎東西的效果。比如,你給我四個(gè)蘋(píng)果,我雙手可以拿著到處走動(dòng);如果給我十個(gè)蘋(píng)果,我全兜手上,走起路來(lái)可能會(huì)慢些了,因?yàn)橐疹櫶O(píng)果,怕掉了;但是,如果你再給我個(gè)袋子,我把十個(gè)蘋(píng)果裝里面,它們就成為一個(gè)整體,我就可以拎著到處跑了。
OK,說(shuō)了這么一通,開(kāi)始細(xì)數(shù)前端中需要化零為整的地方吧。
?
1.atlas/sprite assets/精靈圖/雪碧圖
這些都是對(duì)圖集合的稱(chēng)呼,圖集合就是在做圖片資源的時(shí)候,將一些小的圖片元素集中做到一張圖片中。在使用時(shí),通過(guò)一些參數(shù),來(lái)顯示大圖集合中所需要那個(gè)圖片原素。比如,需要這個(gè)大圖的某個(gè)ICON來(lái)做為DIV的背景,則除了將這個(gè)大圖設(shè)為DIV的背景外,還需要更改背景圖的位置(position)來(lái)顯示具體某小圖。
例:某網(wǎng)站的sprite assets如下:
?
2.事件委托
面試時(shí),我經(jīng)常問(wèn)的一個(gè)問(wèn)題,有一個(gè)列表頁(yè),頁(yè)面結(jié)構(gòu)是外面一個(gè)BODY, 里面有一萬(wàn)個(gè)子DIV,每個(gè)DIV里面有一些文字,這些文字都不相同。需求是,點(diǎn)擊一個(gè)DIV,要求彈個(gè)alert框,將DIV里的文字顯示出來(lái)。你會(huì)怎么做。
30%的人會(huì)用JQuery來(lái)綁事件,認(rèn)為看著簡(jiǎn)潔,應(yīng)該效率高,如:$("body>div").click(……) ?,有20%的人會(huì)寫(xiě)原生的語(yǔ)句來(lái)遍歷,給每個(gè)DIV添加點(diǎn)擊事件,有10%的人回答,在頁(yè)面滾動(dòng)時(shí),存下頁(yè)面滾動(dòng)的高度,在點(diǎn)擊時(shí),獲取觸發(fā)點(diǎn)在屏幕的Y坐標(biāo),將Y的坐標(biāo)和頁(yè)面滾動(dòng)的高度相加,然后除以每個(gè)DIV的高度,就知道點(diǎn)了第幾個(gè)元素,再將這個(gè)元素的內(nèi)容彈出來(lái)。(或其它類(lèi)似的做法)
回答出以上答案的面試者在這題會(huì)被扣分,正確答案是,只用給外面的元素(本題是BODY)添加點(diǎn)擊事件,在點(diǎn)擊時(shí),可以獲取到引發(fā)點(diǎn)擊事件的源元素(如某DIV),將這個(gè)元素的文本內(nèi)容彈出來(lái)即可。
?
3.長(zhǎng)連接 keep alive
這點(diǎn)和后端有關(guān)系了,不光是前端的事了。大多數(shù)網(wǎng)頁(yè)是用http方式來(lái)獲取資源(如圖片,樣式表文件,JS文件等),有部分服務(wù)器不會(huì)維持連接,來(lái)了個(gè)請(qǐng)求,就建立連接,然后輸出內(nèi)容,輸出完后斷開(kāi)連接,再重新建立下個(gè)請(qǐng)求的連接和輸出。如果一個(gè)網(wǎng)頁(yè)需要請(qǐng)求一百個(gè)文件,服務(wù)器就要建立和斷開(kāi)一百次連接。每次建立和斷開(kāi)都需要時(shí)間(甚至比傳輸數(shù)據(jù)時(shí)間還長(zhǎng)),無(wú)疑增加了頁(yè)面的呈現(xiàn)時(shí)間。如果服務(wù)器啟用了keep alive,不光減輕了服務(wù)器負(fù)擔(dān),也加快了頁(yè)面打開(kāi)時(shí)間。
如下圖,我們可以看到,實(shí)際接收內(nèi)容的時(shí)間(Receiving)是很短的,大部分時(shí)間花在了等待(Waiting)和阻塞(Blocking)。
?
4.多DOM合并
由于前端表現(xiàn)越來(lái)越豐富,頁(yè)面上東西也越來(lái)越多,隨之而來(lái)的問(wèn)題是DOM太多了,在做一些DOM操作時(shí),會(huì)帶來(lái)性能問(wèn)題。在DOM非常多的情況下,我們有必要把DOM進(jìn)行合并,可以考慮把多個(gè)DOM合并為少量幾個(gè),或在可以的情況下,使用CANVAS來(lái)展示。
如:有些需求會(huì)要求前端開(kāi)發(fā)者做這種日期選擇器
?如果使用一個(gè)DOM來(lái)裝一個(gè)選項(xiàng)(如:1970),不考慮按鈕,單獨(dú)看日期選項(xiàng)的話(huà),可能會(huì)需要44+12+31=87個(gè)DOM,對(duì)于移動(dòng)瀏覽器來(lái)說(shuō),DOM越少越好。萬(wàn)一產(chǎn)品后來(lái)一想,除了日期,還要添加時(shí)分秒選項(xiàng)呢?這就需要44+12+31+24+60+60=231個(gè)DOM了。但我們可以細(xì)想一下,如果把各字段(年、月、日)只用一個(gè)很高的容器(如DIV)來(lái)裝,內(nèi)容可以用換行符來(lái)?yè)Q行,取值時(shí)通過(guò)一些算法來(lái)得到,是不是大幅縮小了DOM數(shù)量?從87個(gè)DOM變?yōu)?個(gè)DOM。少了一個(gè)數(shù)量級(jí)。
?
5.WebSocket
很多網(wǎng)頁(yè)有實(shí)時(shí)更新數(shù)據(jù)的要求,如證券類(lèi)網(wǎng)站。為了避免頁(yè)面刷新,會(huì)使用AJAX來(lái)進(jìn)行長(zhǎng)輪詢(xún),每隔一段時(shí)間(如一秒鐘)就連一次服務(wù)器取下數(shù)據(jù)。這樣會(huì)造成大量的請(qǐng)求連接,不止給前端,也給后端帶來(lái)了不小的壓力。幸好HTML5給我們帶來(lái)了WebSocket,網(wǎng)頁(yè)能夠和服務(wù)器保持長(zhǎng)連接,通過(guò)長(zhǎng)連接來(lái)維持?jǐn)?shù)據(jù)的實(shí)時(shí)更新了。
?
6.CSS屬性繼承
CSS會(huì)繼承父元素的屬性,我們可以將一些通用的屬性在父元素的CSS中定義,子元素通過(guò)繼承來(lái)獲取這些元素。在某些情況下,合理使用繼承能較明顯地縮小CSS文件的大小。
?
7.documentFragment
"一個(gè)列表頁(yè),需要你往里面插入一千個(gè)DOM,你怎么做?" 這是我經(jīng)常問(wèn)別人的一道題。
很多時(shí)候,你往頁(yè)面中加一個(gè)DOM,就會(huì)引起頁(yè)面的重構(gòu)。如果你使用遍歷來(lái)逐一添加,每添加一次,頁(yè)面都會(huì)重新渲染一次,這種做法會(huì)帶來(lái)性能的下降。好的方式是把要添加的元素先緩存起來(lái), 要添加時(shí)一次性添加。一般會(huì)使用documentFragment來(lái)進(jìn)行緩存,還有些使用長(zhǎng)的字符串(HTML代碼串)來(lái)緩存。
?
8.多動(dòng)畫(huà)合并為一個(gè)
在做CSS3的動(dòng)畫(huà)時(shí),如果需求中要求有多步驟的動(dòng)畫(huà)(如,將一個(gè)DIV沿Y軸旋轉(zhuǎn)30度,接著沿X軸旋轉(zhuǎn)30度,再沿Z軸旋轉(zhuǎn)30度),我們可以將這些動(dòng)畫(huà)合并,使用animation的關(guān)鍵幀來(lái)將這些步驟隔離。省去多步操作DOM的成本。
?
9.多文件壓縮與合并
對(duì)JS和CSS文件壓縮,是前端縮小網(wǎng)絡(luò)傳輸量的有效方式(壓縮的做法一般是去除多余空格和換行,以及替換變量名或方法名。YUI?Compressor是個(gè)不錯(cuò)的工具)
將多個(gè)小的JS或CSS文件合并(merge)為一個(gè)大文件,這種做法可以大幅減少請(qǐng)示的次數(shù)。
?

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

時(shí)間複雜度衡量演算法執(zhí)行時(shí)間與輸入規(guī)模的關(guān)係。降低C++程式時(shí)間複雜度的技巧包括:選擇合適的容器(如vector、list)以最佳化資料儲(chǔ)存和管理。利用高效演算法(如快速排序)以減少計(jì)算時(shí)間。消除多重運(yùn)算以減少重複計(jì)算。利用條件分支以避免不必要的計(jì)算。透過(guò)使用更快的演算法(如二分搜尋)來(lái)優(yōu)化線性搜尋。

PHP與Vue:完美搭檔的前端開(kāi)發(fā)利器在當(dāng)今網(wǎng)路快速發(fā)展的時(shí)代,前端開(kāi)發(fā)變得愈發(fā)重要。隨著使用者對(duì)網(wǎng)站和應(yīng)用的體驗(yàn)要求越來(lái)越高,前端開(kāi)發(fā)人員需要使用更有效率和靈活的工具來(lái)創(chuàng)建響應(yīng)式和互動(dòng)式的介面。 PHP和Vue.js作為前端開(kāi)發(fā)領(lǐng)域的兩個(gè)重要技術(shù),搭配起來(lái)可以稱(chēng)得上是完美的利器。本文將探討PHP和Vue的結(jié)合,以及詳細(xì)的程式碼範(fàn)例,幫助讀者更好地理解和應(yīng)用這兩

Go語(yǔ)言作為一種快速、高效的程式語(yǔ)言,在後端開(kāi)發(fā)領(lǐng)域廣受歡迎。然而,很少有人將Go語(yǔ)言與前端開(kāi)發(fā)聯(lián)繫起來(lái)。事實(shí)上,使用Go語(yǔ)言進(jìn)行前端開(kāi)發(fā)不僅可以提高效率,還能為開(kāi)發(fā)者帶來(lái)全新的視野。本文將探討使用Go語(yǔ)言進(jìn)行前端開(kāi)發(fā)的可能性,並提供具體的程式碼範(fàn)例,幫助讀者更了解這一領(lǐng)域。在傳統(tǒng)的前端開(kāi)發(fā)中,通常會(huì)使用JavaScript、HTML和CSS來(lái)建立使用者介面

PHP函數(shù)效率最佳化的五大方法:避免不必要的變數(shù)複製。使用引用以避免變數(shù)複製。避免重複函數(shù)呼叫。內(nèi)聯(lián)簡(jiǎn)單的函數(shù)。使用數(shù)組優(yōu)化循環(huán)。

在前端開(kāi)發(fā)面試中,常見(jiàn)問(wèn)題涵蓋廣泛,包括HTML/CSS基礎(chǔ)、JavaScript基礎(chǔ)、框架和函式庫(kù)、專(zhuān)案經(jīng)驗(yàn)、演算法和資料結(jié)構(gòu)、效能最佳化、跨域請(qǐng)求、前端工程化、設(shè)計(jì)模式以及新技術(shù)和趨勢(shì)。面試官的問(wèn)題旨在評(píng)估候選人的技術(shù)技能、專(zhuān)案經(jīng)驗(yàn)以及對(duì)行業(yè)趨勢(shì)的理解。因此,應(yīng)試者應(yīng)充分準(zhǔn)備這些方面,以展現(xiàn)自己的能力和專(zhuān)業(yè)知識(shí)。

Golang與前端技術(shù)結(jié)合:探討Golang如何在前端領(lǐng)域發(fā)揮作用,需要具體程式碼範(fàn)例隨著互聯(lián)網(wǎng)和行動(dòng)應(yīng)用的快速發(fā)展,前端技術(shù)也愈發(fā)重要。而在這個(gè)領(lǐng)域中,Golang作為一門(mén)強(qiáng)大的後端程式語(yǔ)言,也可以發(fā)揮重要作用。本文將探討Golang如何與前端技術(shù)結(jié)合,以及透過(guò)具體的程式碼範(fàn)例來(lái)展示其在前端領(lǐng)域的潛力。 Golang在前端領(lǐng)域的角色作為一門(mén)高效、簡(jiǎn)潔且易於學(xué)習(xí)的

1.在桌面上按組合鍵(win鍵+R)開(kāi)啟運(yùn)行窗口,接著輸入【regedit】,回車(chē)確認(rèn)。 2.開(kāi)啟登錄編輯程式後,我們依序點(diǎn)選展開(kāi)【HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorer】,然後看目錄裡有沒(méi)有Seri??alize項(xiàng),如果沒(méi)有我們可以點(diǎn)選右鍵Explorer,新建項(xiàng),並將其命名為Serialize。 3.接著點(diǎn)選Serialize,然後在右邊窗格空白處點(diǎn)選滑鼠右鍵,新建一個(gè)DWORD(32)位元值,並將其命名為Star

Vivox100s參數(shù)配置大揭密:處理器效能如何最佳化?在當(dāng)今科技快速發(fā)展的時(shí)代,智慧型手機(jī)已經(jīng)成為我們?nèi)粘I畈豢苫蛉钡囊徊糠?。作為智慧型手機(jī)的重要組成部分,處理器的效能優(yōu)化直接關(guān)係到手機(jī)的使用體驗(yàn)。 Vivox100s作為一款備受矚目的智慧型手機(jī),其參數(shù)配置備受關(guān)注,尤其是處理器效能的最佳化議題更是備受用戶(hù)關(guān)注。處理器作為手機(jī)的“大腦”,直接影響手機(jī)的運(yùn)行速度
