前端性能優(yōu)化(超詳細(xì))

資源的合并與壓縮

  • 減少 http 請求數(shù)量
  • 減少請求資源的大小
html 壓縮
  • 壓縮在文本文件中有意義但是在HTML中不顯示的字符鹃彻,包括空格、制表符、換行符、注釋
  • 使用在線網(wǎng)站壓縮舵鳞、nodejs提供了html-minifier 工具、后端模板引擎渲染壓縮
css 壓縮
  • 無效代碼刪除击儡、css語義合并
  • 使用在線網(wǎng)站壓縮术奖、使用 html-minifier 對html 中的 css 進(jìn)行壓縮、使用clean-css 對 css 進(jìn)行壓縮
js 壓縮與混亂
  • 無效字符的刪除脱惰、剔除注釋搏嗡、代碼語義的縮減與優(yōu)化、代碼保護(hù)
  • 使用在線網(wǎng)站壓縮拉一、使用 html-minifier 對html 中的 js 進(jìn)行壓縮采盒、使用uglifyjs2 對 js 進(jìn)行壓縮
文件合并
  • 如果不合并 === > 文件與文件之間有插入的上行請求,增加了N - 1 個網(wǎng)絡(luò)延遲舅踪;受丟包問題影響更嚴(yán)重纽甘;經(jīng)過代理服務(wù)器時可能會被斷開
  • 如果合并 === > 首屏渲染時間變長; 文件緩存大面積失效
  • 公共庫合并抽碌、不同頁面的合并
  • 使用在線網(wǎng)站進(jìn)行文件合并悍赢、使用 nodejs 實現(xiàn)文件合并
開啟 gzip

圖片優(yōu)化

png
  • png8 ---- 256 色 支持透明
  • png24 ---- 2^24 色 不支持透明
  • png32 ---- 2^24 色 支持透明
圖片格式
  • jpg 有損壓縮决瞳,壓縮率高,不支持透明
  • png 支持透明左权,瀏覽器兼容好
  • webp壓縮程度最好皮胡,在 iOS webview 有兼容性問題
  • svg 矢量圖, 代碼內(nèi)嵌赏迟,相對較小屡贺,圖片樣式相對簡單的場景
  • 格式轉(zhuǎn)換與圖片壓縮 https://zhitu.isux.us/
圖片壓縮
  • 針對真實圖片情況,舍棄一些相對無關(guān)緊要的色彩信息
  • 圖片壓縮 https://tinypng.com/
css 雪碧圖
  • 把網(wǎng)站上用到的一些圖片整合到一張單獨的圖片中
  • 減少網(wǎng)站的 http 請求數(shù)量
  • 缺點是當(dāng)圖片比較大時锌杀,一次家在比較慢
使用矢量圖
  • 使用 svg 進(jìn)行矢量圖的繪制
  • 使用 iconfont 解決 icon 問題
image inline
  • 內(nèi)嵌圖片 base64
  • 減少網(wǎng)站的 http 請求數(shù)量

HTML 渲染

順序執(zhí)行甩栈、并發(fā)加載
  • 詞法分析
  • 并發(fā)加載
  • 并發(fā)上限
是否阻塞
  • css head 中阻塞頁面的渲染
  • css 阻塞 js 的執(zhí)行
  • css 不阻塞外部腳本的加載

  • 直接引入的 js 阻塞頁面的渲染
  • js 不阻塞資源的加載
  • js 順序執(zhí)行,阻塞后續(xù) js 邏輯的執(zhí)行

懶加載 / 預(yù)加載

懶加載
  • 圖片進(jìn)入可視區(qū)域之后請求圖片資源
  • 對于電商等圖片很多糕再,頁面很長的業(yè)務(wù)場景適用
  • 減少無效資源的加載
  • 并發(fā)加載的資源過多會阻塞 js 的加載量没,影響網(wǎng)站的正常使用
預(yù)加載
  • 圖片等靜態(tài)資源在使用之前的提前請求
  • 資源使用到時能從緩存中加載,提升用戶體驗
  • 頁面展示的依賴關(guān)系維護(hù)

重繪 / 回流

避免使用觸發(fā)重繪突想、回流的 CSS 屬性
將重繪殴蹄、回流的影響范圍限制在單獨的圖層之內(nèi)

回流(或者叫做重排)
  • 當(dāng) RenderTree 中的一部分(或者全部)因為元素的規(guī)模尺寸、布局猾担、隱藏等改變而需要重新構(gòu)建袭灯,這就稱為回流(reflow)
  • 當(dāng)頁面布局和幾何屬性改變時就需要回流
重繪
  • 當(dāng) RenderTree 中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀绑嘹、風(fēng)格稽荧,而不會影響布局,比如background-color工腋,這就叫做重繪(repaint)
關(guān)系
  • 影響了布局-》回流(重排)
  • 沒有影響布局-》重繪
  • 重排必將引起重繪蛤克,而重繪不一定會引起重排
觸發(fā)頁面重布局的屬性
  • 盒子模型相關(guān)屬性
    width
    height
    padding
    margin
    display
    border-width
    border
    min-height
  • 定位屬性以及浮動
    top
    bottom
    left
    right
    position
    float
    clear
  • 改變節(jié)點內(nèi)部文字結(jié)構(gòu)
    text-align
    overflow-y
    overflow
    font-weight
    font-family
    font-size
    line-height
    vertical-align
    white-space
只觸發(fā)重繪的屬性
  • color
  • border-style
  • border-radius
  • visibility
  • text-decoration
  • background
  • background-image
  • background-position
  • background-repeat
  • background-size
  • outline
  • outline-color
  • outline-style
  • outline-width
  • box-shadow
新建DOM的過程
  • 獲取DOM后分割為多個圖層
  • 對每個圖層的節(jié)點計算樣式結(jié)果(recalculate style -- 樣式重計算)
  • 為每個節(jié)點生成圖形和位置(layout -- 回流和重布局)
  • 將每個節(jié)點繪制填充到圖層位圖中(paint setup 和 paint -- 重繪)
  • 圖層作為紋理上傳至GPU
  • 復(fù)合多個圖層到頁面上生成最終屏幕圖像(composite layers -- 圖層重組)

頻繁重繪回流的DOM元素單獨作為一個獨立圖層,那么這個DOM元素的重繪和回流的影響只會在這個圖層中夷蚊。

新建獨立圖層會減少重回回流帶來的影響构挤,但是在圖層重組的時候會消耗大量的性能,所以要權(quán)衡利弊惕鼓,有所選擇筋现。

Chrome創(chuàng)建圖層的條件
  • 3D 或透視變換 CSS 屬性(perspective transform)
  • 使用加速視頻解碼的 <video> 節(jié)點
  • 擁有 3D(WebGL)上下文或加速的 2D 上下文的 <canvas> 節(jié)點
  • 混合插件(如flash)
  • 對自己的 opacity 做 CSS 動畫或使用一個動畫webkit變換的元素
  • 擁有加速 CSS 過濾器的元素
  • 元素有一個包含復(fù)合層的后代節(jié)點(一個元素?fù)碛幸粋€子元素,該子元素在自己的層里)
  • 元素有一個 z-index 較低且包含一個復(fù)合層的兄弟元素(也就是該元素在復(fù)合層上面渲染)
重繪回流問題 優(yōu)化方案
  • 用 translate 替代 top
  • 用 opacity 替代 visibility
  • 不要一條一條的修改 DOM 的樣式箱歧,預(yù)先定義好 class矾飞,然后修改 DOM 的 className
  • 把 DOM 離線后修改,比如:先把 DOM 給 display: none(有一次 reflow)呀邢,然后修改100次洒沦,然后再顯示出來
  • 不要把 DOM 節(jié)點的屬性值放在一個循環(huán)里當(dāng)成循環(huán)里的變量
  • 不要使用 table 布局,可能很小的一個改動就會造成整個 table 的重新布局
  • 動畫實現(xiàn)的速度的選擇
  • 對于動畫新建圖層
  • 啟用 GPU 硬件加速

瀏覽器存儲

cookie
  • 因為 http 請求無狀態(tài)价淌,所以需要 cookie 去維持客戶端狀態(tài)
  • cookie 生成方式:http response header 中的 set-cookie申眼; js 中可以通過document.cookie讀寫cookie
  • 使用:用于瀏覽器端和服務(wù)器端的交互瞒津;客戶端自身數(shù)據(jù)的存儲
  • 過期時間:expire
  • 存儲限制:作為瀏覽器存儲,大小4kb左右括尸;需要設(shè)置過期時間 expire
  • cookie 存儲能力被 localstorage 代替
  • httponly 不允許 js 讀寫
  • cookie 中在相關(guān)域名下面 --- cdn的流量損耗 巷蚪。 解決:cdn 的域名和主站的域名要分開
localStorage
  • HTML5 設(shè)計出來專門用于瀏覽器存儲的
  • 大小為 5M 左右
  • 僅在客戶端使用,不和服務(wù)端進(jìn)行通信
  • 接口封裝較好
  • 瀏覽器本地緩存方案
sessionStorage
  • 會話級別的瀏覽器存儲
  • 大小為 5M 左右
  • 僅在客戶端使用濒翻,不和服務(wù)端進(jìn)行通信
  • 接口封裝較好
  • 對于標(biāo)表單信息的維護(hù)
indexedDB
  • 用于客戶端存儲大量結(jié)構(gòu)化數(shù)據(jù)
  • 為應(yīng)用創(chuàng)建離線版本
PWA
  • 可靠:在沒有網(wǎng)絡(luò)的環(huán)境中也能提供基本的頁面訪問
  • 快速:針對網(wǎng)頁渲染及網(wǎng)絡(luò)數(shù)據(jù)訪問有較好的優(yōu)化
  • 融入:應(yīng)用可以被增加到手機桌面屁柏,并且和普通應(yīng)用一樣有全屏、推送等特性

緩存

Cache-Control
  • max-age
  • s-maxage
  • private
  • public
  • no-cache
  • no-store
Expires
  • 緩存過期時間有送,用來指定資源到期的時間淌喻,是服務(wù)器端的具體時間點
  • 告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數(shù)據(jù),而無需再次請求
Last-Modified / If-Modified-Since
  • 基于客戶端和服務(wù)端協(xié)商的緩存機制
  • Last-Modified ------- response header
  • If-Modified-Since ------- request header
  • 需要與 cache-control 共同使用
  • 缺點:某些服務(wù)端不能獲取精確的修改時間雀摘;文件修改時間改了似嗤,但文件內(nèi)容卻沒有變
Etag / If-None-Match
  • 文件內(nèi)容的 hash 值
  • etag ------- response header
  • if-none-match ------- request header
  • 需要與 cache-control 共同使用
分級緩存策略
  • 200(from cache): 由expires / cache-control 控制。expires(http1.0有效)是絕對時間届宠;cache-control(http1.1有效)是相對時間。兩者都存在時乘粒,cache-control 覆蓋 expires豌注,只要沒有失效,瀏覽器只訪問自己的緩存灯萍。
  • 304 : 由 last-modified / etag 控制轧铁。當(dāng)上一層失效時或用戶點擊refresh,F(xiàn)5時旦棉,瀏覽器就會發(fā)送請求給服務(wù)器齿风,如果服務(wù)器端沒有變化,則返回304給瀏覽器绑洛。
  • 200 :當(dāng)瀏覽器本身沒有緩存或者上一層失效時救斑,或者用戶點擊了CTL + F5 時,瀏覽器直接去服務(wù)器下載最新數(shù)據(jù)真屯。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脸候,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绑蔫,更是在濱河造成了極大的恐慌运沦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件配深,死亡現(xiàn)場離奇詭異携添,居然都是意外死亡,警方通過查閱死者的電腦和手機篓叶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門烈掠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羞秤,“玉大人,你說我怎么就攤上這事向叉∽赌澹” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵母谎,是天一觀的道長瘦黑。 經(jīng)常有香客問我,道長奇唤,這世上最難降的妖魔是什么幸斥? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮咬扇,結(jié)果婚禮上甲葬,老公的妹妹穿的比我還像新娘。我一直安慰自己懈贺,他們只是感情好经窖,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梭灿,像睡著了一般画侣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堡妒,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天配乱,我揣著相機與錄音,去河邊找鬼皮迟。 笑死搬泥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伏尼。 我是一名探鬼主播忿檩,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爆阶!你這毒婦竟也來了休溶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扰她,失蹤者是張志新(化名)和其女友劉穎兽掰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徒役,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡孽尽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忧勿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杉女。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞻讽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熏挎,到底是詐尸還是另有隱情速勇,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布坎拐,位于F島的核電站烦磁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哼勇。R本人自食惡果不足惜都伪,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望积担。 院中可真熱鬧陨晶,春花似錦、人聲如沸帝璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽的烁。三九已至褐耳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撮躁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工买雾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留把曼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓漓穿,卻偏偏與公主長得像嗤军,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晃危,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353