![](https://s2.loli.net/2022/10/09/31kvp8HRJuoBCfc.jpg)
模拟题四
1. 左边宽度已知,右边自适应方案
2. 手写 Object.create
考察点:new 操作符
相关文章:Object.create
javascript
function create(proto) {
function F() {}
F.prototype = proto
return new F()
}
衍生问题
原型与原型链
3. 继承
考察点:继承 原型链继承、借用构造函数继承、组合继承、原型式继承(Object.create)、寄生式继承、寄生组合式继承
4. Class
Class 继承
5.setState 是同步的还是异步
考察点:批处理
类似问题:为什么有时 react 两次 setState,只执行了一次
React18之后都为异步
React18之前:
代码是同步的,执行是异步的。setState 做批处理,当多次连续调用 setState 时,React 会将这些更新合并(batch)为一次,从而只触发一次重新渲染,从而提高性能
像 setTimeout、promise 之类的原生方法和浏览器原生事件,setState 是同步,这是因为这些事件发生在 React 调度流程之外,不会触发批处理更新机制
可以通过 setState 接受一个函数作为参数,在函数内取到上一次的 state,来实现同步更新
虽然说 setState 在某些情况下是异步的,但实际上它并不是真正意义上的异步,而只是批量更新的一种优化手段
6.Redux 中间件机制
考察点:redux 核心逻辑
增强器 applyMiddleware 函数,装饰器模式
7.浏览器:内存泄露是什么
新生代内存回收:Scavenge 算法
- 将空间分成两半,一半是 from 空间,一半是 to 空间,新加入的对象会放在 from 空间,当空间快满时,执行垃圾清理;在角色调换,当调换完后的 from 空间快满时,再执行垃圾清理,如何反复
老生代内存回收:标记-清除-整理(Mark - Sweep),此为两个算法,「标记-清理」算法和 「标记-整理」算法
- 标记-清理:标记用不到的变量,清理掉
- 标记-整理:整理完内存后,会产生不连续的内容空间,为节省空间,整理算法会将内容排序到一处空间,空间就变大了
引用计数:引擎中有张“引用表”,保存了内存里面的资源的引用次数,如果一个值的引用次数是0,就表示这个只不再用到,因此可以将这块内存释放
缺点:循环引用,从而导致内容泄露
衍生问题:如何定位内存泄露
如何定位内存泄露
内存泄露有哪些情况
最常见的情况就是异步任务的回调未清除或者定时器任务没有清楚,其他的还有DOM引用未清除等。
如何排查内存泄露
通过开发者工具中的 Performance 模块,可以对页面加载和执行流程进行录制,之后在录制快照里查看内存的使用情况。如果发现有内存异常,则可以进一步缩小排查范围,最终找到引发内存泄露的代码。
8.工程化:split code 代码分割的原理是什么
9.微前端是什么?有什么用
考察点:微前端
微前端可以在一个页面上跑多个 react、vue 甚至原生项目,他们之间的 JS、CSS 相互隔离运行,不会相互影响,也有通信机制可以通信
怎么实现的?
当路由切换时,下载对应引用的代码,然后跑到容器中
比如 single-spa(qiankun就是基于此框架改造),它做的就是监听路由变化,路由切换的时候加载,卸载注册应用的代码
只不过 single-spa 的入口是一个 js 文件,需要代码手动指定要加载啥 js、css等,不方便维护
qiankun 是对 single-spa 的升级
它做了什么改造,一改为 html 为入口,解析 html,从中分析 js、css,再加载,这个是 import-html-entry 这个包实现的
二把 js 代码包裹了一层 function,然后再把内部的 window 用 Proxy 包一层,这样内部的代码就完全被隔离了,就实现了一个 js 沙箱
这是 js 隔离
还有样式隔离
qiankun 提供了两套样式隔离方案:shadow dom 和自己实现的 scoped
qiankun 做了样式隔离,有 shadow dom 和 scoped 两种方案,但都有问题:
- shadow dom 自带样式隔离,但是 shadow dom 内的样式和外界互不影响,导致挂在弹窗的样式会加不上。父应用也没法设置子应用的样式。
- scoped 的方案是给选择器加了一个 data-qiankun='应用名' 的选择器,这样父应用能设置子应用样式,这样能隔离样式,但是同样有挂在 body 的弹窗样式设置不上的问题,因为 qiankun 的 scoped 不支持全局样式
乾坤技术原理、为什么不用 iframe、父子应用如何通讯
为什么不用 iframe
隔离性无法被突破,导致应用间上下文无法被共享
- url 不同步。浏览器刷新 iframe url 状态会丢失、后退前进按钮无法使用
- UI 不同步,DOM 结构不共享。iframe 中弹出一个弹框,但不会出现在浏览器居中
- 全局上下文完全隔离,内存变量不共享。iframe 内外系统的通信、数据同步等需求,主应用的 cookie 要透传到根域名在不同的子应用中实现免登效果
- 同域情况下,cookie 可以通过 nginx 配置到同域名下的子路由转发到子引用服务端口
- 慢。每次子引用进入都是一次浏览器上下文重建、资源重新加载的过程
其实问题1、2、3都可以通过 postmessage 来解决,4就是体验问题,一般后台管理系统可以忽略
个人感觉是解决方案,qiankun 背靠阿里,有问题可以在 github 上找,而且 umijs 集成了qiankun,开发效率能提升
postmessage
postMessage是HTML5引入的一种跨文档通信的机制,可以在不同的窗口或框架之间传递数据,即使这些窗口或框架不属于同一个源。
postmenssage 是 HTML 引入的一种跨窗口通信机制,解决了以下爱问题:
- 页面和其打开的新窗口之前的数据传递
- 页面与嵌套的 iframe 之间的消息传递
- 多窗口之间的跨域数据传递
10. 算法题:二叉树的前序遍历 ⭐
二叉树的前序、中序、后序遍历