前端是龐大的,包括
HTML
、CSS
、Javascript
、Image
、Flash
等等各類各樣的資源。javascript前端優化是複雜的,針對方方面面的資源都有不一樣的方式。那麼,前端優化的目的是什麼 ?css
- 從用戶角度而言,優化可以讓頁面加載得更快、對用戶的操做響應得更及時,可以給用戶提供更爲友好的體驗。
- 從服務商角度而言,優化可以減小頁面請求數、或者減少請求所佔帶寬,可以節省可觀的資源。
如上圖所示,文件不合並存在的問題:html
keep-alive
通過代理服務器時可能會被斷開 ,不必定能完成狀態的保持。可是進行文件合併也是存在的問題:前端
首屏渲染問題
: 在進行js文件合併後,文件明顯變大、請求時間變長。當html網頁進行渲染時,若該渲染須要依賴這個js的話,那頁面渲染會等到js文件請求以後回來纔會繼續進行,致使首屏渲染時間延遲。緩存失效問題
:若如今有a、b、c三個文件合併,只要任意改變其中一個文件都會致使這個合併文件緩存失效,因此文件合併容易致使大面積緩存失效。對於文件合併有如下三個建議:vue
如何進行文件合併:java
webpack
、gulp
、fis3
等)HTML壓縮 HTML代碼壓縮就是壓縮一些在文本文件中有意義,可是在HTML中不顯示的字符,包括空格
,製表符
,換行符
等,還有一些其餘意義的字符,如HTML註釋
也能夠被壓縮。 node
CSS壓縮 CSS代碼壓縮就是對一些無效代碼刪除
和CSS語義合併
。對於咱們來講無效代碼多是註釋,也多是無效字符。 android
JS壓縮與混亂 JS代碼壓縮就是對一些無效字符的刪除
、剔除註釋
、代碼語義的縮減和優化
(如變量名縮短等)和代碼保護
。(代碼進行壓縮與混亂防止代碼邏輯被輕易窺探)webpack
如何進行HTML、CSS、JS壓縮ios
使用在線網站進行壓縮。
不一樣格式圖片經常使用的業務場景:
jpg
有損壓縮,壓縮率高,不支持透明 —— 大部分不須要透明圖片的業務場景png
支持透明,瀏覽器兼容好 (可降階壓縮:png3二、png2四、png8) —— 大部分須要透明圖片的業務場景webp
壓縮程度更好,在ios webview有兼容性問題 ,在android中支持比較好 —— 安卓開發svg
矢量圖,代碼內嵌,相對較小 —— 圖片樣式相對簡單的業務場景(小的icon、logo等)gif
支持透明、體積小、成像相對清晰(靜態GIF和動畫GIF) —— 與其餘4種圖片的使用場景基本不衝突壓縮後的大小:png > jpg > webp
一個好用的圖片優化平臺
DOMContentLoaded
事件觸發以前完成,保證能拿到dom元素),順序執行。(異步)onload
事件觸發前執行,不保證執行順序,腳本一旦加載完畢就會馬上執行。(異步)DOMContentloaded與onload的區別
scroll
事件的回調,去判斷咱們的懶加載圖片是否進入可視區域。getBoundingClientRect
用於獲取某個元素相對於視窗的位置集合,若圖片top
小於視窗的高度,說明進入可視區域。lazyload.js
。<!doctype html>
<html>
<head>
<title>懶加載</title>
</head>
<body>
<div class="image-list">
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.1.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.2.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.3.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.4.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.5.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.6.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.7.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.8.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.9.jpg" />
<img src="" class="image-item" lazyload="true" data-original="http://xxx.xxx.10.jpg" />
</div>
<script>
var viewHeight = document.documentElement.clientHeight; //獲取可視區域的高度
function lazyload () {
var eles = document.querySelectorAll('img[data-original][lazyload]'); //獲取須要懶加載的元素
Array.prototype.forEach.call(eles, function (item, index) {
var rect;
if (item.dataset.original === '') return;
rect = item.getBoundingClientRect(); //獲取元素的大小及其相對於視口的位置集合,集合中有top, right, bottom, left等屬性。
if (rect.bottom >= 0 && rect.top < viewHeight) { //判斷元素是否進入可視區域
!function () { //當即執行匿名函數,加載圖片
var img = new Image();
img.src = item.dataset.original;
img.onload = function () {
item.src = img.src;
}
item.removeAttribute('data-original');
item.removeAttribute('lazyload');
}()
}
})
}
lazyload(); //初始化懶加載方法
document.addEventListener('scroll', lazyload); //添加頁面滾動監聽器
</script>
</body>
</html>
複製代碼
lazyload
庫。Image對象
,var image = new Image();image.src = "http://...";XMLHttpRequest
對象,更好去控制預加載的過程,存在跨域問題。reflow
)。當頁面佈局和幾何屬性改變時就須要迴流。repaint
)。迴流必將引發重繪,而重繪不必定會引發迴流。
一、獲取DOM後分隔爲多個圖層
二、對每一個圖層的節點計算樣式結果(recalculate style)
三、爲每一個節點生成圖形和位置(layout、reflow和重佈局)
四、將每一個節點繪製填充到圖層位圖彙總(paint,repaint)
五、圖層做爲紋理加載到GPU
六、合併多個圖層到頁面上,生成最終圖像(composite layers)
複製代碼
一、3D或透視變換(perspective、transform)CSS屬性
二、使用加速視頻解碼的<video>節點
三、擁有3D(WebGL)上下文或加速的2D上下文的<canvas>節點
四、混合插件(如Flash)
五、對本身的opacity作CSS動畫或使用一個動畫webkit變換的元素
六、擁有加速CSS過濾器的元素
七、元素有一個包含複合層的後代節點(一個元素擁有一個子元素,該子元素在本身的層裏)
八、元素有一個z-index較低且包含一個複合層的兄弟元素(換句話說就是該元素在複合層上面渲染)
複製代碼
一、用translate(重繪)替代top(迴流)改變
二、用opacity替代visibility(重繪)
三、不要一條一條地修改 DOM 的樣式,預先定義好 class,而後修改 DOM 的className
四、把 DOM 離線後修改,好比:先把 DOM 給 display:none (有一次迴流),而後你修改100次,而後再把它顯示出來
五、不要把獲取DOM元素的真實位置代碼放在一個循環裏使用,不然會對相關緩衝區進行刷新,最好存到循環外的變量中再去使用
六、不要使用table佈局,可能很小的一個小改動會形成整個 table 的從新佈局(迴流)
七、動畫實現的速度的選擇,動畫速度快(重繪和迴流)的話可能致使頁面性能降低
八、對於動畫新建圖層(例:添加transform CSS屬性)
九、添加 CSS3 樣式啓用 GPU 硬件加速(例:transform: translateZ(0)或transform: translate3d(0, 0, 0))
十、減小對DOM的操做,對DOM操做的代價是高昂的
十一、避免使用出發重繪、迴流的CSS屬性
十二、將重繪、迴流的影響範圍限制在單獨的圖層以內,可是圖層的合成過程比較消耗運算量,圖層不能過多
複製代碼
cookie
去維持客戶端狀態。expire
。http response header
中的set-cookie(服務端生成),用於瀏覽器端和服務器端的交互。document.cookie
能夠讀寫cookie(客戶端生成),客戶端自身數據的存儲。localstorage
替代)cdn
上靜態文件的流量損耗(將cdn域名和主域名獨立開)。httponly
,不容許js進行讀寫,防止攻擊。可靠
:在沒有網絡的環境中也能提供基本的頁面訪問,而不會出現「未鏈接到互聯網」的頁面。快速
:針對網頁渲染及網絡數據訪問有較好優化。融入
:應用能夠被增長到手機桌面,而且和普通應用同樣有全屏、推送等特性。HTTPS
,Service Worker 的 API 比較 low-level)Lighthouse
,能夠檢測網站是否符合PWA、網站的可靠性、速度等性能優化指標[下載地址]。(https://lavas.baidu.com/doc-lavas/vue/more/downloads/lighthouse_2.1.0_0.zip)
geofencing
(地理圍欄定位),但它將推出的第一個首要特性,就是攔截和處理網絡請求的能力,包括以編程方式來管理被緩存的響應。Service Worker只能用於https站點中,非https站點不具有Service Worker能力。
生命週期
運用
chrome://inspect/#service-workers
)。chrome://serviceworker-internals
)。瀏覽器緩存就是把一個已經請求過的Web資源(如html頁面
,圖片
,js
,數據
等)拷貝一份副本儲存在瀏覽器中。緩存會根據進來的請求保存輸出內容的副本。當下一個請求來到的時候,若是是相同的URL,緩存會根據緩存機制決定是直接使用副本響應訪問請求,仍是向源服務器再次發送請求。比較常見的就是瀏覽器會緩存訪問過網站的網頁,當再次訪問這個URL地址的時候,若是網頁沒有更新,就不會再次下載網頁,而是直接使用本地緩存的網頁。只有當網站明確標識資源已經更新,瀏覽器纔會再次下載網頁。
HTTP1.0
的東西,如今默認瀏覽器均默認使用HTTP1.1
,因此它的做用基本忽略。Cache-Control: max-age=秒
替代。public
、private
、no-cache
、no-store
、no-transform
、must-revalidate
、proxy-revalidate
、max-age
、s-maxage
一、no-cache:不要讀取緩存中的文件,要求向WEB服務器從新請求
二、no-store:請求和響應都禁止被緩存
三、max-age:表示當訪問此網頁後的max-age秒內再次訪問不會去服務器請求,其功能與Expires相似,只是 Expires是根據某個特定日期值作比較。一但緩存者自身的時間不許確.則結果可能就是錯誤的,而max-age, 顯然無此問題.。Max-age的優先級也是高於Expires的
四、max-stale:容許讀取過時時間必須小於max-stale 值的緩存對象
五、min-fresh:接受其max-age生命期大於其當前時間 跟 min-fresh 值之和的緩存對象
六、only-if-cached:告知緩存者,我但願內容來自緩存,我並不關心被緩存響應,是不是新鮮的
七、no-transform:告知代理,不要更改媒體類型,好比jpg,被你改爲png
一、public: 數據內容皆被儲存起來,就連有密碼保護的網頁也儲存,安全性很低
二、private:數據內容只能被儲存到私有的cache,僅對某個用戶有效,不能共享
三、no-cache:能夠緩存,可是隻有在跟WEB服務器驗證了其有效後,才能返回給客戶端
四、no-store:請求和響應都禁止被緩存
五、max-age:本響應包含的對象的過時時間
六、must-revalidate:若是緩存過時了,會再次和原來的服務器肯定是否爲最新數據,而不是和中間的proxy
七、s-maxage:與max-age的惟一區別是,s-maxage僅僅應用於共享緩存.而不該用於用戶代理的本地緩存等針對單用戶的緩存。另外,s-maxage的優先級要高於max-age
八、max-stale:容許讀取過時時間必須小於max-stale 值的緩存對象
九、proxy-revalidate:與must-revalidate相似,區別在於proxy-revalidate要排除掉用戶代理的緩存的。即其規則並不該用於用戶代理的本地緩存上
十、no-transform:告知代理,不要更改媒體類型,好比jpg,被你改爲png