過程:
html是最先被傳到客戶端贫母,將字節(jié)流轉(zhuǎn)換成字符流憋飞,通過瀏覽器端的詞法分析,將響應(yīng)的語法分析成相應(yīng)的token(將標(biāo)簽解析成對象),不斷通過next token 添加到DOM樹里去疾牲。當(dāng)dom樹和css樹都有了才會生成渲染樹嬉愧。
因?yàn)槲覀兊馁Y源大部分都托管在CDN上,所以我們一般設(shè)置3-4個CDN域名剂碴,防止一個CDN域名的情況下把将,web瀏覽器外部請求數(shù)達(dá)到上限,導(dǎo)致沒有做到所有資源的并發(fā)請求忆矛。
如果把css放在head中察蹲,可以避免無樣式的閃爍,這樣的話當(dāng)dom樹和css樹都生成完成才會生成渲染樹催训,再進(jìn)行頁面的渲染
html渲染過程的特點(diǎn)
1.順序執(zhí)行洽议,并發(fā)加載,并發(fā)上限(對某個域名下的并發(fā)請求樹是有上限的)
2.是否阻塞
3.依賴關(guān)系
4.引入方式
css阻塞
1)css head中引入會阻塞頁面的渲染 2)css阻塞js的執(zhí)行(在css加載完之前漫拭,后續(xù)的js不能執(zhí)行亚兄,被阻塞)? ?3)css不阻塞外部腳本的加載
(如果css不阻塞頁面渲染,那么開始會渲染一版初始樣式采驻,css加載后又加載一版新的审胚,造成閃動,體驗(yàn)很不好礼旅,所以css需要阻塞頁面渲染)
(如果css不阻塞js的執(zhí)行膳叨,因?yàn)閖s中可能會有一些獲取樣式或者修改的內(nèi)容,瀏覽器是需要計(jì)算的痘系,也就是依賴css)
js阻塞
1)直接引入的js阻塞頁面的渲染(沒有用ansyc,defer)? 2)js不阻塞資源的加載(預(yù)先掃描器,預(yù)資源加載器)? 3)js順序執(zhí)行菲嘴,阻塞后續(xù)js邏輯的執(zhí)行(保持引入時的依賴關(guān)系)
(js會阻塞dom解析,如果js文件比較大汰翠,加上defer和ansyc之后不阻塞了)
(瀏覽器會提前看DOM的內(nèi)容龄坪,如果碰到<link><script><img>會提前下載)
(每次碰到scripte標(biāo)簽時,頁面都會渲染)
(js的下載和js的的執(zhí)行都會阻塞頁面的渲染奴璃,dom樹解析到非異步的外聯(lián)js時會阻塞住悉默,在它加載且執(zhí)行完之前,不會往下解析dom樹)