反正,前端性能優化就是很重要,很差好學習怎麼進階到20K+的薪水啊?!javascript
性能優化方面一直有所關注,但若是不去對本身所負責的項目進行一下回鍋,實踐實踐,優化優化,總會有點「書上得來終覺淺」的感受吧!css
從最開始的CSS放到<head>
裏面、js放到</body>
前面、使用雪碧圖等,到後面的靜態資源壓縮、合併以及使用iconfont代替小圖標,再到最近實踐的gzip壓縮、設置HTTP Header緩存字段...前端
gzip壓縮、設置ETag等,早就在《高性能網站建設指南》那兩本書中看過,但我一直認爲這都是後端小夥伴幹得事,就沒有怎麼留意過。直到最近,對先後端分離的理解愈來愈充分,對整個項目的部署愈來愈清晰,對項目裏面的資源請求愈來愈明白,才恍然意識到:先後端分離了,這他媽就是前端本身乾的事啊!!!java
從如下幾個方面來講一說本身實踐過的優化方法:node
所謂優化,第一個要弄明白的就是:優化什麼、從哪裏優化。前端作出來的頁面是在瀏覽器裏面呈現的,那瀏覽器是怎麼渲染這個頁面的呢?遇到CSS、js靜態資源,瀏覽器是怎麼處理的?具體的過程這裏再也不贅述,網上資源一大堆,我本身以前也寫過一篇,《網站性能優化—CRP》,算是谷歌文檔的翻譯版吧。 webpack
理解了瀏覽器渲染頁面的過程,也就明白了:CSS爲何要放到<head>
裏面、js放到</body>
前面,以及js的異步加載(async、defer)等優化。web
服務端開啓gzip壓縮
:大招,最近剛知曉,真是太牛逼了,通常的css、js文件能壓縮60、70%,固然,這個比率能夠設定的。先後端分離,若是前端部署用node、express做服務器的話,使用中間件compression
便可開啓gzip壓縮:express
// server.js
var express = require('express');
var compress = require('compression');
var app = express();
app.use(compress());複製代碼
對於通常的SPA項目,若是node服務器的做用比較簡單,好比只是作個接口轉發之類的,不少人更傾向用Nginx做服務器,Nginx在轉發接口、壓縮、緩存等功能上更勝一籌。不過,大部分前端對Nginx應該陌生一些,爲了實踐技術,用熟悉的node便可,真正的項目部署,有專業的實施人員來搞。json
設置Http Header裏面緩存相關的字段,作進一步的優化。gulp
express裏面也有對靜態資源相關的設置,只不過平時沒怎麼注意:
能夠設置etag、maxAge等,進一步會有200緩存和304緩存的區別:
200 OK (from cache) 是瀏覽器沒有跟服務器確認,直接用了瀏覽器緩存;而 304 Not Modified 是瀏覽器和服務器多確認了一次緩存的有效性,而後再使用的緩存。
相關的討論能夠參考 知乎:阿里雲存儲如何讓瀏覽器始終以200 (from cache)緩存圖片?
這種優化因問題而異吧,最重要的是善於使用Google DevTools裏面的Performance面板和Memory面板去分析、查找問題,進而找到優化的點。
內存溢出目前我只碰到過一次,同事用echarts畫K線圖,同事的js邏輯寫的有問題,點擊事件發生時canvas反覆渲染,致使內存逐漸升高,在APP內,直接致使了APP閃退。我重寫了一下js邏輯,針對canvas作了一些優化,修復了這個bug。
目前對這塊分析經驗還不是不少,後續碰到問題再實踐。
性能優化這塊,都是一點一點接觸的,項目中碰到了問題,而後去分析、優化,解決問題的同時,本身也收穫了不少知識。以上是我作前端使用過的優化方法,可能對於大牛來講,或許不值得的一提,可是對於新手來講應該仍是有些許參考意義。
有些高級優化尚未實踐到,好比劃分主域,細節一點的無線滾動優化等,後期會繼續學習。
PS: [譯]無盡滾動的複雜度--來自Google大神的拆解,這個無線滾動的優化我看了很久了,尚未理出個因此然來 😓