美文网首页前端面试题全汇总
前端面试题总结【46】:哪些地方会出现css阻塞,哪些地方会出现

前端面试题总结【46】:哪些地方会出现css阻塞,哪些地方会出现

作者: 前端老司机 | 来源:发表于2020-06-29 14:48 被阅读0次

    js 的阻塞特性:所有浏览器在下载 JS 的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等。直到 JS 下载、解析、执行完毕后才开始继续并行下载其他资源并呈现内容。为了提高用户体验,新一代浏览器都支持并行下载 JS,但是 JS 下载仍然会阻塞其它资源的下载(例如.图片,css文件等)。
    由于浏览器为了防止出现 JS 修改 DOM 树,需要重新构建 DOM 树的情况,所以就会阻塞其他的下载和呈现。
    嵌入 JS 会阻塞所有内容的呈现,而外部 JS 只会阻塞其后内容的显示,2 种方式都会阻塞其后资源的下载。也就是说外部样式不会阻塞外部脚本的加载,但会阻塞外部脚本的执行。

    CSS 怎么会阻塞加载了?CSS 本来是可以并行下载的,在什么情况下会出现阻塞加载了(在测试观察中,IE6CSS 都是阻塞加载)
    CSS 后面跟着嵌入的 JS 的时候,该 CSS 就会出现阻塞后面资源下载的情况。而当把嵌入 JS 放到 CSS 前面,就不会出现阻塞的情况了。
    根本原因:因为浏览器会维持 htmlcssjs 的顺序,样式表必须在嵌入的 JS 执行前先加载、解析完。而嵌入的 JS 会阻塞后面的资源加载,所以就会出现上面 CSS 阻塞下载的情况。

    嵌入JS应该放在什么位置?

    1. 放在底部,虽然放在底部照样会阻塞所有呈现,但不会阻塞资源下载。
    2. 如果嵌入JS放在head中,请把嵌入JS放在CSS头部。
    3. 使用 defer(只支持IE
    4. 不要在嵌入的JS中调用运行时间较长的函数,如果一定要用,可以用 setTimeout 来调用

    Javascript无阻塞加载具体方式:

    1. 将脚本放在底部。<link>还是放在head中,用以保证在js加载前,能加载出正常显示的页面。<script>标签放在</body>前。
    2. 阻塞脚本:由于每个<script>标签下载时阻塞页面解析过程,所以限制页面的<script>总数也可以改善性能。适用于内联脚本和外部脚本。
    3. 非阻塞脚本:等页面完成加载后,再加载js代码。也就是,在 window.onload 事件发出后开始下载代码。
    4. defer属性:支持IE4fierfox3.5更高版本浏览器
    5. 动态脚本元素:文档对象模型(DOM)允许你使用js动态创建HTML的几乎全部文档内容。代码如下:
    <script>
        var script=document.createElement("script");
        script.type="text/javascript";
        script.src="file.js";
        document.getElementsByTagName("head")[0].appendChild(script);
    </script>
    

    此技术的重点在于:无论在何处启动下载,文件额下载和运行都不会阻塞其他页面处理过程,即使在head里(除了用于下载文件的 http 链接)。

    推荐:

    • 持续更新,致力于做一个持久的搬运工!
    • 下面是已经整理好的面试题PDF获取和相关进阶学习书籍资料地址,有需求戳一下
    • 2020前端面试题总结合集

    相关文章

      网友评论

        本文标题:前端面试题总结【46】:哪些地方会出现css阻塞,哪些地方会出现

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