在先後端分離這個概念還沒出現的時候,一個團隊開發網站的時候是這樣來開展工做的:javascript
那個時候的前端開發叫作網頁製做,只是簡單的開發網站的結構和樣式,而後提交給後端,後端進行數據綁定;後端經過
jsp
、php
或asp
的語法來實現數據綁定。php
這種服務端渲染時,瀏覽器拿到的既有數據也有樣式,能夠直接展現出來,可是這樣對服務器的壓力太大了,而且這個時候的頁面不能實現局部刷新的功能;可是服務端渲染有利於
SEO
優化。css
SEO
:百度/谷歌瀏覽器會不定時開啓一個爬蟲(搜索引擎搜錄)爬取網站上的內容,收錄的內容越多,網站的權重越大(不一樣標籤的權重不一樣,因此標籤語義化有利於提升網站的權重),可是爬蟲只會爬取源代碼中存在的信息,例如客戶端渲染的技術就會致使源代碼裏面沒有內容,不利於優化。html
SEO
優化。jsp
等技術,後端不會html
、css
等技術,配合起來難度很高。隨着時代的發展,在服務器渲染以後出現了客戶端渲染技術,實現了先後端分離,解放了服務器的巨大壓力,瀏覽器首次獲取的只有結構和樣式,並無動態綁定的數據;數據是在後面的
ajax
請求中才返回回來,由客戶端本身渲染,完成數據的綁定。前端
AJAX
實現局部刷新效果;js
動態綁定的數據,在源代碼中沒有值,不利於SEO
優化。SEO
的部分服務器渲染,其餘地方客戶端渲染(再或者第一次服務器渲染,後期操做想要局部刷新,再交給客戶端渲染) => SSR
服務器渲染; vue
->nuxt.js
react
->next.js
所謂白屏,就是當前設備打開頁面,第一步從服務器請求回來HTML,而後渲染,渲染過程當中請求CSS資源,生成DOM樹、CSSOM樹、Render-Tree渲染樹,最後整個渲染頁面,這個過程是須要時間的,從請求頁面到整個全部東西沒有完成以前所經歷的時間會產生一個白屏的效果。 白屏優化:減小第一次頁面渲染時間,包括後續打開時間,這些優化就是項性能優化的關鍵點。vue
爲了提升性能;Webkit
瀏覽器預測解析:chrome
的預加載掃描器html-preload-scanner
經過掃描節點中的「src」
, 「link」
等屬性,找到外部鏈接資源後進行預加載,避免了資源加載的等待時間,一樣實現了提早加載以及加載和執行分離。java
DOM
樹的渲染時間(HTML層級不要太深,注意標籤語義化);CSSOM
樹渲染時間(選擇器是從右向左解析,因此儘量減小使用選擇器的層級【less
/sass
雖然好用可是是個大坑】);SSR
骨架屏所提升的渲染是避免了客戶端再次單獨請求數據,而不是樣式和結構上的(首屏處理);defer
或者async
;DOM
迴流和重繪;repaint
和重繪reflow
迴流必定會觸發重繪,可是重繪不必定觸發迴流。react
優化:放棄操做DOM
,分離讀寫,集中式改變。ajax
現代版瀏覽器存在一個渲染隊列機制,對於修改樣式的操做會存放到渲染隊列中,接着執行代碼,若是仍是修改代碼的繼續添加進去(只要不是獲取元素樣式直接無視),直到代碼是獲取元素樣式或者執行結束爲止,最後當即把隊列中的樣式統一進行渲染,最後只引起一次迴流重繪。chrome
box.style.width = '200px';
box.style.height = '200px';
// 這樣只觸發一次迴流
box.style.width = '200px';
box.offsetWidth;
box.style.height = '200px';
// 這樣觸發兩次迴流
box.cssText = 'width:200px;height:200px;'
// 這樣只觸發一次迴流
複製代碼
緩存佈局信息和元素批量修改:
for (let i = 0; i < 10; i++) {
let span = document.createElement('span');
span.innerHTML = i;
document.body.appendChild(span);
}
// 這樣會觸發十次迴流
let frg = document.createDocumentFragment();
for (let i = 0; i < 10; i++) {
let span = document.createElement('span');
span.innerHTML = i;
frg.appendChild(span);
}
document.body.appendChild(frg);
// 這樣利用文檔碎片只觸發一次迴流;用字符串拼接也能實現相同效果
複製代碼