【前端雜談】細(xì)數(shù)前端優(yōu)化的化零為整

原文作者:Arfei Zhang

原文地址:http://www.cnblogs.com/arfeizhang/p/optimization1.html

很高興看到越來越多的企業(yè)重視前端開發(fā)了,前端不再是網(wǎng)站開發(fā)人員的附屬技能泰偿∏榱回想我剛開始入行時,那時ASP網(wǎng)站(非ASP.NET)盛行肋僧,80%的網(wǎng)站都是用ASP來做的,一個網(wǎng)頁可能就是一個ASP文件舱污,里面前端代碼和后端代碼混在一起。現(xiàn)在不同了特碳,前后端分離刻两,前端可以專注于展示了增蹭,不用太在意后端的實現(xiàn)。但是磅摹,因為前端發(fā)展太快滋迈,展示環(huán)境也復(fù)雜多變,需要前端開發(fā)者掌握更廣的知識户誓。

這篇雜談饼灿,我打算從一個比較廣的面(包含JS,CSS,網(wǎng)絡(luò)傳輸,HTML5等),以化整為零為出發(fā)點(diǎn)厅克,來和大家介紹一些前端優(yōu)化的方法。(因為個人知識和經(jīng)驗有限橙依,除了文中提到的幾點(diǎn)证舟,一定還有別的優(yōu)化方法有化零為整的特性,歡迎大家一起補(bǔ)充哈,本文會不定期更新)

何為化零為整窗骑?通俗點(diǎn)說女责,就是我們將細(xì)碎的東西整合為一個整體,通過操作這個整體创译,也能達(dá)到逐個操作細(xì)碎東西的效果抵知。比如,你給我四個蘋果软族,我雙手可以拿著到處走動刷喜;如果給我十個蘋果,我全兜手上立砸,走起路來可能會慢些了掖疮,因為要照顧蘋果,怕掉了;但是颗祝,如果你再給我個袋子浊闪,我把十個蘋果裝里面,它們就成為一個整體螺戳,我就可以拎著到處跑了搁宾。

OK,說了這么一通倔幼,開始細(xì)數(shù)前端中需要化零為整的地方吧盖腿。

1.atlas/sprite assets/精靈圖/雪碧圖

這些都是對圖集合的稱呼,圖集合就是在做圖片資源的時候损同,將一些小的圖片元素集中做到一張圖片中奸忽。在使用時堕伪,通過一些參數(shù),來顯示大圖集合中所需要那個圖片原素栗菜。比如欠雌,需要這個大圖的某個ICON來做為DIV的背景,則除了將這個大圖設(shè)為DIV的背景外疙筹,還需要更改背景圖的位置(position)來顯示具體某小圖富俄。

例:某網(wǎng)站的sprite assets如下:

2.事件委托

面試時,我經(jīng)常問的一個問題而咆,有一個列表頁霍比,頁面結(jié)構(gòu)是外面一個BODY, 里面有一萬個子DIV暴备,每個DIV里面有一些文字悠瞬,這些文字都不相同。需求是涯捻,點(diǎn)擊一個DIV浅妆,要求彈個alert框,將DIV里的文字顯示出來障癌。你會怎么做凌外。

30%的人會用JQuery來綁事件,認(rèn)為看著簡潔涛浙,應(yīng)該效率高康辑,如:$("body>div").click(……) ?,有20%的人會寫原生的語句來遍歷轿亮,給每個DIV添加點(diǎn)擊事件疮薇,有10%的人回答,在頁面滾動時我注,存下頁面滾動的高度惦辛,在點(diǎn)擊時,獲取觸發(fā)點(diǎn)在屏幕的Y坐標(biāo)仓手,將Y的坐標(biāo)和頁面滾動的高度相加胖齐,然后除以每個DIV的高度,就知道點(diǎn)了第幾個元素嗽冒,再將這個元素的內(nèi)容彈出來呀伙。(或其它類似的做法)

回答出以上答案的面試者在這題會被扣分,正確答案是添坊,只用給外面的元素(本題是BODY)添加點(diǎn)擊事件剿另,在點(diǎn)擊時,可以獲取到引發(fā)點(diǎn)擊事件的源元素(如某DIV),將這個元素的文本內(nèi)容彈出來即可雨女。

3.長連接 keep alive

這點(diǎn)和后端有關(guān)系了谚攒,不光是前端的事了。大多數(shù)網(wǎng)頁是用http方式來獲取資源(如圖片氛堕,樣式表文件馏臭,JS文件等),有部分服務(wù)器不會維持連接讼稚,來了個請求括儒,就建立連接,然后輸出內(nèi)容锐想,輸出完后斷開連接帮寻,再重新建立下個請求的連接和輸出。如果一個網(wǎng)頁需要請求一百個文件赠摇,服務(wù)器就要建立和斷開一百次連接固逗。每次建立和斷開都需要時間(甚至比傳輸數(shù)據(jù)時間還長),無疑增加了頁面的呈現(xiàn)時間藕帜。如果服務(wù)器啟用了keep alive烫罩,不光減輕了服務(wù)器負(fù)擔(dān),也加快了頁面打開時間耘戚。

如下圖嗡髓,我們可以看到操漠,實際接收內(nèi)容的時間(Receiving)是很短的收津,大部分時間花在了等待(Waiting)和阻塞(Blocking)。

4.多DOM合并

由于前端表現(xiàn)越來越豐富浊伙,頁面上東西也越來越多撞秋,隨之而來的問題是DOM太多了,在做一些DOM操作時嚣鄙,會帶來性能問題吻贿。在DOM非常多的情況下,我們有必要把DOM進(jìn)行合并哑子,可以考慮把多個DOM合并為少量幾個舅列,或在可以的情況下,使用CANVAS來展示卧蜓。

如:有些需求會要求前端開發(fā)者做這種日期選擇器

如果使用一個DOM來裝一個選項(如:1970)帐要,不考慮按鈕,單獨(dú)看日期選項的話弥奸,可能會需要44+12+31=87個DOM榨惠,對于移動瀏覽器來說,DOM越少越好。萬一產(chǎn)品后來一想赠橙,除了日期耽装,還要添加時分秒選項呢?這就需要44+12+31+24+60+60=231個DOM了期揪。但我們可以細(xì)想一下掉奄,如果把各字段(年、月横侦、日)只用一個很高的容器(如DIV)來裝挥萌,內(nèi)容可以用換行符來換行,取值時通過一些算法來得到枉侧,是不是大幅縮小了DOM數(shù)量引瀑?從87個DOM變?yōu)?個DOM。少了一個數(shù)量級榨馁。

5.WebSocket

很多網(wǎng)頁有實時更新數(shù)據(jù)的要求,如證券類網(wǎng)站憨栽。為了避免頁面刷新,會使用AJAX來進(jìn)行長輪詢翼虫,每隔一段時間(如一秒鐘)就連一次服務(wù)器取下數(shù)據(jù)屑柔。這樣會造成大量的請求連接,不止給前端珍剑,也給后端帶來了不小的壓力掸宛。幸好HTML5給我們帶來了WebSocket,網(wǎng)頁能夠和服務(wù)器保持長連接,通過長連接來維持?jǐn)?shù)據(jù)的實時更新了招拙。

6.CSS屬性繼承

CSS會繼承父元素的屬性唧瘾,我們可以將一些通用的屬性在父元素的CSS中定義,子元素通過繼承來獲取這些元素别凤。在某些情況下饰序,合理使用繼承能較明顯地縮小CSS文件的大小。

7.documentFragment

"一個列表頁规哪,需要你往里面插入一千個DOM求豫,你怎么做?" 這是我經(jīng)常問別人的一道題诉稍。

很多時候蝠嘉,你往頁面中加一個DOM,就會引起頁面的重構(gòu)杯巨。如果你使用遍歷來逐一添加娃属,每添加一次辱挥,頁面都會重新渲染一次沦补,這種做法會帶來性能的下降踢俄。好的方式是把要添加的元素先緩存起來蚊逢, 要添加時一次性添加。一般會使用documentFragment來進(jìn)行緩存箫章,還有些使用長的字符串(HTML代碼串)來緩存烙荷。

8.多動畫合并為一個

在做CSS3的動畫時,如果需求中要求有多步驟的動畫(如檬寂,將一個DIV沿Y軸旋轉(zhuǎn)30度终抽,接著沿X軸旋轉(zhuǎn)30度,再沿Z軸旋轉(zhuǎn)30度)桶至,我們可以將這些動畫合并昼伴,使用animation的關(guān)鍵幀來將這些步驟隔離。省去多步操作DOM的成本镣屹。

9.多文件壓縮與合并

對JS和CSS文件壓縮圃郊,是前端縮小網(wǎng)絡(luò)傳輸量的有效方式(壓縮的做法一般是去除多余空格和換行,以及替換變量名或方法名女蜈。YUICompressor是個不錯的工具)

將多個小的JS或CSS文件合并(merge)為一個大文件持舆,這種做法可以大幅減少請示的次數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伪窖,一起剝皮案震驚了整個濱河市逸寓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌覆山,老刑警劉巖竹伸,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異簇宽,居然都是意外死亡勋篓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門晦毙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來生巡,“玉大人耙蔑,你說我怎么就攤上這事见妒。” “怎么了甸陌?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵须揣,是天一觀的道長。 經(jīng)常有香客問我钱豁,道長耻卡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任牲尺,我火速辦了婚禮卵酪,結(jié)果婚禮上幌蚊,老公的妹妹穿的比我還像新娘。我一直安慰自己溃卡,他們只是感情好溢豆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘸羡,像睡著了一般漩仙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上犹赖,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天队他,我揣著相機(jī)與錄音,去河邊找鬼峻村。 笑死麸折,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粘昨。 我是一名探鬼主播磕谅,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雾棺!你這毒婦竟也來了膊夹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤捌浩,失蹤者是張志新(化名)和其女友劉穎放刨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尸饺,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡进统,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浪听。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟碎。...
    茶點(diǎn)故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迹栓,靈堂內(nèi)的尸體忽然破棺而出掉分,到底是詐尸還是另有隱情,我是刑警寧澤克伊,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布酥郭,位于F島的核電站,受9級特大地震影響愿吹,放射性物質(zhì)發(fā)生泄漏不从。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一犁跪、第九天 我趴在偏房一處隱蔽的房頂上張望椿息。 院中可真熱鬧歹袁,春花似錦、人聲如沸寝优。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倡勇。三九已至逞刷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妻熊,已是汗流浹背夸浅。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扔役,地道東北人帆喇。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像亿胸,于是被迫代替她去往敵國和親坯钦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案侈玄? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評論 1 92
  • <a name='html'>HTML</a> Doctype作用婉刀?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別? (1)、<...
    clark124閱讀 3,462評論 1 19
  • 未滿18歲的青春美少女 雙重性格 一面靜 一面動 喜歡艾薇兒也喜歡陳粒 喜歡rap 更喜歡民謠 漢服搭配aj穿 聽...
    鯉語閱讀 216評論 0 0
  • 先來看效果 下面是教程,歡迎同學(xué)們跟著一起做潘悼。 文
    UI設(shè)計達(dá)人閱讀 726評論 0 50
  • 1 注重自己的儀表 每個女生當(dāng)然喜歡男生穿的干干凈凈的律秃,顏色搭配合適的穿戴,這是一個人的品味展示治唤。 2 不“娘” ...
    胡彬?qū)憣?/span>閱讀 196評論 0 0