前端性能優(yōu)化

在前端開發(fā)過程中知纷,發(fā)現(xiàn)APP會有很多方面的性能需要注意橘洞,例如:

  • APP卡頓
  • 網(wǎng)絡慢
  • APP加載慢
    以下是一些具體的實踐經(jīng)驗婶肩。
    性能優(yōu)化分為兩個方面:一個是加快靜態(tài)資源的加載,一個是提高頁面渲染的速度貌夕。

頁面渲染性能優(yōu)化

  • 減少DOM層級律歼,在寫DOM的時候沒必要的層級可以不要加。
  • 不需要陰影的地方啡专,不要加陰影险毁。
  • 使用chrome的performance分析,分析原因们童。

靜態(tài)資源加載優(yōu)化

資源壓縮

頁面的資源包括js畔况、css、images等等慧库,這些文件盡可能壓縮

使用 tree-shaking跷跪、scope hoisting、code-splitting

  • tree-shaking
    移除無用代碼齐板,只加載實際使用了的代碼吵瞻。
  • scope hoisting
    作用域提升,允許工具檢測哪些 import 可以被提升或者可以轉(zhuǎn)換成一個內(nèi)聯(lián)函數(shù)甘磨。
  • Code-splitting
    將代碼分為按需加載的“塊”橡羞。

緩存

HTTP緩存:如果有HTTP緩存,并且緩存沒有失效济舆,瀏覽器會直接使用緩存卿泽;反之,則向服務器請求數(shù)據(jù)滋觉。

強制緩存:

  • Expires签夭,這個字段表示緩存到期時間。如果在響應消息頭中設置了這個字段椎瘟,就告知了瀏覽器在沒到這個時間之前不需要再次請求。
  • Cache-Control侄旬,這個字段表示緩存的最大有效時間肺蔚,在這個時間內(nèi)客戶端不需要向服務器發(fā)送請求。

對比緩存:

  • Last-Modified:服務器告知客戶端儡羔,資源最后一次被修改的時間宣羊。
  • If-Modified-Since:再次發(fā)送請求時,請求頭中帶有該字段汰蜘,服務器會將If-Modified-Since的值與Last-Modified字段進行對比仇冯,如果相等,則表示未修改族操,響應304苛坚;反之比被,則表示修改了,響應200狀態(tài)碼泼舱,返回數(shù)據(jù)等缀。

推薦的用法:

  • Etag:它存儲的是文件的特殊標識(一般都是hash生成的),服務器存儲著文件的Etag字段娇昙,可以在與每次客戶端傳送If-no-match的字段進行比較尺迂,如果相等,則表示未修改冒掌,響應304噪裕;反之,則表示已修改股毫,響應200狀態(tài)碼膳音,返回數(shù)據(jù)。

使用lazyload&preload

為了提高頁面的加載速度皇拣,我們期望的是按需加載严蓖,也就是說只加載當前的頁面,別的頁面不會一起被加載進來氧急,免得阻礙了當前頁面的加載颗胡。這就是懶加載,也被稱為延遲加載吩坝,延遲相關(guān)資源的加載毒姨。
當首頁加載完畢后,預判用戶行為钉寝,提前加載之后的頁面弧呐,也會提高用戶的體驗。這就是預加載嵌纲。

實踐中的一些例子

APP卡頓的時候俘枫,多次點擊觸發(fā)事件的處理

當APP卡頓時,如果多次點擊一個button逮走,剛好這個button會打開下一頁鸠蚪,那么就會看到打開了很多頁的動畫效果。為了防止這種情況师溅,考慮了很多做法茅信。

  1. debounce
    加上一個Directive,監(jiān)聽click事件墓臭,在某個時間段內(nèi)蘸鲸,多次點擊,只觸發(fā)一次操作窿锉。
import { Directive, EventEmitter, HostListener, OnInit, Output } from '@angular/core';
import { Subject } from 'rxjs/Subject';
import { debounceTime } from 'rxjs/operators';

@Directive({
  selector: '[appDebounceClick]'
})
export class DebounceClickDirective implements OnInit {
  @Output() debounceClick = new EventEmitter();
  private clicks = new Subject();

  constructor() {}

  ngOnInit() {
    this.clicks.pipe(debounceTime(4000)).subscribe(e => this.debounceClick.emit(e));
  }

  @HostListener('click', ['$event'])
  clickEvent(event) {
    event.preventDefault();
    event.stopPropagation();
    this.clicks.next(event);
  }
}

component的html:

 <button appDebounceClick (debounceClick)="log()">Debounced Click</button>

component的ts文件

public log() {
// do some thing
  }

具體做法參考:
https://coryrylan.com/blog/creating-a-custom-debounce-click-directive-in-angular

  1. disable button
    其實就是在button觸發(fā)事件后酌摇,通過disable屬性來控制接下來的事件是否生效膝舅,這個需要注意button disabled樣式可能會發(fā)生變化,并且要在合適的時機來控制該button的disable妙痹。如果對于APP中全部button都做這個控制的話铸史,可以抽一個Button component,并加上disable控制怯伊。
  2. disable event
    目前的APP中琳轿,主要遇上的問題是多次點擊button跳轉(zhuǎn)頁面時,會打開多個頁面耿芹,又不想改變button的樣式崭篡,所以在button觸發(fā)的頁面跳轉(zhuǎn)時,加上一個flag吧秕,判斷是否跳轉(zhuǎn)琉闪,在跳轉(zhuǎn)后的callback方法里重置該flag。
    具體做法其實就是砸彬,創(chuàng)建一個service颠毙,里面有一個flag屬性和跳轉(zhuǎn)方法。跳轉(zhuǎn)方法中砂碉,在頁面跳轉(zhuǎn)前蛀蜜,先判斷一下該flag是否可以跳轉(zhuǎn),如果可以增蹭,進行跳轉(zhuǎn)事件滴某,并且在callback方法里面重置flag。因為這個是針對于某一個頁面的跳轉(zhuǎn)事件滋迈,所以這個service應該inject到每一個用到的page霎奢。
    4.更好的辦法,繼續(xù)探索中饼灿。幕侠。。

參考
前端性能優(yōu)化清單
談談關(guān)于前端的緩存的問題
瀏覽器緩存

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碍彭,一起剝皮案震驚了整個濱河市晤硕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硕旗,老刑警劉巖窗骑,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件女责,死亡現(xiàn)場離奇詭異漆枚,居然都是意外死亡,警方通過查閱死者的電腦和手機抵知,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門墙基,熙熙樓的掌柜王于貴愁眉苦臉地迎上來软族,“玉大人,你說我怎么就攤上這事残制×⒃遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵初茶,是天一觀的道長颗祝。 經(jīng)常有香客問我,道長恼布,這世上最難降的妖魔是什么螺戳? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮折汞,結(jié)果婚禮上倔幼,老公的妹妹穿的比我還像新娘。我一直安慰自己爽待,他們只是感情好损同,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸟款,像睡著了一般膏燃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欠雌,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天蹄梢,我揣著相機與錄音,去河邊找鬼富俄。 笑死禁炒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的霍比。 我是一名探鬼主播幕袱,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悠瞬!你這毒婦竟也來了们豌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤浅妆,失蹤者是張志新(化名)和其女友劉穎望迎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凌外,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡辩尊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了康辑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摄欲。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轿亮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出胸墙,到底是詐尸還是另有隱情我注,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布迟隅,位于F島的核電站但骨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏智袭。R本人自食惡果不足惜嗽冒,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望补履。 院中可真熱鬧添坊,春花似錦、人聲如沸箫锤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谚攒。三九已至阳准,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馏臭,已是汗流浹背野蝇。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留括儒,地道東北人绕沈。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像帮寻,于是被迫代替她去往敵國和親乍狐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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

  • 關(guān)于 性能優(yōu)化 是個大的面固逗,這篇文章主要涉及到 前端 的幾個點浅蚪,如 前端性能優(yōu)化 的流程、常見技術(shù)手段烫罩、工具等惜傲。 ...
    子木_lsy閱讀 6,529評論 7 186
  • 前端性能優(yōu)化資料整理 頁面性能差的直接后果是用戶需要等待,而等待贝攒,尤其是不確定要多長時間的等待會給用戶帶來焦慮盗誊,為...
    飄零之雪閱讀 811評論 2 3
  • 緩存一直以來都是用來提高性能的一項必不可少的技術(shù) , 利用這項技術(shù)可以很好地提高web的性能。 緩存可以很有效地降...
    SCQ000閱讀 5,873評論 0 51
  • 圍繞前端的性能多如牛毛浊伙,涉及到方方面面,以我我們將圍繞PC瀏覽器和移動端瀏覽器的優(yōu)化策略進行羅列注意长捧,是羅列不是展...
    流動碼文閱讀 676評論 0 0
  • 你愿意為打開一個網(wǎng)頁等待多長時間嚣鄙?我一秒也不愿意等。但是事實上大多數(shù)網(wǎng)站在響應速度方面都讓人失望〈幔現(xiàn)在越來越多的人...
    前端楊肖閱讀 587評論 0 0