• Luke
    2019-09-25
    CSS不阻塞dom的生成。
    CSS不阻塞js的加载,但是会阻塞js的执行。
    js会阻塞dom的生成,也就是会阻塞页面的渲染,那么css也有可能会阻塞页面的渲染。
    如果把CSS放在文档的最后面加载执行,CSS不会阻塞DOM的生成,也不会阻塞JS,但是浏览器在解析完DOM后,要花费额外时间来解析CSS,而不是在解析DOM的时候,并行解析CSS。
    并且浏览器会先渲染出一个没有样式的页面,等CSS加载完后会再渲染成一个有样式的页面,页面会出现明显的闪动的现象。
    所以应该把CSS放在文档的头部,尽可能的提前加载CSS;把JS放在文档的尾部,这样JS也不会阻塞页面的渲染。CSS会和JS并行解析,CSS解析也尽可能的不去阻塞JS的执行,从而使页面尽快的渲染完成。
    展开
     2
     20
  • Angus
    2019-09-24
    会显示time.geekbang和test,JavaScript代码执行的时候第二个div还没有生成DOM节点,所以是获取不到div2的,页面会报错Uncaught TypeError: Cannot set property 'innerText' of undefined。

    另外复习了下async和defer:

    async:脚本并行加载,加载完成之后立即执行,执行时机不确定,仍有可能阻塞HTML解析,执行时机在load事件派发之前

    defer:脚本并行加载,等待HTML解析完成之后,按照加载顺序执行脚本,执行时机在DOMContentLoaded事件派发之前
    展开
     1
     7
  • mfist
    2019-09-24
    开始看文章的时候就在想如果js获取的dom还没有解析出来,会如何处理,结果思考题就是这个。

    会两行显示,一行是time.geekbang 另外一行是test。原因是script脚本执行的时候获取想不到第二个div,所以不会对后来的div有影响。

    今日总结:
    1. 首先介绍了什么是DOM(表述渲染引擎内部数据结构,它将Web页面和JavaScript脚本连接起来,并过滤不安全内容)、DOM树如何生成(网络进程和渲染进程建立一个流式管道,HTML解析器直接解析,不需要等待text/html类型的接口 接受完毕再进行解析),第一步:通过分词器将字节流转换为Token;第二步:将Token解析为DOM节点;第三步:将DOM节点添加到DOM树中。
    2. JavaScript是如何影响DOM生成的?暂停html解析,下载解析执行完毕js之后再进行html解析(如果这期间使用到了cssDom,需要等待相应css过程)。预解析线程的优化(提前加载相应js css文件)
    3. 渲染引擎还有一个安全检查模块XSSAuditor用来检测词法安全的
    展开
    
     3
  • 忘忧草的约定
    2019-11-16
    老师请问一下:主线程在parseHtml时,是不是没办法执行执行paint等操作、那这时候页面又是如何绘制出来的呀?

    作者回复: 如果正在执行ParserHTML,那么页面只会显示之前绘制好的内容,举个极端点的例子,比如ParserHTML占用了主线程10秒,那么这10秒内,页面都不会发生新的绘制操作,也就是页面卡顿了10秒!

    
     1
  • Peter Cheng
    2019-09-25
    针对文章中js和css加载我有一个疑问。
    <head>
    <link ref="a.css">
    <script src="b.js"></scripit>
    <link ref="c.css">
    </head>
    这三个资源的加载顺序是什么。按照老师文章中的意思,是先加载css文件,再加载js文件吗。
    即a.css,c.css,b.js。
    展开
     5
     1
  • 王大可
    2019-09-24
    time.geekbang
    test
    把script标签包裹的代码放入一个js文件中,在引入该文件
    1. 放入第一个div之前页面显示
    1
    test
    控制台报错;
    2. 放入最后一个div之前页面显示
    time.geekbang
    time.geekbang.com ;
    3.放入任何位置加入defer或async 显示
    time.geekbang
    time.geekbang.com
    展开
    
     1
  • 玉皇大亮
    2020-02-03
    展示内容为
    time.geekbang
    test
    浏览器首先完成<div>1</div>节点的渲染,然后遇到script脚本,执行脚本中的内容,操作div[0]节点并将内部内容改变为time.geekbang,执行let div2 = document.getElementsByTagName('div')[1]语句时,因为script脚本阻塞了之后DOM的渲染,因而找不到div2,div2为undefined,因此无法赋值,脚本执行完成后,继续渲染<div>test</test>,得到test内容
    展开
    
    
  • 不二
    2020-01-08
    老师,思考题有个疑问:首先html解析器,解析到完<div>1</div>,此时dom树里是没有<div>test</div>的,然后开始i 解析script标签,在解析过程中,发现<div>test</div>找不到,所以此时js会报错,既然此时js报错了,不会阻止后面其他dom的生成吗?为什么页面<div>test</div>还是显示了出来?求解答
    
    
  • 玉皇大亮
    2020-01-03
    页面会显示
    time.geekbang
    test
    因为在获取第二个div时,对应的DOM还没有生成,被JS脚本阻塞了,因此div2为undefined,无法赋值
    
    
  • -_-_aaa
    2019-12-28
    在一个没有引用外部css资源的页面,把script(里面是工具函数库)标签放在html标签上,head标签上,body和html结束标签之间,html结束标签后,浏览器的首次加载时间是一样的,都会预解析下载脚本,解析完脚本才会首屏渲染?
    
    
  • 极客时间
    2019-12-10
    1、html页面中如果只引入了css没有引入js,那么css不会组织html解析dom。
    2、html页面中如果同时引入了css和js,那么由于css会阻塞js的执行,那么css会间接阻塞html解析dom。
    不知道这个结论是否正确。
    
    
  • 番茄
    2019-11-05
    老师,dom 操作怎么和渲染事件关联起来,比如一段js代码中有 div1.style.color = 'red',我测试了一下,是立刻生效的,但是当前js还没有执行完。dom 操作不应该生成一个宏任务,再执行吗?
    
    
  • Lx
    2019-10-20
    即使js脚本设置了a sync defer,也还是会被css的文件下载阻塞吧?
    
    
  • Lx
    2019-10-20
    从安全视角来看,DOM 是一道安全防护线,一些不安全的内容在 DOM 解析阶段就被拒之门外了。

    这句话怎么理解呢
    
    
  • Cris
    2019-10-15
    额外说明一下,渲染引擎还有一个安全检查模块叫 XSSAuditor,是用来检测词法安全的。老师XssAuditor也是渲染进程里的一个线程吗?
    
    
  • 欣欣向荣的万七七
    2019-10-02
    讲得太赞了!一直以来我都只记着加载表现结果(大部分文章都并不知道细节原因,而只能从做测试得到的结果来推测)。而老师的视角则可以从运行时进行讲解 这种知识是很难得的呀~
    
    
  • 蓝配鸡
    2019-09-28
    思考题看法:
    会生成
    time.geekbang
    Test

    第二段js没有执行成功是因为在那个时间节点还找不到第二个div
    展开
    
    
  • 木瓜777
    2019-09-27
    您好,网络进程接收到响应头之后,会根据请求头中的 content-type 字段来判断文件的类型,比如 content-type 的值是“text/html”!
    这个地方应该是根据响应头判断文件类型吧?

    作者回复: 嗯 是响应头,我改过来

    
    
  • 叫我大胖就好了
    2019-09-26
    我看MDN写的是defer在DOMContentLoaded 前执行

    作者回复: 你是对的,我写错了。

    
    
  • Hurry
    2019-09-26
    Token 栈,遇到结束标签,但是栈顶刚好不是对应开始标签, 这种错误,解析器,如何处理?
    
    
我们在线,来聊聊吧