前端面试复习计划,准备冲刺2023!

语言: CN / TW / HK

想写这篇文章已经很久了,作为一个技工,怎么能免的了一直学习呢! 也换过两份工作,所以深知每次面试就是一次大考。写这篇文章的目的是对技术的回顾,也是对自己成长的记录。(对于某些知识点如果我理解的不对,大家有更好的理解角度,也希望大家指出来,大家相互讨论,学习吧!)。

WechatIMG193.jpeg

闲话休提,书归正传。面试就是用较短的时间做到双方相互了解,所以我尽量用简短语言来描述事物本质,至于对于某些重要知识点的深入理解,我会在后续逐步整理出文,请关注、点赞、收藏!

小编最近已经离职了,也在寻求新的机会,如果刚好你的公司在招聘,给我个机会,聊一下呗!😄😄😄

如果有看到标题号顺序没对上,不要奇怪,那是因为关于某些问题我认为还可以再优化,还在整理中,我这么重视格式的人,不会忘记的,哈哈哈!!!这份特殊的【新年礼物】,你可要收好啊!


mermaid pie title 文章分为多个模块进行介绍 "http" : 11 "html" : 4 "css" : 5 "javascript" : 23 "react" : 9 "业务层面" : 1 "flutter" : 9 "其他" : 3


面试路上互助交流群

如果你也在找工作或者你准备换工作,那么可以一起交流一下呀,也不介意潜水哈 😄,我只是希望面试的路上不是你我一个人独立奋斗,在大城市生活久了人都变的孤独了许多,我不希望面试完想找人分享找不到。在群里我们可以共享资源、一同避一下那些踩雷的公司、📣 吐槽生活、互相激励等等,下面是群二维码,欢迎加群交流呦!💪 加油 准备冲刺2023!

WechatIMG197.jpeg

一、http 相关

http 相关知识,前端必备网络相关知识。

1. 地址栏输入 URL 到页面展现都经历了哪些过程?

1. 构建请求
2. 查找强缓存
3. DNS解析
4. 建立TCP连接(3次握手)
5. 发送HTTP请求(请求行/头/体)
6. 服务器处理收到的请求,将数据返回浏览器
7. 浏览器收到HTTP响应
8. 读取内容,解析html,浏览器渲染,
9. 生成dom树、解析css样式、js交互

2. 三次握手的过程?

  1. 从最开始双方都处于CLOSED状态。

  2. 客户端主动请求建立连接,发送 SYN到服务端 , 自己变成了SYN-SENT状态。

  3. 服务端接收到请求,针对客户端的SYN的确认应答,返回SYNACK(对应客户端发来的SYN),并请求建立连接,自己变成了SYN-REVD

  4. 客户端收到服务端的请求,对服务端SYN的确认应答,并发送ACK给服务端,自己变成了ESTABLISHED状态;

  5. 服务端收到ACK之后,也变成了ESTABLISHED状态。

另外需要提醒你注意的是,SYN 是需要消耗一个序列号的,下次发送对应的 ACK 序列号要加1,因为 凡是需要对端确认的,一定消耗TCP报文的序列号。


为什么是三次不是四次

三次握手的目的是确认双方发送接收的能力,那四次握手可以嘛?

当然可以,100 次都可以。但为了解决问题,三次就足够了,再多用处就不大了。


三次握手过程中可以携带数据么?

首先说答案:第三次握手的时候,可以携带。前两次握手不能携带数据。

如果前两次握手能够携带数据,那么一旦有人想攻击服务器,那么他只需要在第一次握手中的 SYN 报文中放大量数据,那么服务器势必会消耗更多的时间和内存空间去处理这些数据,增大了服务器被攻击的风险。第三次握手的时候,客户端已经处于ESTABLISHED状态,并且已经能够确认服务器的接收、发送能力正常,这个时候相对安全了,可以携带数据。


3. 网络分层是 5 层还是 7 层?

OSI 七层参考模型:

物理层 -> 数据链路层 -> 网络层(Ip)-> 传输层(TCP)- > 会话层-> 表现层- > 应用层(http)顶层

我们所知道的还有 TCP/IP 四层模型和 TCP/IP 五层模型。这又是怎么出来的,其实所谓的 TCP/IP 四层模型和 TCP/IP 五层模型是以 OSI 七层优化而来,把某些层进行合并了(会话层,表现层,应用层合并成应用层),其实本质上还是相同的,。

互联网 5层协议模型:

物理层 -> 数据链路层 -> 网络层(Ip)-> 传输层(TCP)->应用层(http)
  • 物理层:用物理手段将电脑连接起来,就像我们讲到的计算机之间的物理连线。主要用来传输0、1信号,所有我们用另一层用来规定不同0、1组合的意义是什么。
  • 数据链路层:在数据链路层规定一套协议,专门的给0、1信号进行分组,以及规定不同的组代表什么意思,从而双方计算机都能够进行识别,这个协议就是"以太网协议"
  • 网络层:网络层的由来是因为在数据链路层中我们说说两台计算机之间的通信是分为同一子网络和不同子网络之间,那么问题就来了,怎么判断两台计算机是否在同一子网络(局域网)中?这就是网络层要解决的问题。
  • 传输层:传输层的主要功能就是为了能够实现"端口到端口"的通信。计算机上运行的不同程序都会分配不同的端口,所以才能使得数据能够正确的传送给不同的应用程序。
  • 应用层:应用层的功能就是规定了应用程序的数据格式。我们经常用得到的电子邮件、HTTP协议、以及FTP数据的格式,就是在应用层定义的。

4. httpshttp有什么区别?

https 不是 http 的对立面,两者在本质上是相同的,都采用相同的“超文本传输协议”,使请求的数据能够显示在网站上。

安全性:

http协议以明文方式发送内容,不提供任何方式的数据加密。http协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。https则是具有安全性的SSL / TLS加密传输协议,可防止通过 Internet 发送的数据(用户名,银行卡密码等)被第三方拦截和读取。

连接方式:

httphttps使用的是完全不同的连接方式,http 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 httpsTCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。用的端口也不一样,前者是80,后者是443

权威认证:

https 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的;http 则不需要。

总结:HTTPS相对复杂,拥有权威认证,也更安全,也是以后网站的普遍模式。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。


5. http中的Keep-Alive有了解吗?

Keep-Alivehttp的一个头部字段Connection中的一个值,它是保证我们的http请求能建立一个持久连接。也就是说建立一次TCP连接即可进行多次请求和响应的交互。它的特点就是只要有一方没有明确提出断开连接,则保持TCP连接状态,减少TCP连接和断开造成的额外开销。

HTTP/1.0阶段:

HTTP/1.0中所有的连接默认都是关闭的,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过Keep-Alive规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。

HTTP/1.1阶段

HTTP/1.1中所有的连接默认都是持久连接的。除非在请求头或响应头中指明要关闭:Connection: Close,这也就是为什么Connection: Keep-Alive字段再没有意义的原因。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了。


6. http1http2 的区别?

  • http2采用二进制,而http1使用的是文本格式;
  • http2是多路复用的,而且无阻塞,只需一个连接即可实现并行;http1一个连接只能发送一个请求;
  • http1header带有大量信息,而且每次都要重复发送;http2使用encoder来减少需要传输的header大小,通讯双方各自缓存 一份header 信息字典表,既避免重复传输,又提升了传输速度。

7. 什么是websocket?

Websocketh5提供的一种在单个TCP连接上进行全双工通信的协议,只需要服务器和浏览器通过HTTP协议进行握手之后,两者之间就直接可以创建持久性的连接,可以双向发送或接收信息,并且允许服务器主动向客户端推送数据,适合数据需要及时刷新的场景。

websocket特性:

  1. 性能高,http 是基于文本,websocket 是二进制
  2. 双向通信
  3. 在建立连接时还需要http 来通信,
  4. 天生支持跨域
  5. 天然支持加密,安全
  6. 如果断开会自动重连
websocket 封装库 socket.io

我们知道原生的websocket写起来是非常费脑细胞的,所以推荐一个库,socket.io,使用起来较为方便,并且它支持ie5,而且是跨域自动解析数据,非常非常推荐!!!!


8. websockethttp有什么区别?

相同点:

  1. 都是一样基于TCP的,都是可靠性传输协议。
  2. 都是应用层协议。

区别:

  1. WebSocket是双向通信协议,可以双向发送或接收信息;而HTTP是单向的,只能由客户端发起请求到服务端去请求数据,服务端只能作为被动方;
  2. http 是短连接,请求之后都会关闭连接,下次请求需要重新打开连接;websocket 是长连接,只需要通过一次请求来初始化连接,后面就可以进行双向数据通信

WebSocket连接的过程:

  1. 客户端发起http请求,经过3次握手后,建立起TCP连接;
  2. http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
  3. 服务器收到客户端的握手请求后,同样采用http协议回馈数据;
  4. 客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。

9. 什么是http缓存?

http缓存指的是: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有要请求资源的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。

常见的http缓存只能缓存get请求响应的资源,对于其他类型的响应则无能为力,所以后续说的请求缓存都是指get请求

分类:

  • 根据是否需要再请求:可分为强制缓存和协商缓存,强制缓存如果生效,不需要再和服务器发生交互,而协商缓存不管是否生效,都需要与服务端发生交互;
  • 根据是否可以被单个或者多个用户使用来分类,可分为私有缓存和共享缓存

配置:在请求的headers中添加

cache-control: max-age=30 pragma:no-cache

如不想被缓存,则配置:

cache-control: no-store

10. 为什么要使用 http 缓存?

  • 减少了冗余的数据传输,节省了网费。
  • 缓解了服务器的压力, 大大提高了网站的性能
  • 加快了客户端加载网页的速度

11. 都有哪些本地存储的方案?

前端缓存一般使用较多的有:localStorage、 sessionStorage、 cookie、indexdb

区别: - localStorage: HTML5新特性,只要在相同的协议、相同的主机名、相同的端口下,就能读取/修改同一份localStorage数据,是永久存储,除非手动删除,大小5M左右,IE8以上,不能被爬虫抓取到 - sessionStorage: HTML5新特性,比localStorage更严苛一点,除了协议、主机名、端口外,还要求在同一窗口,也就是浏览器的标签,仅仅是会话级别的存储,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。 - cookie: 保存用户登录状态的数据会在每一次发送http请求的时候,同时发送给服务器,而localStoagesessionStorage不会,最小,最大4KB可设置过期时间,默认当浏览器关闭进程的时候自动销毁。 - indexdb: iE10以上,比较适合键值对较多的数据,如果数据结构比较复杂,同时对浏览器兼容性没什么要求,存储量最大50M


二、HTML 相关

1. 浅谈前端工程化介绍:模块化、组件化、规范化、自动化

前端工程化:指使用软件工程的技术与方法对前端开发的技术、工具、流程、经验、方案等指标标准化,它具备模块化组件化规范化自动化四大特性,主要目的是降低成本增加效率

截屏2022-12-16 20.36.38.png

  • 模块化:是指在文件层面上对代码与资源实现拆分与组装,将一个大文件拆分为互相依赖的小文件,再统一拼装与加载。各个模块功能独立,分模块来维护,组合方式更灵活,多人协作也互不干扰。例如:接口模块、资源模块、路由模块等。

  • 组件化:是指在功能开发场景中,将具备通用功能的交互设计划分为模板、样式和逻辑组成的功能单元,是具体某个功能的封装,实现了代码更高层次的复用性,提升开发效率。组件的封装也是对象的封装,同样要做到高内聚低耦合,例如分页器、table表格、form表单等。

  • 规范化:将一系列预设规范接入工程各个阶段,通过各项指标标准化开发者的工作流程,为每个开发者指明一个方向,引领着成员往该方向走。例如:eslint、stylelint、pre-commit等,拉齐代码标准,形成规范底线,方便不同人员等交叉维护。

  • 自动化:指将一系列繁琐重复的工作流程交由程序根据预设脚本自动处理,常见自动化场景包括但不限于自动化构建自动化测试自动化打包自动化发布自动化部署等。在保证效率的同时,又解放了双手。

总结:前端工程化不是某个具体的工具,而是对项目的整体架构与整体规划,使开发者能在未来可判断时间内动态规划发展走向,以提升整个项目对用户的服务周期。最终的目的是从手动处理流程全部替换为自动处理流程,以解放团队双手,让其他成员更专注于自身业务需求

参考掘金小册:《从 0 到 1 落地前端工程化》

关于git代码提交规范

关于代码提交规范,我认为是有必要去统一的,在日常开发中经常遇到一些千奇百怪的提交说明,例如中英文混合使用、各种不规范的英文单词等。这让Review代码的人会经常搞不清它们到底是干嘛的,导致后续代码维护成本巨大。

我们不能只注重编码而不考虑代码质量与提交质量。Angular团队制定的提交规范是目前市面上公认为最合理、最系统、最流行的提交规范

Angular提交规范的格式包括HeaderBodyFooter三个内容。Header为必填项,BodyFooter为可缺省项,这些内容通过以下结构组成一个完整的提交格式。

``` ():

空一行

# 空一行
``` ##### Header 该部分仅书写一行,包括三个字段,分别是`type`、`scope`和`subject`。 - **type**:用于说明`commit`的提交类型,`必选` - **scope**:用于说明`commit`的影响范围,可选 - **subject**:用于说明`commit`的细节描述,可选 `type`用于说明`commit`的提交类型,包括以下选项,相信这些选项已满足日常`95%`的应用场景。当然这些选项无需刻意记忆,我会引入命令自动完成这些提交工作。 类型 | 功能 | 描述 | | :----------: | -- | ----------------- | | **feat** | 功能 | 新增功能,迭代项目需求 | | **fix** | 修复 | 修复缺陷,修复上一版本存在问题 | | **docs** | 文档 | 更新文档,仅修改文档不修改代码 | | **style** | 样式 | 变动格式,不影响代码逻辑 | | **refactor** | 重构 | 重构代码,非新增功能也非修复缺陷 | | **perf** | 性能 | 优化性能,提高代码执行性能 | | **test** | 测试 | 新增测试,追加测试用例验证代码 | | **build** | 构建 | 更新构建,改动构建工具或外部依赖 | | **ci** | 脚本 | 更新脚本,改动CI或执行脚本配置 | | **chore** | 事务 | 变动事务,改动其他不影响代码的事务 | | **revert** | 回滚 | 回滚版本,撤销某次代码提交 | | **merge** | 合并 | 合并分支,合并分支代码到其他分支 | | **sync** | 同步 | 同步分支,同步分支代码到其他分支 | | **impr** | 改进 | 改进功能,升级当前功能模块 `scope`用于说明`commit`的影响范围。简要说明本次改动的影响范围,例如根据功能可划分为`数据层`、`视图层`和`控制层`,根据交互可划分为`组件`、`布局`、`流程`、`视图`和`页面`。从`Angular`以往的提交说明来看,还是建议你在提交时对`scope`补全。 `subject`用于说明`commit`的细节描述。文字一定要精简精炼,无需太多备注,因为`Body`部分可备注更多细节,同时尽量遵循以下规则。 - 以动词开头 - 使用第一人称现在时 - 首个字母不能大写 - 结尾不能存在句号(`.`) ##### Body 该部分可书写多行,对`subject`做更详尽的描述,内容应包括`改动动机`与`改动前后对比`。 ##### Footer 该部分只适用两种情况,分别是`不兼容变动`与`问题关闭`。 - **不兼容变动**:当前代码与上一版本不兼容,则以`BREAKING CHANGE`开头,关联`变动描述`、`变动理由`和`迁移方法` - **问题关闭**:当前代码已修复某些`Issue`,则以`Closes`开头,关联目标`Issue` 示例一个常规提交: ``` // 类型:修复问题,影响范围:qa 环境,处理细节:全局切换主题开关无效 关联bug: #87697 fix(qa):invalid global theme color switch (#87679) ``` [参考掘金小册:《从 0 到 1 落地前端工程化》 ](https://juejin.cn/book/7034689774719860739?enter_from=course_center) --- #### 2. `html5` 的新特性 语义化标签: `