node面试
一、koa中间件执行机制
1.添加中间件的方式是使用Koa实例的use方法,并传入一个generator函数,这个generator函数接受一个next参数
2.use的原理:function Application () {this.middleware = [] // 这个数组就是用来装一个个中间间的}
3.每次执行use方法,就把外面传进来的generator函数push到middleware数组中
app.use = function (fn) {this.middleware.push(fn)}
4.koa中是预先通过use方法,将请求可能会经过的中间间装在一个数组中。
5.callback函数就是请求到来的时候执行的回调。把装着中间件middleware的数组作为参数传递为compose这个方法。
6.componse把毫无关系的一个个中间件给收尾串起来了,就好比我们平常的烤面筋
7.componse将中间件从最后一个开始处理,并一直往前知道第一个中间件。其实最关键的就是将最后一个中间件得到generator
作为参数传递给前一个中间件。当最后一个中间件的参数next是空的generator函数生成对象
中间件是怎么跑起来的:https://juejin.im/post/591c8b4544d904006c90a2cb
vue面试
一、介绍下MVVM(数据的双向绑定)
M: model数据模型
V: view 界面
MV:作为桥梁负责沟通view跟model
只关心数据的流传,减少强耦合性。最关键的就是数据的双向绑定
关键步骤:1.实现数据监听器Observer,用object.defineProperty()重写数据的get/set。值更新就在set中通知订阅者更新数据
2.实现模板编译compile,深度遍历dom树,对每个元素节点的指令模板替换数据以及订阅数据
3.实现watch用于连接Observer和compile,能够订阅并接受每一个属性的变动的通知,执行指令绑定的相应的回调函数,从而更新数据
mvc和mvvm其实区别并不大。都是一种设计思想。主要就是mvc中Controller演变成mvvm中的viewModel。mvvm主要解决了mvc中大量的DOM 操作使页面渲染性能降低,
加载速度变慢,影响用户体验。和当 Model 频繁发生变化,开发者需要主动更新到View 。
二、 eventBus vuex
原理:eventbus 解决了兄弟组件之间事件传递问题,本质是订阅发布者模式,从而摆脱了兄弟之间需要父组件转而传递的复杂。还有一种方法是vuex数据流,单一状态树,rootState树根
名词,专车。订阅者跟发布者都引用专车,这个vue实例,来完成订阅发布者。 emit(发布) on(订阅一个组件)
npm包 vue-event-proxy
vuex 是将数据单独的抽离出来,一种状态管理工具,它借鉴的是Flux、redux的基本思想,将转态抽离到全局形成一个store
三、watch:
对属性进行监听,允许我们执行异步操作,限制我们执行该操作的频率(debounce),并在我们得到结果前,设置中间转态。
四、Vue的双向数据绑定实现原理
1.核心就是数据劫持 + 发布/订阅者模式:vue使用的是Object.defineProperty()通过监听他的get/set事件,监听对数据的操作,从而触发数据同步
Object.defineProperty缺陷的:
1.只能对属性进行数据劫持,并且需要深度遍历整个对象
2.对于数组不能监听数据的变化
而proxy原生支持监听数组的变化,并且可以直接对整个对象进行拦截,所有Vue在下个版本中用proxy替换object.defineProperty
五、nextTick原理
六、生命周期函数 https://juejin.im/post/5b41bdef6fb9a04fe63765f1
new Vue(创建一个Vue对象)--> beforeCreate --> observer Data(开始监控data对象数据变化) --> init event(vue内部初始化事件)
--> created() --> compile(编译模板,把data里面的数据和模板生成html) --> beforeMount(还没有生成HTML到元素上) -->
mounted(挂载完成,也就是模板中的html渲染到了html页面中) --> beforeUpdate (Vritual Dom) --> updated --> beforeDestroy --> destroyed
1.ajax请求最好放在created里面,页面可以访问到this了
2.关于dom的操作要放在mounted里面,在mounted前面还没有生成dom
3.每次进入/离开组件都要做一些事情,用什么钩子函数:
不缓存:进入的时候可以用created和mounted钩子,离开的时候可以使用beforedDestory(可以访问this)和destoryed