中高级前端面试宝典之浏览器篇

news2024/11/25 12:36:33

中高级前端面试宝典

作为一名前端开发工程师,要掌握的知识点是多而杂的,在面试刷题阶段,经常没头没脑的,我将面试题系统化,分了好几个系列,祝愿大家(包括我)在这个疫情刚过去的互联网寒冬找到事儿少钱多🤪的工作。

第一章 前端面试宝典之浏览器篇


中高级前端面试宝典之浏览器篇

  • 中高级前端面试宝典
  • 前言
  • 一、浏览器渲染
    • 浏览器渲染进程
      • 进程和线程
      • 渲染进程
    • 浏览器渲染机制
    • 阻塞渲染的情况
    • 浏览器渲染优化
  • 二、浏览器缓存机制
    • 缓存位置
    • 强制缓存
    • 协商缓存
    • 总结
    • 强制刷新Ctrl + F5 发生什么
  • 浏览器产生乱码的原因
  • 浏览器同源策略、跨域
  • 浏览器事件流向
  • 常见浏览器所用内核
  • 浏览器本地存储方式及使用场景


前言

没有前言,废话不说,马上进入正题!


一、浏览器渲染

浏览器渲染进程

进程和线程

我们先了解一下进程和线程:
进程是 CPU 资源分配的最小单位,线程是 CPU 调度的最小单位。
知乎上有位大佬的比喻我觉得十分的形象有助于理解。
在这里插入图片描述

渲染进程

浏览器是多进程的,浏览器的进程有:

  • 浏览器主进程
  • 第三方插件进程
  • GPU进程
  • 浏览器渲染进程

浏览器渲染进程内部又是多线程的:

  1. GUI渲染线程:负责渲染浏览器页面,解析和构建DOM、CSSOM和渲染树,绘制页面。重绘和回流也会执行。
  2. JS引擎线程:JS内核,解析和运行javascrpit脚本,一个标签页只有一个JS线程。JS线程跟GUI线程是互斥的
  3. 事件触发线程:监听和触发事件,处理事件循环(event loop)。比如我们的click事件,JS引擎解析完click事件中的代码,会将该任务放入事件触发线程,等到事件被触发时,事件触发线程会将对应的任务放入待处理队列的队尾,等待JS引擎空闲时处理。
  4. 定时器触发线程:setTimeOut和setTimeInterval所在的线程。用来计时并触发事件,时间到了以后将事件放入待处理队列的队尾等待执行。所以定时器中的代码并不是准时准点执行的。
  5. 异步http请求线程:XMLHttpRequest链接后,浏览器新开一个线程来处理。如果状态变更,将回调函数放入待处理队列

运行机制是:宏任务 -> 微任务 -> 调度 GUI 渲染线程 -> 宏任务……

浏览器渲染机制

  • 解析html,构建DOM树
  • 解析CSS,生成CSSOM树
  • 合并dom树和css规则树,生成render渲染树
  • 根据render渲染树进行布局
  • 为渲染树分层,生成分层树
  • 为每个分层树生成绘制列表,并提交到合成线程
  • 合成线程将图层分成不同的图块,并通过栅格化将图块转化为位图
  • 合成线程给浏览器进程发指令
  • 最后:浏览器生成页面并显示

对于浏览器渲染机制,我找到一篇【图解浏览器渲染原理及流程】,想要详细了解和深入理解的大家应该看完就可以了


说完渲染流程不可避免会提到重绘和回流

  • 重绘和回流都是以图层为单位
  • 分图层的条件:有3D的CSS属性、video标签、canvas标签、css3动画
  • 回流(重排)一定会触发重绘,布局改变、节点增加减少、窗口变大变小等都会回流
  • 重绘,如果图层某个元素要重绘,则整个图层都要重绘

阻塞渲染的情况

阻塞解析:阻塞点后面的标签不会被解析,阻塞解析不一定会阻塞其他外部资源的加载
阻塞渲染:阻塞点后面的标签会继续被解析,img,link等会继续发送请求获取外部资源,但不会触发页面渲染(白屏 ),也不会执行 JavaScript 代码

阻塞渲染的情况:

  1. JS
    ① 阻塞DOM解析–因为JS有可能对DOM做操作
    ② 阻塞页面渲染–同上
    ③ 阻塞后续js的执行
    ④ js执行和CSS渲染是互斥的
  2. CSS
    ① style标签中:由html解析器进行解析,不阻塞浏览器渲染,不阻塞DOM解析
    ② link引入的,由CSS解析器进行解析,阻塞浏览器渲染,阻塞后面JS执行,不阻塞DOM解析
    以上阻塞都不会阻塞浏览器加载外部资源。

浏览器渲染优化

  1. JS
    a. 尽量放在body后面
    b. 使用defer和async

     defer 在下载完成以后立即异步加载,加载后等待DOM树构建好再执行
     async 在下载完成后立即异步加载,加载后立即执行JS代码。
    
  2. CSS
    a. style: GUI直接渲染。如果css少,尽量内嵌
    b. link 浏览器派发新的线程(HTTP线程)去加载资源文件,GUI渲染进程会继续向下渲染代码
    c. @import GUI渲染进程会暂时停止,去服务器加载文件,资源返回之前不会继续渲染

  3. DOM树和CSSOM树
    a. 减少HTML文件的代码层级
    b. 使用语义化标签
    c. 减少CSS代码的成绩

  4. 减少回流和重绘
    a. 尽量不要使用table布局
    b. 位置变换尽量使用transform
    c. 不频繁操作元素样式,可以修改类名
    d. 使用absolute和fixed,使元素脱离文档流,新建图层

  5. 浏览器自身的优化
    将所有的回流和重绘操作放在一个队列,固定间隔或者固定内存进行一次批处理。

二、浏览器缓存机制

浏览器缓存机制其实就是HTTP缓存,由HTTP报文的缓存标识决定

缓存位置

缓存位置有四种,优先级如下:

  1. Service Worker
    • 一个服务器与浏览器之间的中间人角色,如果网站注册了service worker,就可以拦截当前网站所有的请求,然后进行判断。
    • 需要使用HTTPS协议保障安全,且可以自由控制缓存文件、匹配方式以及如何读取,缓存是持续的
    • 是基于web worker的。
    • 可以访问cache和indexDB
  2. Memory Cache
    • 内存中的缓存,主要包含当前页面中的资源如:样式、脚本、图片
    • 缓存持续性很短,会随着进程的释放而是放
  3. Disk Cache
    存在硬盘中,读取速度较内存更慢,容量和时效更大
  4. Push Cache
    推送缓存,是HTTP2支持
    只存在于session,缓存时间很短,chrome中仅仅5分钟左右
    并非严格执行HTTP头中的缓存指令

以上四种缓存都没有命中的时候,才会向服务器发送请求。
服务器接收到请求以后,会根据响应报文中的HTTP请求头的缓存标识来决定是否缓存。

强制缓存

向浏览器缓存中查找请求结果,然后根据该结果的缓存规则来决定是否使用该缓存结果的过程。

强缓存的设置通过两种HTTP Header:Expires 和 Cache-Control, HTTP1.1以后不再使用Expires

强制缓存的情况主要由三种:

  1. 不存在缓存结果和缓存标识,强制缓存失效,就直接向服务器发送请求
  2. 存在缓存结果和缓存标识,但是结果失效,则协商缓存
  3. 存在缓存结果和缓存标识,且结果没有失效,强制缓存生效,从缓存中读取数据,http Code为200,size显示form disk cache或者form memory cache

Cache-Control
主要用于控制网页缓存,有很多值:

public 标识响应可以被客户端、代理服务器缓存
private 只有客户端缓存(默认取值)
max-age 缓存秒数
no-store 任何内容都不缓存
no-cache 被缓存但下次请求时,需要验证是否过期(协商缓存)

协商缓存

协商缓存生效时,服务器返回304和not Modified,意思是该资源无更新,直接从浏览器缓存中读取
协商缓存设置header头:Last-Modified 和 ETag

Last-Modified是服务器返回资源的同时,添加在response header中的,值是资源在服务器上最后的修改时间
If-Modified-Since 是浏览器第二次请求的时候加在header头中的,值是Last-Modified的值

ETag是服务器返回的当前资源的唯一标识,只要资源变化,就重新生成ETag
浏览器发送请求的时候就会将ETag的值放在If-None-Match中


总结

强缓存不会向服务器发送请求,而是直接在浏览器缓存中取值
强缓存不生效时才会使用协商缓存,就是向服务器发送请求来决定要不要使用浏览器中的缓存数据

强制刷新Ctrl + F5 发生什么

普通的F5刷新,页面只是普通的刷新一下,获取数据啥的,该强制缓存就强制缓存、该协商就协商
强制刷新Ctrl + F5,浏览器会清空缓存,重新下载资源,并且请求头中也不会有if-None-Macth和if-modified-Since,强迫服务器不准返回304,而是返回一份真正的数据。

浏览器产生乱码的原因

  • 网页源代码是gbk的编码,而内容中的中文字是utf-8编码的,这样浏览器打开即会出现html乱码,反之也会出现乱码;
  • html网页编码是gbk,而程序从数据库中调出呈现是utf-8编码的内容也会造成编码乱码;
  • 浏览器不能自动检测网页编码,造成网页乱码。

解决办法:

  • 使用软件编辑HTML网页内容;
  • 如果网页设置编码是gbk,而数据库储存数据编码格式是UTF-8,此时需要程序查询数据库数据显示数据前进程序转码;
  • 如果浏览器浏览时候出现网页乱码,在浏览器中找到转换编码的菜单进行转换。

浏览器同源策略、跨域

浏览器事件流向

常见浏览器所用内核

浏览器本地存储方式及使用场景

Cookie、LocalStorage、SessionStorage区别
前端储存的方式有哪些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/385252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高通平台开发系列讲解(摄像头篇)QCM6490 上摄像头驱动开发

文章目录 一、Camera 硬件简介二、内核驱动移植2.1、确定设备树2.2、增加 camera 节点2.3、配置相关 GPIO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 qcm6490 摄像头驱动开发。 一、Camera 硬件简介 摄像头连接器一般会包含 Mipi 信号、mclk、供电、re…

从业者必读,一篇文章轻松掌握DevOps核心概念和最佳技能实践!

文章目录前言一. DevOps的定义及由来二. DevOps的价值三. devops工具有哪些3.1 devops工程师的硬实力3.2 devops工程师的软实力总结前言 大家好,又见面了,我是沐风晓月,本文是对DevOps的总结,一篇文章告诉你什么是DevOps. 对很多…

Windows+CLion+Opencv+NCNN笔记

一、下载protobuf和ncnn在腾讯优图的github上下载ncnn,下载链接为https://github.com/Tencent/ncnn。在安装NCNN之前需要编译安装protobuf,protobuf3.4.0下载链接为https://github.com/google/protobuf/archive/v3.4.0.zip。下载后解压,将ncn…

什么是决策能力?HR人才测评

什么是决策能力?决策能力是一项多种能力的综合,指的是能够认识、理解、并且综合分析后得出判断,从而采取行动的能力。如:对当前形势的分析,对相关人员的判断,能做出合理的,适当的行动来应对。决…

【MyBatis】篇一.

文章目录1、MyBatis概述2、环境搭建1、MyBatis概述 认识: JavaEE开发的一个套件SSM,即: MyBatis是一个持久层的框架,是对JDBC的一个封装,是一个半自动的ORM框架。 ORM即实体类对象和数据库中的数据的一个映射关系&am…

关于Facebook Messenger CRM,这里有你想要知道的一切

关于Facebook Messenger CRM,这里有你想要知道的一切!想把Facebook Messenger与你的CRM整合起来吗?这篇博文是为你准备的! 我们将介绍有关获得Facebook Messenger CRM整合的一切信息。然后,我们将解释为什么你需要像SaleSmartly&a…

Git使用:常用命令汇总

前言 Git对于程序猿来说并不陌生,它是一款非常好用的项目管理工具,无论是前端开发还是后台开发,只要项目里面可以使用Git来管理,就会涉及代码的提交和合并操作,主要是常用的Git操作命令的使用,虽然目前有好…

CA-SSL:用于检测和分割未知类的半监督学习

论文作者 | Lu Qi, Jason Kuen , Zhe Lin, and etal论文来源 | CVPR2022文章解读 | William1、摘要为了提高检测/分割的性能,现有的自监督和半监督方法从未标记的数据中提取任务相关或任务特定的训练标签,但这两种方法对于任务性能都是次优的&#xff0c…

【JeecgBoot-Vue3】第1节 源码下载和环境安装与启动

目录 一. 资料 1. 源码下载 2. 官网启动文档 二、 前端开发环境安装 2.1 开发工具 2.2 前后端代码下载 2.3 前端启动 Step 1:安装nodejs npm Step 2:配置国内镜像(这里选阿里) Step 3:安装yarn Step 4&…

python的 ping 网络状态监测方法(含多IP)

ping 基本概念 ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Messag…

九、Bean的循环依赖问题

1 什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你,你也依赖我。 比如:丈夫类Husband,妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 2 singleton下的set注入产生的循环依赖 丈夫类 pac…

RabbitMQ的使用

1.初识MQ1.1.同步和异步通讯微服务间通讯有同步和异步两种方式:同步通讯:就像打电话,需要实时响应。异步通讯:就像发邮件,不需要马上回复。两种方式各有优劣,打电话可以立即得到响应,但是你却不…

Python3,好看的外(shen)表(cai)千篇一律,炫彩的日志万里挑一。

炫彩日志输出1、引言2、代码实战2.1 库介绍2.2 库安装2.3 代码示例2.3.1 demo2.3.2 实战3、总结1、引言 小屌丝:鱼哥, 我今天被炫到了。 小鱼:怎么了,你还能被旋到了? 小屌丝对啊, 被炫到了,很…

python SDK打包

什么是SDK 先放一段专业性的文字来解释: SDK即“软体开发工具包”,一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。通俗点是指由第三方服务商提供的实现软件产品某项功能的工具包。 开发者不…

【PyTorch】教程:torch.nn.ELU

torch.nn.ELU CLASS torch.nn.ELU(alpha1.0, inplaceFalse) paper: Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs). 参数 alpha ([float]) – α\alphaα 默认为1.0inplace ([bool] ) – 内部做, 默认为 False ELU 定义 ELU(x){x,if x>0α…

与流程挖掘布道者熵评科技孙一鸣博士共话流程挖掘市场的起源与前景 | 爱分析访谈

调研:李进宝 陈元新 撰写:李进宝 陈元新 随着数字化转型持续深入,国内企业流程挖掘需求初露端倪。流程挖掘是指通过采集和分析企业数据,以可视化流程图还原企业实际发生的业务流程,进而评估流程运行状况、诊断流程运…

Spring 6 and JUnit 5 组合

Spring 6 and JUnit 5 组合 Spring 6 and JUnit 5 只需引入相关的包&#xff0c;不过偶尔可能会出现 no tests were found&#xff0c;最后有解决方案。 引入相关依赖包 <dependencies><dependency><groupId>jakarta.annotation</groupId><artif…

边界无限入选首届“网络安全高成长性企业”并荣获“勇创之星”

近日&#xff0c;由工业和信息化部、四川省人民政府主办的“2023年中国网络和数据安全产业高峰论坛网络安全产融合作分论坛”在成都举行&#xff0c;论坛上公布了“2022年度网络安全高成长性企业”名单。云原生安全、应用安全“灵动智御”理念创领者北京边界无限科技有限公司&a…

密码算法(SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算)

文章目录SM1 对称密码SM2 椭圆曲线公钥密码算法SM3 杂凑算法SM4 对称算法同态加密密态计算和隐私计算安全多方计算技术安全多方计算的应用场景对称加密算法非对称加密算法&#xff08;公钥加密&#xff09;参考文章SM1、SM2、SM3和SM4 为了保障商用密码的安全性&#xff0c;国家…

HTTP#1 请求数据格式和响应数据格式

一. 简介概念Hyper Text Transfer Protocol (HTTP), 超文本传输协议, 规定了浏览器和服务器之间数据传输的规则HTTP协议特点1.基于TCP协议:面向连接&#xff0c;安全2.基于请求-响应模型的:一次请求对应一次响应3. HTTP协议是无状态的协议: 对于事务处理没有记忆能力, 每次请求…