美文网首页
浏览器加载机制 & 白屏和FOUC演示

浏览器加载机制 & 白屏和FOUC演示

作者: antimony | 来源:发表于2019-03-13 16:37 被阅读0次

    如何异步加载脚本?

    <script src="script.js"></script>
    

    没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。

    <script async src="script.js"></script>
    

    有 async,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。

    <script defer src="script.js"></script>
    

    有 defer,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。

    defer:脚本延迟到文档解析和显示后执行,有顺序
    async:不保证顺序


    ES3、ES5、ES6分别指什么?

    1997年7月,ECMAScript 1.0发布。

    1998年6月,ECMAScript 2.0版发布。

    1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。

    2007年10月,ECMAScript 4.0版草案发布,对3.0版做了大幅升级,预计次年8月发布正式版本。草案发布后,由于4.0版的目标过于激进,各方对于是否通过这个标准,发生了严重分歧。以Yahoo、Microsoft、Google为首的大公司,反对JavaScript的大幅升级,主张小幅改动;以JavaScript创造者Brendan Eich为首的Mozilla公司,则坚持当前的草案。

    2008年7月,由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激进,ECMA开会决定,中止ECMAScript 4.0的开发(即废除了这个版本),将其中涉及现有功能改善的一小部分,发布为ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版本,由于会议的气氛,该版本的项目代号起名为Harmony(和谐)。会后不久,ECMAScript 3.1就改名为ECMAScript 5。

    2009年12月,ECMAScript 5.0版正式发布。Harmony项目则一分为二,一些较为可行的设想定名为JavaScript.next继续开发,后来演变成ECMAScript 6;一些不是很成熟的设想,则被视为JavaScript.next.next,在更远的将来再考虑推出。TC39的总体考虑是,ECMAScript 5与ECMAScript 3基本保持兼容,较大的语法修正和新功能加入,将由JavaScript.next完成。当时,JavaScript.next指的是ECMAScript 6。第六版发布以后,将指ECMAScript 7。TC39预计,ECMAScript 5会在2013年的年中成为JavaScript开发的主流标准,并在此后五年中一直保持这个位置。

    2011年6月,ECMAscript 5.1版发布,并且成为ISO国际标准(ISO/IEC 16262:2011)。到了2012年底,所有主要浏览器都支持ECMAScript 5.1版的全部功能。

    2013年3月,ECMAScript 6草案冻结,不再添加新功能。新的功能设想将被放到ECMAScript 7。

    2013年12月,ECMAScript 6草案发布。然后是12个月的讨论期,听取各方反馈。

    2015年6月,ECMAScript 6正式发布,并且更名为“ECMAScript 2015”。这是因为TC39委员会计划,以后每年发布一个ECMAScirpt的版本,下一个版本在2016年发布,称为“ECMAScript 2016”。

    除了ECMAScript的版本,很长一段时间中,Netscape公司(以及继承它的Mozilla基金会)在内部依然使用自己的版本号。这导致了JavaScript有自己不同于ECMAScript的版本号。1996年3月,Navigator 2.0内置了JavaScript 1.0。JavaScript 1.1版对应ECMAScript 1.0,但是直到JavaScript 1.4版才完全兼容ECMAScript 1.0。JavaScript 1.5版完全兼容ECMAScript 3.0。目前的JavaScript 1.8版完全兼容ECMAScript 5。


    解释浏览器的渲染机制

    浏览器解析流程.png

    这张图应该可以很好理解,归纳为四个步骤:

    1、解析HTML以构建DOM树:渲染引擎开始解析HTML文档,转换树中的html标签或js生成的标签到DOM节点,它被称为 -- 内容树。
    2、构建渲染树:解析CSS(包括外部CSS文件和样式元素以及js生成的样式),根据CSS选择器计算出节点的样式,创建另一个树 —- 渲染树。
    3、布局渲染树: 从根节点递归调用,计算每一个元素的大小、位置等,给每个节点所应该出现在屏幕上的精确坐标。
    4、绘制渲染树: 遍历渲染树,每个节点将使用UI后端层来绘制。


    repaint 和 reflow 分别指什么

    对于DOM结构中的各个元素都有自己的盒子(模型),这些都需要浏览器根据各种样式(浏览器的、开发人员定义的等)来计算并根据计算结果将元素放到它该出现的位置,这个过程称之为reflow;当各种盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来后,浏览器于是便把这些元素都按照各自的特性绘制了一遍,于是页面的内容出现了,这个过程称之为repaint。
    可见这两个东东对浏览器渲染页面是很重要的啊,都是会影响性能的,因此我们需要了解一些常见的会引起repaint和reflow的一些操作,并且应该尽量减少以提高渲染速度。


    解释白屏和 FOUC。

    浏览器在渲染的时候没有请求到或请求时间过长造成的,那么浏览器会如何应对呢?
    一般分浏览器会采取二种方式针对这样的情况

    • 白屏
    • FOUC (Flash of Unstyled Content)无样式内容闪烁

    白屏
    CSS全部载入解析完后渲染展示页面。如果没有加载完,就会出现白屏
    FOUC (Flash of Unstyled Content)无样式内容闪烁
    CSS未完全加载前,会先渲染显示已经解析的HTML内容,然后CSS完全加载完成后,再次渲染。

    (逐步载入无样式的内容,等CSS载入后页面才突然展现出样式)


    【动手题】 把视频里关于白屏和无样式内容删除的测试代码下载到本地,动手演示白屏和FOUC 效果。

    GitHub 代码:https://github.com/jirengu-inc/whitescreen-fouc-test

    屏幕快照 2019-03-13 下午4.33.59.png
    屏幕快照 2019-03-13 下午4.35.39.png

    相关文章

      网友评论

          本文标题:浏览器加载机制 & 白屏和FOUC演示

          本文链接:https://www.haomeiwen.com/subject/sprzpqtx.html