1.1查找瀏覽器自身的DNS緩存
1.2沒有找到條目,瀏覽器會搜索操做系統自身的DNS緩存
1.3若是在DNS緩存也沒有找到,那麼嘗試讀取hosts文件
(位於C:\Windows\System32\drivers\etc)
1.4若是hosts文件也沒有找到,瀏覽器就會發起DNS解析請求,直到找到對應的IP地址
複製代碼
瀏覽器向web服務器發起TCP鏈接請求: 發起TCP的3次握手
複製代碼
瀏覽器會經過TCP鏈接向遠程服務器發送HTTP請求
複製代碼
服務器端處理請求,返回html文件
複製代碼
解析html文件,加載js,css,image等靜態資源
向服務器端請求下載,會使用多線程去下載,不一樣瀏覽器之間線程數不同
能夠用上keep-alive特性,創建一次HTTP鏈接,連續請求多個靜態資源
好比: link標籤,發送請求獲取css
script標籤,發送請求獲取js
img標籤,發送請求獲取image圖片
複製代碼
合併:減小HTTP請求的數量javascript
壓縮:減小請求資源的大小css
html壓縮:壓縮在文本文件中有意義,可是在html中不顯示的字符,包括空格,製表符,換行符等, 還有壓縮一些其餘意義的字符,如HTML註釋html
方式:
1. 在線網站壓縮
2. nodejs提供了html-minifier工具
複製代碼
css壓縮: 無效代碼刪除 css語義合併前端
方式:
1. 使用clean-css對cssj進行壓縮
2. 使用html-minifier對html中的css進行壓縮
複製代碼
js壓縮與混亂: 無效字符的剔除: 好比註釋回車空格,好比無效的變量 剔除註釋 代碼語義的縮減和優化: 好比變量名稱特別長sommmmesuisan, 壓縮爲s變量 代碼保護: 代碼的混亂對前端代碼的保護,將代碼的風格變的混亂下降可讀性vue
方式:
1. 使用uglifyjs2對jsj進行壓縮
2. 使用html-minifier對html中的js代碼進行壓縮
複製代碼
文件合併:java
文件合併的帶來的問題:
1. 首屏渲染問題: 首屏js文件加載過長,好比vue就會出現這樣的狀況
2. 緩存失效問題: a17abdh12.js 和b128hsg12h.js兩個文件合併後,若是
a17abdh12.js發生了變化,那麼這兩個文件合併後的js文件確定也會變化
。致使用戶在訪問網站的時候以前緩存的js文件失效。
真實場景:
1. 通常公共庫會合併成一個文件,業務代碼會合併爲一個文件。公共庫修改
很是少,而業務代碼變更的可能性很是高,因此業務代碼改動不會影響
到公共庫代碼的緩存的失效。
方式:
1. 利用nodejs實現文件合併,好比webpack來進行合併
複製代碼
開啓gzip:node
服務端開啓gzip壓縮,縮小文件大小,瀏覽器獲取到gzip文件後在解壓縮
複製代碼
png8/png24/png32之間的區別
1. png8 --- 256色 + 支持透明 + 文件小不少
2. png24 --- 2^24色 + 不支持透明 + 文件大不少
3. png32 --- 2^24色 + 支持透明 + 文件最大
備註:每種圖片格式都有本身的特色,針對不一樣的業務場景選擇不一樣的圖片格式很是重要
不一樣格式圖片經常使用的業務場景:
1. jpg有損壓縮,文件體積小,不支持透明 ---大部分不須要使用透明圖片的場景
2. png支持透明,瀏覽器兼容性好 --- 大部分須要使用透明圖片的場景
3. webp壓縮體積最小,可是兼容性存在問題 --- ios支持存在問題,安卓嘗試使用
4. svg矢量圖,代碼內嵌,相對較小,圖片樣式相對簡單的場景 --- 圖片樣式相對簡單的場景
複製代碼
css雪碧圖,整合到一張圖片上,減小網站的HTTP請求數量。帶來的缺點: 整合圖片比較大的時候,一次加載就比較慢了。因此雪碧圖也要控制大小webpack
Image inline,將圖片的內容內嵌到html當中,減小網站HTTP請求數量, 也就是base64格式的圖片,直接寫在html中,就不會發送HTTP請求了。ios
使用矢量圖, 使用SVG進行矢量圖的繪製,使用iconfont解決icon問題。web
在安卓下使用webp,圖片體積很是很是小,同時具備無損和有損壓縮。 在使用webp應該採用降級方式,若是支持使用webp,不然默認仍是使用jpg。
瀏覽器解析html標籤渲染成DOM樹,當加載到link標籤,會併發的向服務器發送css的資源請求。 當加載到script標籤,會向服務器請求js資源,對css進行解析後結合DOM樹生成渲染樹,接着進行佈局,而後繪製。
順序執行, 併發加載
是否阻塞
1. head標籤中阻塞頁面渲染
推薦使用link標籤的方式在head中在html中引入
2. css不阻塞外部腳本js的併發加載,可是會阻塞外部腳本js的執行
由於js在操做DOM的時候,有可能涉及到css樣式的修改,而這個css樣式的修改
是基於以前css樣式的渲染。因此在css代碼渲染完畢,纔會進而執行js代碼,
也就是css代碼阻塞了外部js的執行
複製代碼
1. 直接引入的js阻塞頁面的渲染,好比<script src='a.js'></script>
js代碼中頗有可能去調用document.write方法來修改DOM文檔的結構,
因此須要等待js代碼執行完畢,進而去繼續執行html標籤的分析,
因此js腳本代碼中不要出現document.write這樣的代碼
2. js不阻塞外部資源的加載
3. js順序執行,會阻塞後續js邏輯的執行
舉個例子:<script src='a.js'></script>
<script src='b.js'></script>
按照這樣的順序引入,會在a.js裏面的代碼執行完畢接着執行b.js裏面的代碼
由於js的執行是單線程的,也就是b.js裏面執行的代碼能夠依賴a.js中的代碼
複製代碼
引入方式
1. 直接引入
2. defer: 確保全部的DOM樹都生成
3. async:不能確保腳本js文件之間的依賴關係,因此async引入的js腳本不能存在依賴關係
4. 異步動態引入js: 在須要某個js文件的時候,經過生成script標籤來引入
複製代碼
function loadScript(src) {
let ele = document.createElement('script');
ele.type = 'text/javascript';
ele.src = src
document.body.appendChild(ele)
}
loadScript('demo.js')
複製代碼
懶加載
預加載
迴流(reflow): 當render tree中的一部分由於元素尺寸,佈局,隱藏等改變而須要從新構建,稱爲迴流。 當頁面佈局和幾何屬性改變時就會迴流。
width, height, padding, margin,display,border-width, border,min-height
複製代碼
top, bottom, left, right, position, float, clear
複製代碼
text-align, overflow-y, font-weight, overflow, font-family, line-height
vertical-align, white-space, font-size
複製代碼
重繪:當render tree中一些元素須要更新屬性,而這些屬性只是影響元素顏色風格,而不影響佈局的,好比background-color,color等 稱爲重繪。
color, border-style, border-radius, visibility, text-decoration, background,
background-size, background-image,background-position, background-repeat,
outline-color, outline, outline-style, box-shadow
複製代碼
重繪迴流優化方式:
translate 替換top的變化
translate不會觸發迴流,top會觸發迴流
opacity 替換visiblity
visiblity只會觸發重繪的過程,opacity不會觸發重繪的過程
// bad
setTimeout(() => {
document.getElementById('box').style.visiblity = 'hidden'
}, 2000)
// good
#box {
width: 100px;
height: 100px;
background: red;
transform: translateZ(0); // 在瀏覽器的層面創建一個新圖層
opacity: 1;
}
setTimeout(() => {
document.getElementById('box').style.opacity = 0
})
複製代碼
不要一條一條的地修改DOM的樣式,預先定義好class,而後修改DOM的ClassName
// bad
var box = document.getElementId('box')
setTimeout(() => {
box.style.width = '200px';
box.style.height = '200px';
box.style.background = 'red'
})
// good
.box {
width: 200px;
height: 200px;
background: red;
}
setTimeout(() => {
box.classList.add('box');
})
複製代碼
.box {
transform: translateZ(0);
transform: translate3d(0,0,0); // 啓用GPU硬件加速
}
```
複製代碼