【面试题】浅谈css加载是否会造成阻塞

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【面试题】浅谈css加载是否会造成阻塞

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库

示例


话不多说

先看代码:

<!DOCTYPE html><htmllang="en"><head><title>css阻塞</title><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1"><style>h1 {
        color: red !important
      }
    </style><script>functionh () {
        console.log(document.querySelectorAll('h1'))
      }
      setTimeout(h, 1)
    </script><linkhref="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css"rel="stylesheet"></head><body><h1>这是红色的</h1></body></html>

假设

假设如果css阻塞DOM的解析和渲染:

那么执行完上述代码后,在bootstrap加载出来之前,页面上是白屏的,而且控制台打印的是空数组

代码中的16行其实有点问题,跟网速有关系,只要定时器设置的描述比bootstrap加载的时间少就可以,而且会出现这种问题:

人家博客上是没有说的,重新刷新测试要把这个缓存去掉

ctrl+F5刷新,能跳过强缓存和协商缓存,直接从服务器拉取资源

浏览器的缓存机制

然后这边我浅说一下浏览器的缓存机制

在我发现有缓存没法再次通过刷新请求服务器资源来查看加载延时的时候,我发现这个文件夹的size栏出现了memory cache也就是内存缓存

从存储位置来看,浏览器缓存一共分为四种,并且各自有优先级,当依次查找缓存且都没有命中的时候,才会去请求网络。

  • Service Worker
  • Memory Cache
  • Disk Cache
  • Push Cache

一旦我们关闭 Tab 页面,内存中的缓存也就被释放了

当我关掉了这个页面,并且把地址复制到新开的tab然后回车,发现缓存变成了这样:

Disk Cache 也就是存储在硬盘中的缓存,读取速度慢点,但是什么都能存储到磁盘中, *比之 Memory Cache 胜在容量和存储时效性上。 *它会根据 HTTP Herder 中的字段判断哪些资源需要缓存,哪些资源可以不请求直接使用,哪些资源已经过期需要重新请求。并且即使在跨站点的情况下,相同地址的资源一旦被硬盘缓存下来,就不会再次去请求数据。绝大部分的缓存都来自 Disk Cache。

这就解释了为什么变成了disk cache而不是原来的memory cache

现象

但实际上的现象是:

bootstrap.css加载完之后,页面上才出现红色的文字,说明css加载会阻塞DOM的渲染,但是控制台能打印出h1,说明不会阻塞DOM的解析

然后我们来看这张图:

推理

我们可以看到,DOM树的解析和CSSOM的解析是两个独立的过程,不挨边儿,这也解释了为什么css加载不会阻塞DOM带的解析

但是到了Render Tree就不一样了,这边构造的渲染树,会受到前面步骤的影响,也就是css加载速度会影响到DOM的渲染,刚刚在浏览器中故意降低了网速,测试后发现,在首次加载时,页面会有一段时间的白屏后才出现网页内容

结论

所以,在真实项目的开发中,要尽量避免css加载时间过长,而导致页面加载时长时间的白屏,影响用户体验

性能优化

这就又涉及到了性能优化

那么在css加载上前端能进行什么样的性能优化捏:(提高css加载速度)

  1. 减少http请求数,将多个css文件合并
  2. 使用CDN( 因为CDN会根据你的网络状况,替你挑选最近的一个具有缓存内容的节点为你提供资源,因此可以减少加载时间 )
  3. 对css进行压缩( 可以用很多打包工具,比如webpack,gulp等,也可以通过开启gzip压缩 )

大厂面试题分享 面试题库

前后端面试题库 (面试必备) 推荐:★★★★★

地址:前端面试题库

相关文章
|
22天前
|
前端开发 UED 开发者
CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度
本文探讨了CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度;图标字体则以字体形式呈现图标,便于调整样式。文章分析了两者的优缺点及应用场景,并提供了应用技巧和注意事项,旨在帮助开发者提升页面性能,改善用户体验。
22 5
|
27天前
纯css3加载loading发光变色动画代码
纯css3加载loading发光变色动画特效代码是一款基于css3 keyframes属性实现的发光变色圆点串联旋转loading加载动画
22 2
|
27天前
|
Web App开发 前端开发 iOS开发
CSS加载动画大全 126种
CSS加载动画大全是一个css Loaders加载动画特效汇总,一共包含126种加载动画效果,不同样式不同图案,简单实用,一览包含所有,会让你在等待的过程中,体验视觉盛宴,给用户不一般的加载体验,欢迎下载试试!代码适用浏览器:搜狗、360、FireFox(建议)、Chrome、Safari、Opera、傲游、世界之窗,是一款不错的的特效插件,希望大家喜欢!
26 2
|
1月前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
优化CSS和JavaScript加载
|
1月前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
Next.js和Nuxt.js在优化CSS和JavaScript加载方面提供了多种策略和工具。Next.js通过代码拆分、图片优化和特定的CSS/JavaScript优化措施提升性能;Nuxt.js则通过代码分割、懒加载、预渲染静态页面、Webpack配置和服务端缓存来实现优化。两者均能有效提高应用性能。
|
5月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
160 2
|
2月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
2月前
|
前端开发
【CSS】纯css3螺旋状loading加载特效
【CSS】纯css3螺旋状loading加载特效
35 4
|
2月前
|
JavaScript
面试官:组件库按需注册加载的实现思路是什么?
【10月更文挑战第6天】面试官:组件库按需注册加载的实现思路是什么?
|
3月前
|
Web App开发 前端开发 JavaScript
「offer来了」1张思维导图,6大知识板块,带你梳理面试中CSS的知识点!
该文章通过一张思维导图和六大知识板块系统梳理了前端面试中涉及的CSS核心知识点,包括CSS框架、基础样式问题、布局技巧、动画处理、浏览器兼容性及性能优化等方面的内容。