原文javascript
咱們都知道前端性能很重要,並嘗試從各個方面優化它,但你是否真的知道你網站的性能瓶頸在哪呢?是你的代碼執行效率低下,仍是javascript文件過大,是頻繁的Dom操做,仍是緩慢的渲染速度?最重要的是你應該知道從哪些方面提高網站的性能瓶頸,並長期觀察對比各個方案的效果。css
代碼優化包含兩個方面,一是對於JS引擎和瀏覽器而言,高效率的代碼,二是對於不一樣構建環境的代碼,這部分優化針對不一樣的框架而言手段都不盡相同。html
高性能Javascript
一書1、數據存取前端
var global = 0;
function() {
// 在函數內部定義一個變量, 後續直接訪問局部變量便可
var temp = global;
temp++;temp--;
console.log(temp);
}
複製代碼
location.href
老是比讀取window.location.href
要快,對於須要頻繁訪問的深層對象,須要將其緩存:var name = element.name;
for(var i = 0; i < 10000; i++) {
name += "zhou";
// element.name += "zhou";
}
複製代碼
2、DOM編程vue
innerHTML
要比原生DOM方法快,如createElement
。querySelectorAll
查詢語句性能高於其它的查詢語句,緣由在於querySelect返回的不是動態的HTML集合
離線
DOM樹,減小訪問DOM佈局的次數。3、算法和流程控制java
// 原始版本
for(let i = 0; i < list.length; i++){
fn(list[i]);
}
// 優化版本1, 緩存list.length,由於length值是不變的
for(let i = 0, len = list.length; i < len; i++){
fn(list[i]);
}
// 優化版本2,倒序循環,把i的值做爲控制條件,去掉 i < len的比較消耗
for(let i = list.length; i--){
fn(list[i]);
}
複製代碼
條件語句react
遞歸webpack
4、Ajaxcss3
new Image()
,並將其src屬性設置爲服務器的urlsrc = url + params
,服務器會接受到數據並保存,使用這種方式的消耗是很是小的。5、編程實踐web
var a = [], b = {}
,能夠在控制檯中查看效率動態做用域
問題且性能較低。i % 2 === 1
判斷, 這個計算可轉換爲位運算提高效率: i & 1
1、webpack
2、React
<></>
// 一、使用內聯函數
render() {
return (
<div onClick={e => this.handleClick(e)}>test</div>
)
}
// 二、不使用內聯函數
render() {
return (
<div onClick={this.handleClick}>test</div>
)
}
複製代碼
getDerivedStateFromProps
鉤子被設計爲static函數的緣由 參考react16的更新。render
方法和子組件的生命週期方法拋出的錯誤,爲應用提供一個錯誤收集的方式和兜底的設計。3、Vue
Object.freeze()
凍結對象。props: ["status"]
一般,網站的性能指標反應在網站加載時間,和後續交互體驗上。網站從加載到用戶可交互的時間有多個過程時間和。
用戶在訪問網站過程當中,會有DNS解析,TCP握手,HTTP資源傳輸等過程, 針對這些過程優化以下。
DNS預解析,對靜態資源域名添加dns-prefetch
dns-prefetch
,可是https域名不會。<meta http-equiv="x-dns-prefetch-control" content="on">
<link rel="dns-prefetch" href="//wddsss.com/a.jpg">
HttpDns防劫持 DNS劫持是運營商的DNS服務在解析後返回了不正確的主機IP,將用戶導入到其餘網頁的現象,可使用HttpDns(某雲有提供此服務)。
使用HttpDns eg:http://127.0.0.1?domain=https://www.wddsss.com
CDN加速資源傳輸
慢啓動
和流量控制
能夠用於避免網絡擁塞,2: 設置rwnd
爲一合理的值提高最大吞吐量(針對不一樣類型的流量,rwnd的值設置應該不盡相同)SSL加速
Http/2優化資源傳輸
資源壓縮
圖片優化
資源緩存
script.text = rs.jsContent
,經過此方式添加的js的主要優勢是你能夠下載js代碼但不當即執行。async和defer都能異步下載js文件,作到了js下載的同時不阻塞文檔解析,可是async因爲其加載完成後當即執行的特性,致使js的執行順序沒法控制,因此實戰中推薦使用defer。
const io = new IntersectionObserver(callback);
let imgs = document.querySelectorAll('[data-src]')
imgs.forEach((item)=>{
io.observe(item)
})
function callback(items){
items.forEach(item => {
if(item.isIntersecting){ // 當前元素可見
item.target.src = item.target.dataset.src
io.unobserve(item.target)
}
})
}
複製代碼
這裏圖片的初始src能夠設置一個質量很低的圖片,以達到圖片加載的流暢度。
預加載
preconnet
能夠預先創建鏈接,在須要使用時直接獲取資源。<link preconnet href="https://www.wddsss.com/a.js"/>
<link prefetch href="https://www.wddsss.com/a.html" />
css優先下載
骨架屏:骨架屏就是在頁面數據還沒有加載前先給用戶展現出頁面的大體結構,經常使用在比較規則的列表頁面,能夠本身設計也可以使用已有的解決方案。
動畫優化
will-change: transform
, will-change: contents
transform
、opacity
等,減小使用box-shadow
等消耗較大的屬性動畫。佈局信息
則會打亂這裏過程,迫使瀏覽器將暫存的全部渲染操做優先執行,而後獲取最新的渲染狀態,如獲取元素的offsetTop、clientTop
等。setInterval
中實現,setInterval中的代碼並非嚴格意義上的定時執行,有可能形成性能問題,requestAnimationFrame則充分利用了屏幕的刷新機制,可使用此API代替setInterval
。服務端渲染
web worker: 使用web woker處理耗時操做,在執行完成後將結果通知主線程便可,web woker優化可讓用戶的交互及時響應,不至於被耗時的js執行阻止界面渲染。
DOM
CSS
事件
本次的優化指南從代碼的執行到網站的加載,從構建的優化到資源傳輸,羅列了一組優化清單,你能夠經過逐條對比的方式找到本身網站的優化空間。因爲篇幅問題,其中多數內容都只是總結輸出一筆帶過,並不涉及具體如何優化細節,能夠自行經過本身搜索或超連接閱讀。
性能的優化應該始於一個完善的檢測系統,而且有健全的度量過程,且必需要清楚,對於網站的一次優化重構,具體帶來了怎樣的性能提高?整個優化過程最好是一個有計劃且有目標的,你須要清楚這次優化的目的,和目標性能的提高,這不是盲目的。
權衡你的站點,權衡時間和收益,首先列出優先級最高的優化清單,而後就去作吧!
最後給你們推薦一網站,熱點檢索專用,站長高產似那啥,你想看的站點都有。戳我查看