react18新增了哪些更新
- Concurrent Mode
- strict mode更新
- react组件返回值更新(支持null和undefined返回)
- 去掉的支持IE浏览器
- setState自动批处理
- 引入createRoot API, 支持并发模式渲染
react的设计思想
- 组件化
- 数据驱动试图
- 虚拟DOM
react性能优化手段有哪些
- shouldComponentUpdata
- memo
- getDerviedStateFromProps(让组件在props变化时更新state)
- 使用Fragment
- v-for使用正确的key
- 拆分尽可能小的可复用组件,ErrorBoundary
- 使用React.lazy和React.Suspense延迟加载不需要立马使用的组件
vue性能优化有哪些
- v-for正确使用key
- 封装高度复用的模块(http请求)和组件(ui库)
- 路由懒加载,首屏加载快
- 生产环境productionSourceMap: false
- 启用gzip压缩,打包体积更小
- keep-alive缓存不活跃的组件
- 插件cdn方式引入到html中,减小项目体积
- 组件按需导入
为什么要使用hook
优点
- 告别难以理解的class组件
- 解决业务逻辑难以拆分的问题
- 使状态逻辑复用变得简单可行
- 函数组件从设计理念来看,更适合react
缺点
- hooks还不能完整的为函数组件提供类组件的能力
- 函数组件给了我们一定程度的自由,却也对开发者的水平提出了更高的要求
- Hooks 在使用层面有着严格的规则约束
讲一下generator
- Generator是ES6提供的一种异步编程解决方案
- Generator函数有两个特征:
- function关键字和函数名之间有个星号
- 函数体内部使用yield表达式, 定义不同的内部状态
- 执行generator函数会返回一个遍历器对象, 可以依次遍历generator函数内部的每个状态
- 通过next方法才会遍历到下一个内部状态
讲一下promise
- Promise是异步编程的一种解决方案
- promise对象有三种状态:pending, fulfilled, rejected
- 特点: 一旦状态改变(从
pending变为fulfilled和从pending变为rejected),就不会再变,任何时候都可以得到这个结果 - promise实例存在的方法:then(), catch(), finally()
- promise构造函数存在的方法:all(), race(), resolve(), reject()
讲一下async...await
- async/await 是ES8提供的一种异步编程解决方案 它是 Generator 的语法糖,就是一个自执行的generate函数。利用generate函数的特性把异步的代码写成“同步”的形式。
谈谈你对vue的理解
- 是什么:vue是一个用于创建用户界面的开源javascript框架,也是一个创建单页面应用的web应用框架
- 核心特性:数据驱动(MVVM) 组件化 指令系统
- 和React的对比:
- 相同点
- 组件化思想
- 支持服务端渲染
- 都有虚拟Dom
- 数据驱动视图
- 都有自己的构建工具
- 都有支持native的方案
- 不同点
- 数据流向不同
- diff算法不同
- 相同点
你对$nextTick的理解
- Vue在更新DOM时是异步执行的,当数据发生变化,Vue将开启一个异步更新队列,视图需要等队列中所有数据变化完成之后,再统一进行更新
- 如果想要在修改数据后立刻得到更新后的DOM结构,可以使用Vue.nextTick()
你对mixin的理解
- mixin(混入):提供了一种非常灵活的方式,来分发Vue中组件中的可复用功能
- 使用场景:将不同组件中相同或相似的代码提取出来
单页面应用首屏加载速度慢如何解决
- 加载慢的原因:
- 网络延迟问题
- 资源体积是否过大
- 资源是否重复发送请求加载
- 解决方案:
- 减小入口文件体积
- 静态资源本地缓存
- UI框架按需加载
- 避免重复加载组件(配置webpack中的commonChunkPlugin)
- 图片资源压缩(雪碧图或者在线字体)
- 开启Gzip压缩(http压缩,在webpack中配置对应插件)
- 使用SSR(服务端渲染)
vue父子组件生命周期执行顺序
父beforeCreate-->父created-->父beforeMount-->子beforeCreate-->子created-->子beforeMount-->子mounted-->父mounted-->父beforeUpdate-->子beforeUpdate-->子updated-->父updated-->父beforeDestory-->子beforeDestory-->子destoryed-->父destoryed
宏任务微任务和DOM渲染的执行顺序
微任务-->DOM渲染-->宏任务
svg和canvas的区别
- Canvas 主要是用笔刷来绘制 2D 图形的。
- SVG 主要是用标签来绘制不规则矢量图的。
- 相同点:都是主要用来画 2D 图形的。
- 不同点:Canvas 画的是位图,SVG 画的是矢量图。
- 不同点:SVG 节点过多时渲染慢,Canvas 性能更好一点,但写起来更复杂。
- 不同点:SVG 支持分层和事件,Canvas 不支持,但是可以用库实现。
hash和histoty路由的区别
- hash路由通过监听onHashChange事件 history路由通过监听popState事件
- 地址栏表现形式不一样:hash带# history不带#
- hash不会重新加载页面,可以随意刷新 history不能刷新,需要后端配置,否则可能会返回404
- 都会改变当前页面显示的url,但都不会刷新页面
computed和watch的区别
- computed是计算属性 watch是侦听器
- watch可以进行异步操作 computed不行
- computed支持缓存 watch不支持缓存
浏览器事件循环机制
- 是什么: 实现单线程非阻塞的方法就是事件循环
- 执行一个宏任务,如果遇到微任务就将它放到微任务的事件队列中
- 当前宏任务执行完成后,会查看微任务的事件队列,然后将里面的所有微任务依次执行完
Node事件循环
- EventLoop有6个阶段
- timers阶段:这个阶段执行timer(setTimeout、setInterval)的回调
- 轮询阶段(poll):检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外),其余情况 node 将在适当的时候在此阻塞
- 检查阶段(check):setImmediate() 回调函数在这里执行
你对node的理解
- node.js是一个开源与跨平台的Javascript运行时环境
- 特点:非阻塞异步 事件驱动
- 优点:处理高并发场景性能更佳 适合I/O密集型应用
- 缺点:不适合CPU密集型应用 只支持单核CPU 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
- 应用:后台管理系统 多人实时聊天客户端
线上问题如何定位
- 线上问题一般分为两类:一类是接口数据导致 另一类是数据正常,前端问题
- 数据不用:本地更多的是测试环境的数据,而线上是真实环境的数据,不同数据,页面的渲染和交互可能不同
- 代码疏忽:可能是某些场景的边界情况未处理好,或者未做容错降级处理
- 解决方案:直接在线上环境添加source-map链接来定位问题 相当于生产环境+本地的sourceMap文件
- 谷歌浏览器的Sources面板支持右键添加source-map
- 实现步骤:把生产环境的代码在本地重新打包,然后用http-server起一个静态服务,拿到source-map文件链接添加到浏览器中
less和sass的区别
- less是基于javascript,在客户端处理。sass是基于ruby在服务端处理
- 关于变量less用@ 而sass用$
- sass支持条件语句而less不支持