前端性能優(yōu)化

首先是代碼, 從習(xí)慣做起:

? ? 1.優(yōu)化循環(huán)

????????這里每次循環(huán)開始前都需要判斷i是否小于data.length,JavaScript并不會(huì)對(duì)data.length進(jìn)行緩存

? ??????????for (var i = 0; i < data.length; i++) {

? ? ????????????????//do someting

? ? ? ? ? ? ? ?}

? ? ? ? 解決:

? ??????????for(var i = 0, m = data.length; i < m; i++) {

? ? ????????????????//do someting

????????????}

????2. 全局對(duì)象

? ??????另外需要注意的是孽查,垃圾回收器認(rèn)為根對(duì)象永遠(yuǎn)是活對(duì)象,永遠(yuǎn)不會(huì)對(duì)其進(jìn)行垃圾回收。而全局對(duì)象就是根對(duì)象嗜闻,所以全局作用域中的變量將會(huì)一直存在

? ? 3.?閉包導(dǎo)致的內(nèi)存泄露

? ? ? ? 盡量避免使用閉包斩芭,總有其他辦法來解決

? ? 4. 層級(jí)比較深的對(duì)象使用局部變量緩存,避免出現(xiàn)多個(gè)obj.obj.obj......

? ? 5.?字面量代替構(gòu)造函數(shù)

? ??????JavaScript可以通過字面量來構(gòu)造對(duì)象蝶糯,比如通過[]構(gòu)造一個(gè)數(shù)組洋只,{}構(gòu)造一個(gè)對(duì)象,/regexp/構(gòu)造一個(gè)正則表達(dá)式,我們應(yīng)當(dāng)盡力使用字面量來構(gòu)造對(duì)象木张,因?yàn)樽置媪渴且嬷苯咏忉寛?zhí)行的众辨,而如果使用構(gòu)造函數(shù)的話,需要調(diào)用一個(gè)內(nèi)部構(gòu)造器舷礼,所以字面量略微要快一點(diǎn)點(diǎn)鹃彻。

其次是從設(shè)計(jì)層面優(yōu)化:

1. 減少 HTTP請(qǐng)求數(shù)

這條策略基本上所有前端人都知道,而且也是最重要最有效的妻献。都說要減少 HTTP請(qǐng)求蛛株,那請(qǐng)求多了到底會(huì)怎么樣呢 ?首先,每個(gè)請(qǐng)求都是有成本的育拨,既包含時(shí)間成本也包含資源成本谨履。一個(gè)完整的請(qǐng)求都需要經(jīng)過 DNS尋址、與服務(wù)器建立連接熬丧、發(fā)送數(shù)據(jù)笋粟、等待服務(wù)器響應(yīng)、接收數(shù)據(jù)這樣一個(gè) “漫長” 而復(fù)雜的過程析蝴。時(shí)間成本就是用戶需要看到或者 “感受” 到這個(gè)資源是必須要等待這個(gè)過程結(jié)束的害捕,資源上由于每個(gè)請(qǐng)求都需要攜帶數(shù)據(jù),因此每個(gè)請(qǐng)求都需要占用帶寬闷畸。另外尝盼,由于瀏覽器進(jìn)行并發(fā)請(qǐng)求的請(qǐng)求數(shù)是有上限的 (約10個(gè)),因此請(qǐng)求數(shù)多了以后佑菩,瀏覽器需要分批進(jìn)行請(qǐng)求盾沫,因此會(huì)增加用戶的等待時(shí)間,會(huì)給用戶造成站點(diǎn)速度慢這樣一個(gè)印象殿漠,即使可能用戶能看到的第一屏的資源都已經(jīng)請(qǐng)求完了赴精,但是瀏覽器的進(jìn)度條會(huì)一直存在。

減少 HTTP請(qǐng)求數(shù)的主要途徑包括:

(1). 合理設(shè)置 HTTP緩存

????配置超長時(shí)間的本地緩存 —— 節(jié)省帶寬绞幌,提高性能 (? 強(qiáng)制客戶端緩存靜態(tài)文件? )

????采用內(nèi)容摘要作為緩存更新依據(jù) —— 精確的緩存控制? ?(? 根據(jù)資源改變更改資源后綴【祖娘?a=1asf4g5】實(shí)現(xiàn)客戶端請(qǐng)求更新? )?

????靜態(tài)資源CDN部署 —— 優(yōu)化網(wǎng)絡(luò)請(qǐng)求? ? ? ? (? ?優(yōu)化網(wǎng)絡(luò)請(qǐng)求,所有靜態(tài)資源? ?)

????更資源發(fā)布路徑實(shí)現(xiàn)非覆蓋式發(fā)布 —— 平滑升級(jí)?

(2). 資源合并與壓縮

如果可以的話啊奄,盡可能的將外部的腳本渐苏、樣式進(jìn)行合并,多個(gè)合為一個(gè)菇夸。另外琼富, CSS、 Javascript庄新、Image 都可以用相應(yīng)的工具進(jìn)行壓縮鞠眉,壓縮后往往能省下不少空間薯鼠。

(4). CSS Sprites

合并 CSS圖片,減少請(qǐng)求數(shù)的又一個(gè)好辦法械蹋。

(5). Inline Images

使用 data:URL scheme的方式將圖片嵌入到頁面或 CSS中出皇,如果不考慮資源管理上的問題的話,不失為一個(gè)好辦法哗戈。如果是嵌入頁面的話換來的是增大了頁面的體積郊艘,而且無法利用瀏覽器緩存。使用在 CSS中的圖片則更為理想一些唯咬。

(6). Lazy Load Images(自己對(duì)這一塊的內(nèi)容還是不了解)

這條策略實(shí)際上并不一定能減少 HTTP請(qǐng)求數(shù)纱注,但是卻能在某些條件下或者頁面剛加載時(shí)減少 HTTP請(qǐng)求數(shù)。對(duì)于圖片而言胆胰,在頁面剛加載的時(shí)候可以只加載第一屏狞贱,當(dāng)用戶繼續(xù)往后滾屏的時(shí)候才加載后續(xù)的圖片。這樣一來蜀涨,假如用戶只對(duì)第一屏的內(nèi)容感興趣時(shí)瞎嬉,那剩余的圖片請(qǐng)求就都節(jié)省了。有啊首頁曾經(jīng)的做法是在加載的時(shí)候把第一屏之后的圖片地址緩存在 Textarea標(biāo)簽中厚柳,待用戶往下滾屏的時(shí)候才 “惰性” 加載佑颇。

2. 將外部腳本置底(將腳本內(nèi)容在頁面信息內(nèi)容加載后再加載)

前文有談到,瀏覽器是可以并發(fā)請(qǐng)求的草娜,這一特點(diǎn)使得其能夠更快的加載資源,然而外鏈腳本在加載時(shí)卻會(huì)阻塞其他資源痒筒,例如在腳本加載完成之前宰闰,它后面的圖片、樣式以及其他腳本都處于阻塞狀態(tài)簿透,直到腳本加載完成后才會(huì)開始加載移袍。如果將腳本放在比較靠前的位置,則會(huì)影響整個(gè)頁面的加載速度從而影響用戶體驗(yàn)老充。解決這一問題的方法有很多葡盗,在這里有比較詳細(xì)的介紹(這里是譯文和更詳細(xì)的例子),而最簡單可依賴的方法就是將腳本盡可能的往后挪啡浊,減少對(duì)并發(fā)下載的影響觅够。

3. 將 CSS放在 HEAD中

如果將 CSS放在其他地方比如 BODY中,則瀏覽器有可能還未下載和解析到 CSS就已經(jīng)開始渲染頁面了巷嚣,這就導(dǎo)致頁面由無 CSS狀態(tài)跳轉(zhuǎn)到 CSS狀態(tài)喘先,用戶體驗(yàn)比較糟糕。除此之外廷粒,有些瀏覽器會(huì)在 CSS下載完成后才開始渲染頁面窘拯,如果 CSS放在靠下的位置則會(huì)導(dǎo)致瀏覽器將渲染時(shí)間推遲红且。

4. 異步請(qǐng)求 Callback(就是將一些行為樣式提取出來,慢慢的加載信息的內(nèi)容)

在某些頁面中可能存在這樣一種需求涤姊,需要使用 script標(biāo)簽來異步的請(qǐng)求數(shù)據(jù)暇番。類似:

Javascript:

/*Callback 函數(shù)*/

function myCallback(info){

//do something here

}

HTML:

cb返回的內(nèi)容 :

myCallback('Hello world!');

像以上這種方式直接在頁面上寫

7. 避免重復(fù)的資源請(qǐng)求

這種情況主要是由于疏忽或頁面由多個(gè)模塊拼接而成,然后每個(gè)模塊中請(qǐng)求了同樣的資源時(shí)思喊,會(huì)導(dǎo)致資源的重復(fù)請(qǐng)求

webpack打包工具性能優(yōu)化

1. 去除不必要的插件壁酬,例如一些只在開發(fā)環(huán)境需要使用的插件,例:

webpack.HotModuleReplacementPlugin?代碼熱更新搔涝,用于調(diào)試模式

open-browser-webpack-plugin自動(dòng)打開瀏覽器

webpack-dev-server是一個(gè)小型的Node.js Express服務(wù)器,它使用webpack-dev-middleware來服務(wù)于webpack的包

webpack.NoErrorsPlugin 構(gòu)建過程中有報(bào)錯(cuò)厨喂,不認(rèn)為構(gòu)建完成

devtools

2.?提取第三方庫

?有兩種方法:

(1)利用CommonsChunkPlugin插件提取公共代碼

????plugins: {? new? webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.js')? ?}

?(2)通過引用外部文件的方式引入第三方庫,比如像下面的配置

????{? ?externals: {'react':? ? 'React'}? ?}

?3. 代碼壓縮

????webpack 自帶了一個(gè)壓縮插件?UglifyJsPlugin庄呈,只需要在配置文件中引入即可蜕煌。

4. 組件按需引入,例如antd


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诬留,一起剝皮案震驚了整個(gè)濱河市斜纪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌文兑,老刑警劉巖盒刚,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绿贞,居然都是意外死亡因块,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門籍铁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涡上,“玉大人,你說我怎么就攤上這事拒名》岳ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵增显,是天一觀的道長雁佳。 經(jīng)常有香客問我,道長同云,這世上最難降的妖魔是什么糖权? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮炸站,結(jié)果婚禮上温兼,老公的妹妹穿的比我還像新娘。我一直安慰自己武契,他們只是感情好募判,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布荡含。 她就那樣靜靜地躺著,像睡著了一般届垫。 火紅的嫁衣襯著肌膚如雪释液。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天装处,我揣著相機(jī)與錄音误债,去河邊找鬼。 笑死妄迁,一個(gè)胖子當(dāng)著我的面吹牛寝蹈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播登淘,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼箫老,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了黔州?” 一聲冷哼從身側(cè)響起耍鬓,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎流妻,沒想到半個(gè)月后牲蜀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绅这,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年涣达,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片证薇。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡度苔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棕叫,到底是詐尸還是另有隱情,我是刑警寧澤奕删,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布俺泣,位于F島的核電站,受9級(jí)特大地震影響完残,放射性物質(zhì)發(fā)生泄漏伏钠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一谨设、第九天 我趴在偏房一處隱蔽的房頂上張望熟掂。 院中可真熱鬧,春花似錦扎拣、人聲如沸赴肚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誉券。三九已至指厌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間踊跟,已是汗流浹背踩验。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留商玫,地道東北人箕憾。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像拳昌,于是被迫代替她去往敵國和親袭异。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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

  • 圍繞前端的性能多如牛毛地回,涉及到方方面面扁远,以我我們將圍繞PC瀏覽器和移動(dòng)端瀏覽器的優(yōu)化策略進(jìn)行羅列注意,是羅列不是展...
    流動(dòng)碼文閱讀 675評(píng)論 0 0
  • 在這個(gè)前端用戶體驗(yàn)越來越重要的時(shí)代刻像,你的頁面稍微有點(diǎn)卡頓畅买,都難以挽留用戶。而作為一名有追求的前端细睡,勢必要力所能及地...
    SCQ000閱讀 3,819評(píng)論 0 52
  • 作者:minwe原文地址:https://csspod.com/frontend-performance-best...
    IT程序獅閱讀 1,660評(píng)論 0 13
  • 1.盡量減少http請(qǐng)求次數(shù) 合并js 合并css 小圖標(biāo)使用精靈圖 2.延遲加載頁面內(nèi)容 圖片谷羞、數(shù)據(jù) 懶加載 功...
    別讓我一個(gè)人醉_1fa7閱讀 443評(píng)論 0 0
  • 反編譯的目的是有助于我們學(xué)習(xí)規(guī)范代碼,而不是植入惡意代碼溜徙,竊取他人智慧成果湃缎。 Don't be evil. 本文介...
    ChongmingLiu閱讀 2,260評(píng)論 1 12