前端综合

JS相关概念总结

2017-08-11  本文已影响0人  _Dot912

简单介绍JavaScript的发展历史

JavaScript因互联网而生,回顾它的历史要从浏览器的历史讲起。

简述网页的渲染机制

  1. 解析HTML标签,构建DOM树
  2. 解析CSS标签,构建CSSOM树
  3. 把DOM和CSSOM组合成渲染树
  4. 在渲染树的基础上布局,计算每个节点的几何结构
  5. 把每个节点绘制到屏幕上

CSS和JS在网页中的放置顺序是怎样的?

  1. css放入head中,link引入样式表和写在head內的style标签里都可以,也可以直接在元素中写入样式,但注意要放在js脚本之前。

  2. js放置位置:

原因:当文档加载过程中遇到JS文件,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因,即无论当前JS代码是内嵌还是在外部文件中,页面的下载和渲染都必须停下来等待脚本执行完成,JS执行过程越久,浏览器等待响应用户输入的时间就越长,所以尽量把JS放在底部、设置script标签的defer或async属性、合并脚本等方法可起到性能优化效果。

解释白屏和FOUC

  1. 白屏:
  1. FOUC:
    Flash of unsettled content:无样式内容闪烁。对IE来说,把样式放在底部时,在某些场景下(如点击链接、输入URL、使用书签进入等)页面会出现FOUC现象,具体表现为逐步加载无样式的内容,等CSS加载完成后页面突然展现样式;对Firefox来说会先显示已加载的html内容,再逐步加载无样式内容,等css全部加载完成后页面突然展现样式,所以Firefox会一直表现出FOUC。

async和defer的作用是什么?有什么区别

async和defer用于异步或延迟加载脚本。
没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是读到就加载并执行。也就是说脚本会阻塞其后内容的解析和执行。

  1. 作用:
<!DOCTYPE html>
<head>
    <title>Example HTML Page</title>
    <script type="text/javascript" async src="example1.js"></script> 
    <script type="text/javascript" async src="example2.js"></script>
</head>
<body>
    <!-- 这里放内容 --> 
</body>
</html>

以上代码中evample2.js可能会在example1.js之前执行,所以确保二者之间互不依赖很重要。

<!DOCTYPE html>
<head>
    <title>Example HTML Page</title>
    <script type="text/javascript" defer src="example1.js"></script>
    <script type="text/javascript" defer src="example2.js"></script>
</head>
<body>
    <!-- 这里放内容 -->
</body>
</html>

以上代码中虽然我们把<script>放在了<head>中,但其中包含的脚本文件将延迟到浏览器遇到</html>后再执行。HTML5规范要求脚本按照它们出现的先后顺序执行,即第一个延迟脚本先于第二个延迟脚本执行,而这两个脚本会先于DOMContentLoaded事件执行,但现实中延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行,所以一个文档里最好只包含一个延迟脚本。

async-VS-defer-图片来自文章最底部参考资料

上图的意思是:浏览器在解析HTML文件时,遇上没有设置defer或async属性的脚本,浏览器读到该脚本就加载并执行,脚本会阻塞其后内容的执行;
遇上设有async属性的脚本,会在HTML解析过程中下载该脚本,并在完成下载后暂停HTML的解析来执行这个异步脚本,直到执行完成后再继续HTML的解析;
遇上设有defer属性的脚本,会在HTML解析过程中下载该脚本,在HTML解析完成后才执行该文件。延迟脚本按照它们在文档中出现的顺序执行。

  1. 共同点:
  1. 区别:
  1. 关联:
  1. 注意事项:
    如果一个外部脚本依赖于另一外部脚本,请将它们标记为defer,并按它们被声明的顺序执行。
    浏览器发起资源请求request的时间都比较接近,除非DOM树非常长,时间可能会有明显差别。但资源响应时间responsive的时间差别较大,浏览器会根据情况作出优化,图片字体等优先级较低,一般等到最后才加载完成(比js还久)。

repaint 和 reflow

浏览器解析和渲染页面过程中会涉及到reflow(回流)和repaint(重绘),就某些浏览器如Opera而言,大部分的reflow将导致页面重新渲染,其变化涉及到部分甚至是整个页面的布局,而repaint则导致浏览器必须验证DOM树上其他节点元素的可见性。reflow和repaint过程非常消耗性能,尤其在移动设备上,会破坏用户体验,造成页面卡顿,所以应尽可能减少reflow和repaint。

关于浏览器渲染更详细内容可参考我的博客第六节


参考资料

上一篇 下一篇

猜你喜欢

热点阅读