react常见面试题

1.说说你对useEffect的理解,可以模拟哪些生命周期?
react提供了hooks,因此函数组件也可以用hooks进行状态管理并且也可以用useEffect模拟class组件的生命周期。

useEffect中第一个参数是一个执行函数,当第二个参数依赖项不为空数组时,前一个函数中的return会在再次执行useEffect前执行,可以用于回收之前的计时器等。

useEffect的依赖项是做浅比较

useEffect第一个参数是一个回调函数,在依赖项发生变化的时候,会执行它,也被称为副作用函数。 可以在里面进行相应的生命周期阶段的操作,异步请求,设定计时器等,可以通过副作用函数的return来清除副作用,比如回收计时器。

可以模拟三个生命周期函数,分别是componentDidMount,componentDidUpdate,componentWillUnMpunt

2.说说Real DOM和Virtual DOM的区别?优缺点?
区别

两者的区别如下:

虚拟 DOM 不会进行排版与重绘操作,而真实 DOM 会频繁重排与重绘

虚拟 DOM 的总损耗是“虚拟 DOM 增删改+真实 DOM 差异增删改+排版与重绘”,真实 DOM 的总损耗是“真实 DOM 完全增删改+排版与重绘”

优缺点

真实 DOM 的优势:易用

缺点:

效率低,解析速度慢,内存占用量过高 性能差:频繁操作真实 DOM,易于导致重绘与回流

使用虚拟 DOM 的优势如下:

简单方便:如果使用手动操作真实 DOM 来完成页面,繁琐又容易出错,在大规模应用下维护起来也很困难 性能方面:使用 Virtual DOM,能够有效避免真实 DOM 数频繁更新,减少多次引起重绘与回流,提高性能 跨平台:React 借助虚拟 DOM,带来了跨平台的能力,一套代码多端运行

缺点:在一些性能要求极高的应用中虚拟 DOM 无法进行针对性的极致优化 首次渲染大量 DOM 时,由于多了一层虚拟 DOM 的计算,速度比正常稍慢

3.说说React中setState和replaceState的区别?
setState用于设置状态对象

nextState,将要设置的新状态,该状态会和当前的state合并 callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。 合并nextState和当前state,并重新渲染组件。setState是React事件处理函数中和请求回调函数中触发UI更新的主要方法。

replaceState

replaceState()方法与setState()类似,但是方法只会保留nextState中状态,原state不在nextState中的状态都会被删除.

nextState,将要设置的新状态,该状态会替换当前的state。

callback,可选参数,回调函数。该函数会在replaceState设置成功,且组件重新渲染后调用。

4.说说react中onClick绑定后的工作原理?
1. 首先react有自己的事件系统,是遵循w3c的,这个事件系统的名称叫做合成事件(SyntheticEvent),而其自定义事件系统的动机主要包含以下几个方面:

  抹平不同浏览器之间的兼容性差异。最主要的动机。

  件合成既可以处理兼容性问题

  提供一个抽象的跨平台事件机制

  可以做更多优化

可以干预事件的分发

2. 当给组件(元素)绑定onClick事件之后

(1. react会对事件先进行注册,将事件统一注册到 document上

(2. 根据组件 唯一的标识key来对事件函数进行存储

3. 统一的指定dispatchEvent回调函数

4. 储存事件回调

react会将click这个事件统一存到一个对象中,回调函数的存储采用键值对(key/value)的方式存储在对象中,key 是组件的唯一标识id,value 对应的就是事件的回调函数,通过组件的key就能回调到相应的函数了

5.说说你对fiber架构的理解?解决了什么问题
理解:

React Fiber 是 Facebook 花费两年余时间对 React 做出的一个重大改变与优化,是对 React 核心算法的一次重新实现。从Facebook在 React Conf 2017 会议上确认,React Fiber 在React 16 版本发布

在react中,主要做了以下的操作:

为每个增加了优先级,优先级高的任务可以中断低优先级的任务。然后再重新,注意是重新执行优先级低的任务。 增加了异步任务,调用requestIdleCallback api,浏览器空闲的时候执行。 dom diff树变成了链表,一个dom对应两个fiber(一个链表),对应两个队列,这都是为找到被中断的任务,重新执行。 从架构角度来看,Fiber 是对 React核心算法(即调和过程)的重写。

从编码角度来看,Fiber是 React内部所定义的一种数据结构,它是 Fiber树结构的节点单位,也就是 React 16 新架构下的虚拟DOM。

解决问题

1、掉帧 在react 15以及之前,还没有fiber的概念, 当虚拟dom量非常大非常复杂时,react在递归进行渲染时会非常耗时,会一直递归进行,会造成页面卡顿掉帧的现象,严重情况下浏览器还可能失去响应。

fiber有协调与提交两个阶段,协调包含了fiber创建与diff更新,此过程可暂停。而提交必须同步执行,保证渲染不卡顿。

2、并发 fiber实现了并发,为任务赋予不同优先级,保证了一有时间总是做最高优先级的事,而不是先来先占位死板的去执行。

6.说说你对redux中间件的理解?常用的中间件有哪些?实现原理?
常用的中间件

redux-thunk:用于异步操作

redux-logger:用于日志记录

实现原理

redux-thunk是官网推荐的异步处理中间件

默认情况下的dispatch(action),action需要是一个JavaScript的对象

redux-thunk中间件会判断你当前传进来的数据类型,如果是一个函数,将会给函数传入参数值(dispatch,getState)

dispatch函数用于我们之后再次派发action getState函数考虑到我们之后的一些操作需要依赖原来的状态,用于让我们可以获取之前的一些状态

如果想要实现一个日志功能,则可以使用现成的redux-logger

7.什么是强缓存和协商缓存?
缓存:

缓存是指浏览器(客户端)在本地磁盘中队访问过的资源保存的副本文件。

强缓存: 强缓存是根据返回头中的 Expires 或者 Cache-Control 两个字段来控制的,都是表示资源的缓存有效时间。

协商缓存: 协商缓存是由服务器来确定缓存资源是否可用。 主要涉及到两对属性字段,都是成对出现的,即第一次请求的响应头带上某个字, Last-Modified 或者 Etag,则后续请求则会带上对应的请求字段 If-Modified-Since或者 If-None-Match,若响应头没有 Last-Modified 或者 Etag 字段,则请求头也不会有对应的字段。

区别:

如果浏览器命中强缓存,则不需要给服务器发请求;而协商缓存最终由服务器来决定是否使用缓存,即客户端与服务器之间存在一次通信。 在 chrome 中强缓存(虽然没有发出真实的 http 请求)的请求状态码返回是 200 (fromcache);而协商缓存如果命中走缓存的话,请求的状态码是 304 (not modified)。 不同浏览器的策略不同,在FireFox中,from cache 状态码是 304.

8.useEffect的依赖为引用类型如何处理?
1 如果数据是对象的话,可以监听对象的里面的值,值是基本类型,如果值改变了,那么可以监听执行 2 在去修改对象和数据的时候,使用参拷贝或者浅拷贝,这样地址发生改变可以监听执行 3 可以转成字符串,通过JSON.stringify0,监听字符串这样的,这样改变也会执行

9.说说你对@reduxjs/toolkit的理解?和react-redux有什么区别?
react-redux react官方推出的redux绑定库,react-redux将所有组件分为两大类:UI组件和容器组件,其中所有容器组件包裹着UI组件,构成父子关系。容器组件负责和redux交互,里面使用redux API函数,UI组件负责页面渲染,不使用任何redux API。容器组件会给UI组件传递redux中保存对的状态和操作状态的方法

@reduxjs/toolkit Redux 官方强烈推荐,开箱即用的一个高效的 Redux 开发工具集。它旨在成为标准的 Redux 逻辑开发模式,使用 Redux Toolkit 都可以优化你的代码,使其更可维护

10.知道react里面的createPortal么,说说其使用场景?
定义

Portal 提供了一种将子节点渲染到存在于父组件以外的 DOM 节点的优秀的方案

使用场景

一个 portal 的典型用例是当父组件有 overflow: hidden 或 z-index 样式时,但你需要子组件能够在视觉上“跳出”其容器。例如,对话框、悬浮卡以及提示框

11.说说webpack中常见的loader?解决了什么问题?
style-loader: 将css添加到DOM的内联样式标签style里 css-loader :允许将css文件通过require的方式引入,并返回css代码 less-loader: 处理less sass-loader: 处理sass postcss-loader: 用postcss来处理CSS autoprefixer-loader: 处理CSS3属性前缀,已被弃用,建议直接使用postcss file-loader: 分发文件到output目录并返回相对路径 url-loader: 和file-loader类似,但是当文件小于设定的limit时可以返回一个Data Url html-minify-loader: 压缩HTML babel-loader :用babel来转换ES6文件到ES

12.说说如何借助webpack来优化前端性能?
压缩代码: 删除多余的代码、注释、简化代码的写法等等方式。可以利用webpack的UglifyJsPlugin和ParallelUhlifyPlugin来压缩JS文件,利用cssnano(css-loader?minim ize)来压缩css

利用CDN加速: 在构建过程中,将引用的静态资源路径修改为CDN上对应的路径。可以利用 webpack对于output参数和各种loader的publicPath参数来修改资源路径

Tree Shaking 消除最终文件中未使用的代码。可以通过在启动webpack时追加参数–optimize-minimize来实现

Code Splitting 将代码按路由维度或者组件分块(chunk),这样做到按需加载,同时可以充分利用浏览器缓存

提供公共第三方库 SplitChunksPlugin插件来进行公共模块抽取,利用浏览器缓存可以长期缓存这些无需频繁变动的公共代码

13.说说你对事件循环event loop的理解?
首先,JavaScript是一门单线程的语言,意味着同一时间内只能做一件事,但是这并不意味着单线程就是阻塞,而实现单线程非阻塞的方法就是事件循环 在JavaScript中,所有的任务都可以分为

同步任务:立即执行的任务,同步任务一般会直接进入大屏主线程中执行 异步任务:异步执行的任务,比如ajax网络请求,setTimeout定时函数等

如果将任务划分为同步任务和异步任务并不是那么的准确

微任务

一个需要异步执行的函数,执行时机是在主函数执行结束之后、当前宏任务结束之前

宏任务

宏任务的时间粒度比较大,执行的时间间隔是不能精确控制的,对一些高实时性的需求就不太符合

14.说说你对vue中mixin的理解?
mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法而不必成为其子类; mixin类通常作为功能模块使用,在需要该功能时“混入”,有利于代码复用又避免了多继承的复杂。 本质就是一个JS对象,可以包含组件中的任意功能选项,如data、components、methods、creaded、computed以及生命周期函数等等。 只需要将共用的功能以对象的方式传入mixins选项中,当组件使用mixins对象时所有mixins对象的对象都将被混入该组件本身的选项中来。

15.说说你对webSocket的理解?
一、什么是websocket WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议) 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的 Websocket是一个持久化的协议

二、websocket的原理

websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信 在websocket出现之前,web交互一般是基于http协议的短连接或者长连接 websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"

16.for...in循环和for...of循环的区别?
(1)for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值

(2)for in总是得到对象的key或数组、字符串的下标

(3)for of总是得到对象的value或数组、字符串的值

(4)for in是ES5里的,for…of是ES6里的

17.前端跨域的解决方案?
cors跨域: 服务端进行接口请求设置,前端直接调用 jsonp: jsonp跨域-前端适配,后端配合, 前后端同时改造 接口代理: 通过修改nginx服务器配置实现代理转发 前端修改,后端不

18.调和阶段setState干了什么?
代码中调用 setState函数之后,React会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation)。

经过调和过程,React会以相对高效的方式根据新的状态构建 React 元素树并且着手重新渲染整个 UI 界面;

在 React 得到元素树之后,React会自动计算出新的树与老树的节点差异,然后根据差异对界面进行最小化重渲染;

在差异计算算法中,React能够相对精确地知道哪些位置发生了改变以及应该如何改变,这就保证了按需更新,而不是全部重新渲染。

19.说说React jsx转换成真实DOM的过程
书写JSX代码 Babel编译JSX 编译后的JSX执行React.createElement的调用 传入到ReactElement方法中生成虚拟Dom 最终返回给ReactDom.render生成真实Dom

20.说说AMD、CMD、commonJS模块化规范的区别?
CommonJS CommonJS: nodejs中的模块化机制,模块通过require()引入,exports或modules.exports导出

规范的特点:

当使用require命令加载某个模块时,就会运行整个模块的代码。 对于基本数据类型,属于复制。即会被模块缓存。同时,在另一个模块可以对该模块输出的变量重新赋值。 对于复杂数据类型,属于浅拷贝。由于两个模块引用的对象指向同一个内存空间,因此对该模块的值做修改时会影响另一个模块 循环加载时,属于加载时执行 执行流程:

根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性 模块输出:模块只有一个出口,module.exports对象,我们需要把模块希望输出的内容放入该对象 加载模块:加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象 AMD AMD: 上面的commonjs主要适用于node.js这种后端模块化,其中的require引用是同步的,前端环境中有很多异步的情况,因此commonjs是不够用的,AMD就出现了。

多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器 js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长 CMD CMD: 规范是阿里的玉伯提出来的,实现js库为sea.js。和requirejs非常相似,也是前端异步加载模块化。不同的是它的模块是需要的时候去请求,而不是先加载再使用。RequireJS用的就是AMD,AMD用define定义方法,用require引用模块。

AMD与CMD区别: 最明显的区别就是在模块定义时对依赖的处理不同 AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块 CMD推崇就近依赖,只有在用到某个模块的时候再去require

21.说说你对koa中洋葱模型的理解?
什么是koa?

Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面:

将node原生的req和res封装成为一个context对象。 基于async/await的中间件洋葱模型机制。

什么是洋葱模型。

Koa的洋葱模型是以next()函数为分割点,先由外到内执行Request的逻辑,然后再由内到外执行Response的逻辑,这里的request的逻辑,我们可以理解为是next之前的内容,response的逻辑是next函数之后的内容,也可以说每一个中间件都有两次处理时机。洋葱模型的核心原理主要是借助compose方法

22.说说package.json中版本号的规则?
一、版本的格式

patch:修复bug,兼容老版本

minor:新增功能,兼容老版本

major:新的架构调整,不兼容老版本

二、依赖版本号规则

这三个依赖分别使用了三个符号来表明依赖的版本范围。语义化版本范围规定:

*:升级到最新版本

^:升级次版本号和修订号

~:只升级修订号

三、必须匹配某个版本

version

必须大于某个版本 如:>1.1.2,表示必须大于1.1.2版

=version

可大于或等于某个版本 如:>=1.1.2,表示可以等于1.1.2,也可以大于1.1.2版本

<version 必须小于某个版本 如:<1.1.2,表示必须小于1.1.2版本

<=version 可以小于或等于某个版本 如:<=1.1.2,表示可以等于1.1.2,也可以小于1.1.2版本
————————————————
版权声明:本文为优快云博主「Matricola」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/Matricola/article/details/129800514

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值