1.cpu缓存
用于减少处理器访问内存所需平均时间的部件。其容量远小于内存,但速度却可以接近处理器的频率。
当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在,则不经访问内存直接返回该数据;如果不存在,则要先把内存中的相应数据载入缓存,再将其返回处理器。
2.浏览器缓存
(原因)浏览器缓存类似cpu缓存,用于加速浏览,浏览器再用户磁盘上对请求过的页面进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示页面
(读写顺序)1.调用service worker的fetch事件获取资源;查看memory cache;查看disk cache;如果强制缓存未失效,则使用强制缓存;如果失效,使用协商缓存,比较后确定304还是200
(缓存位置)service worker memory cache disk cache
service worker 是一个注册再指定源和路径下的事件驱动worker;特点是:运行在worker上下文,不能访问dom,独立与主线程之外,不会造成阻塞,设计完全异步,同步api不能在service worker中使用
memory cache 是浏览器内存中的缓存,相比disk cache它的特点是读取速度快,但容量小,一旦tab页关闭,memory cache就将清空。
disk cache是存在硬盘中的缓存,根据http头部的各类字段进行判定资源的缓存规则,相比memory cache的disk cache拥有存储空间时间长等优点,网站中的绝大多数资源都是存在disk cache 中的。
3.JavaScript事件循环
js在执行时,有以下几个主要部分参与了事件循环。
1.执行栈,用来创建执行环境,执行js代码 2.异步处理模块,用来处理异步事件 3.任务队列,包括宏任务队列和微任务队列
事件循环的过程为,当执行栈为空的时候,就会从任务队列中,取任务来执行,共分三步:
1.取一个宏任务来执行,执行完毕后,下一步。2.取一个微任务来执行,执行完毕,再取一个微任务来执行。直到微任务队列为空,执行下一步。
为什么有宏任务和微任务之分?个人理解,宏任务才是真正意义上的任务,而微任务相当于宏任务的附属的一系列操作和响应。所以,js引擎每次取出一个宏任务执行,并且执行相关的微任务,这样保证一个完整的任务被执行完。这就是微任务队列只有一个的原因,微任务队列就是用来辅助宏任务队列的任务的完整执行的。宏任务队列才是真正意义的任务,任务有优先级之分就很好理解了,因此才有多个宏任务队列,为了区分优先级。
4.react的fiber架构
什么是fiber架构? React使用的算法将一棵树与另一棵树进行比较,以确定哪些部分需要更改。
解决了什么问题? 组件不能返回数组,常见的场合时ul元素下只能使用li,tr元素下只能使用td或th,这时这里有一个组件循环生成li或td列表时,我们并不想再放一个div
弹窗问题,之前一直使用不稳定的unstable_renderSubtreeIntoContaine。弹窗是依赖原来DOM树的上下文,因此这个api第一个参数是组件实例,通过它得到对应虚拟DOM,然后一级级往上找,得到上下文。
异常处理,我们想知道哪个组件出错,虽然有React DevTool,但是太深的组件树查找起来还是很吃力,希望有个方法告诉我出错位置,并且出错时,能让我有机会进行修改工作。
React16将内部组件层改成FIber这个数据结构,Fiber节点拥有return,child,sibling三个属性,分别对应父节点,第一个孩子,它右边的兄弟,有了它们就足够将一棵树变成一个链表。
5.reacthook
hook给函数式组件增加状态和逻辑,并将功能代码聚合在一起 hook给函数式组件添加状态和逻辑,并将功能代码聚合在一起 不要在循环,条件或嵌套函数中调用hook,确保总是在你的react函数的最顶层以及任何return之前调用它们。 因为这样确保hook在每一次渲染中都按照同样的顺序被调用,这让react能够在多次的usestate和useeffect调用之间保持hook状态的正确 每一个useState都会在当前组件中创建一个hook对象,并且这个对象中next属性始终指向下一个useState的hook对象,这些对象以一种类似链表的形式存在Fiber.memorizedState中, 而函数组件就是通过fiber这个数据结构来实现每次render后不会被useState重新初始化 6.有状态组件和无状态组件有状态组件就是一个类,无状态组件是一个函数;
区别:
1.(是否拥有state)有状态组件可以使用状态:state,无状态组件不能使用state;只有继承component这个组件它才能拥有state进行一些数据的存储和管理,仍然可以拥有props;
2.(生命周期)如果是有状态组件的话那么你就会拥有生命周期函数,无状态组件就不用有生命周期函数,因为数据的更改都是通过状态进行更改。使用props进行组件间的通信进行传值,如果要更改某一些数据的话使用的是state,既然数据可以发生变化那么它就会触发对应的生命周期函数;
7.webpack plugin
plugin(插件)是webpack的支柱功能,webpack整体的程序架构也是基于插件系统之上搭建的,plugin的目的在于解决loader无法实现的其他功能.
plugin是webpack插件系统,目的解决loader无法实现的其他功能
8.gitreset
回退到之前版本 变成没有add状态
Less translate VIP 已过期, 请续费后继续使用 标签:缓存,科技,队列,cache,面试,任务,商汤,组件,执行 From: https://www.cnblogs.com/baller-coder/p/16993997.html