DOM阻塞总结

要找实习了,要准备面试了。拿出之前积攒的一些问题点一个一个进行深入的研究,就碰到了这个,一个微信面试题引发的血案 --[译] 什么阻塞了 DOM?。浏览器是怎么样加载css,js,图片的?这个问题卡在这里,当我在写html的时候,引入一个css,script标签,不禁会想到,这个东西会不会阻塞我页面的展示,放在这个位置行吗?困扰了我很久,狠下心来一定要把这个问题搞清楚,不然写代码迷迷糊糊的。

浏览器解析html机制

这个问题水比较深,我看了不少文章,解释的都还行,大体都是dom树的构建,css的渲染,但是并没有解决我的疑惑,在我困惑的一些细节上真心不敢恭维。其实,作为一名前端开发者(。。。好吧,自称前端开发者),我关注的点其实很明确:

  1. 我引入的css会被异步下载还是同步下载,css下载之后是怎么解析的,解析是并行的还是先建一个数据结构存储样式,最后dom树弄完了才进行全部的套用?
  2. 我引入的script是同步下载还是异步下载,script执行的时候会不会暂停Dom树的构建,我的DOMContentLoaded(对应jq中的$().ready)还有onload事件到底是什么时候触发?
  3. 我引入的图片呢?这些应该是异步的吧,没有必要让dom解析去等待吧?

我对浏览器做的工作的一些理解用一句话来说,就 是下载我的资源,解析,生成一个dom树,一个css规则树,然后合成render tree,然后画图,展示到用户面前。DOM Tree 》Render Tree》layout》paint

下面是一些详细的说明,基本能解决上述的问题:

  1. 浏览器下载HTML文件并开始解析DOM
  2. 遇到link[rel=stylesheet]的时候,将其加入资源下载队列,继续解析dom(css没有阻塞dom解析)
  3. 当遇到script的时候,之后有三种情况:
    1. 如果之前的stylesheet没有下载解析完毕,阻塞dom,并行下载js,等待下载解析(关于解析这块我没有弄懂,解析应该是构成css规则树,但是是否参考dom树来完成还是单独完成,这一块没有弄明白)完毕再执行代码。(此时会阻塞dom的解析,css阻塞了js,进而阻塞了dom解析)
    2. 如果没有未下载完成的css,下载script,下载完毕之后立即执行代码。(这中间的过程包括下载和执行都会阻塞dom解析,js阻塞了dom)
    3. script有defer,async标签,下载好之后立即执行(两者下载均不会阻塞dom的解析,defer会在DOMContentLoaded事件之前按照顺序执行,async下载完毕直接执行,两者的执行都会阻塞dom解析,不过defer执行的时候dom的解析就只剩下执行这个script了),执行完之后继续解析dom。关于defer和async,下一节的截图。
  4. 整个dom解析完成,触发DOMContentLoaded。
  5. css下载完毕(有可能在4之前,如果在4之前则进行等待dom解析,如果没有下载完毕,即便dom树已经构建完成,chrome是不会展示页面的,因为render tree没有构建,无法paint),渲染,展示页面(这个就是一般访问国外网站很久都是一片空白的原因,css阻塞了渲染)
  6. 等待图片等别的类似资源加载完毕,触发onload事件

关于defer和async

defer async两者都是使得js的下载不会阻塞dom解析。之所以普通的script的下载会阻塞dom解析,是因为script有可能会改变dom,如果在下载的时候还去解析dom,那下载之后再执行script又改变dom就是一种浪费了,所以浏览器在下载script的时候就阻塞了dom解析。关于defer和async,我觉得下面两幅图就够了。

deferasync区别.jpg

关于执行的顺序,这个图说的很明白:

righttime.jpg

上图没有说的是defer会在DOMContentLoaded事件之前按照顺序执行(多个defer定义的script标签),别的都比较明了了,我就不多说了

总结

  1. css是并行下载,决定了css规则树,render tree的构建,这个如果没有构建好,即便dom解析完毕,也是空白。它并不会直接阻塞dom解析,但是html5规定,如果script标签(非defer,async)前面的css没有下载解析完成,就会等待其完成再执行(可以提前下载)。所以css有可能会间接阻塞dom解析。
  2. js阻塞dom解析,下载以及执行的时候也会停止dom解析,当所有的js加载完毕,dom解析完毕,触发DOMContentLoaded事件,也就是jquery的$().ready事件
  3. js可以通过设置defer,async来异步加载。
  4. 当所有的资源,比如图片,audio等加载完毕会触发window.onload事件

初次对浏览器的加载深入研究,说的不对的地方还请指出!

参考文章

  1. 兼容所有浏览器的DOM载入事件
  2. css载入与DOMContentLoaded事件延迟
  3. 异步脚本载入提高页面性能
  4. css/js对DOM渲染的影响
  5. 浏览器的渲染原理简介
  6. javascript的装载与执行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 简单介绍JavaScript的发展历史 JavaScript因互联网而生,回顾它的历史要从浏览器的历史讲起。 19...
    _Dot912阅读 487评论 0 3
  • 浏览器中script标签加载顺序是如何的呢?这个问题折腾了好几次了,之前弄清楚了以后,觉得做不做笔记的无关紧要,可...
    世事如烟_f411阅读 1,519评论 0 1
  • 数据结构与算法 栈和队列的区别 网络基础 HTTP 无状态怎么理解 可以从REST的角度来理解这个问题。我们知道R...
    笑极阅读 663评论 1 5
  • 译者注:昨天一篇工作仅一年的前端工程师面试几个大厂的文章 引起了很多人的关注。一方面大家觉得作者太厉害了,工作近一...
    接灰的电子产品阅读 3,839评论 21 88
  • 傻鹤把这个app介绍给我已经有好几天了,说是适合我这种喜欢没事写点东西的人。我研究了一会儿,发现搞不懂,就没敢轻...
    我什么也不怕阅读 139评论 1 1