snabbdom的大致流程(虚拟dom的鼻祖)
h()创建javascript对象,描述真实对象
init() 设置模块,返回高阶函数,patch()
-
patch()比较新旧
vnode
的区别,diff算法核心
dom树解构的变化和更新
typescript
JavaScript的超集,snabbdom 就是用typescript语言写的,扩展JavaScript的静态类型,基于类面向对象编程。
怎么终端ajax请求?
1.设置超时时间
2.手动停止,核心是调用XHTMLHttpRequest对象上的abort方法,(不能当作终止对服务器的请求操作,只能当作在前端页面立刻执行Ajax成功后的方法)
html5的离线存储?
用户没有连接互联网,正常访问,连接之后,更新缓存
html5 的离线存储是基于一个新建的.appcache文件的缓存机制,通过这个文件解析离线清单,这些资源会被cookie一样被存储
webpack和gulp的区别
gulp 规范前端开发流程,实现前后端分离,模块化开发,版本控制,文件合并和压缩,mock数据等功能的一个前端自动化构建工具。(流水线)
webpack
loader和plugin的区别
loader本质是一个函数,在该函数中对接受到的内容进行转换,返回转换后的结果,loader只认识JavaScript,所以loader就成了翻译官,转义的预处理(module.rule)
plugin就是插件,基于事件流框架,扩展webpack的功能,webpack运行的生命周期会广播许多事件,(单独配置,类型为数组)参数通过构造函数传入
vue.nextTick和$nextTick
都是dom更新循环结束之后的延迟回调。(修改数据立即执行)
$nextTick只是在调用的时候自动把this绑定到他的调用实例上
CORS
同源通信,跨域通信。fetch是实现CORS通信的
宏任务和微任务
- 宏任务:当前调用栈中执行的任务(由触发线程维护)
- 微任务 : 当前宏任务执行完,在下一个宏任务开始之前需要执行的任务(由js引擎线程维护)
react的生命周期
挂载, 更新(存在), 卸载(销毁)
- constructor(构造器)
- componentDIdMount() (ajax请求挂载)
- shouldComponentUpdata() (判断数据是否更新)
新增
- getDerivedStateFromProps()
- getSnapshotBeforeUpdate()
vue中的设计模式
- 工厂模式
- 单例模式
- 发布订阅
- 装饰
- 策略
vue.mixin和vue.extend
- vue.mixin :抽离公共业务逻辑,类似对象的继承,调用mergeOptions方法合并,采用策略模式
- vue.extend : 使用基础Vue构造器,创建子类,参数是一个包含组件选项的对象
vue模板编译原理
- 将模板字符串转化成element ATS(解析器)
- 对AST进行静态节点标记,虚拟dom的渲染优化
- 使用elements ATS 生成render函数代码字符串
withRouter
垃圾回收
定义变量时分配内存
使用值的过程实际时对分配内存进行读取和写入的操作
引用计数垃圾收集(循环引用,无法识别造成内存泄漏),标记清除算法
instance的原理
原型链
mvvm
自定义指令
vue监测数组
重写数组的方法,指向自己构造函数的原型
面试题(原型)
function Parent() {
this.a = 1;
this.b = [1, 2, this.a];
this.c = { demo: 5 };
this.show = function () {
console.log(this.a , this.b , this.c.demo );
}
}
function Child() {
this.a = 2;
this.change = function () {
this.b.push(this.a);
this.a = this.b.length;
this.c.demo = this.a++;
}
}
Child.prototype = new Parent();
var parent = new Parent();
var child1 = new Child();
var child2 = new Child();
child1.a = 11;
child2.a = 12;
parent.show();
child1.show();
child2.show();
child1.change();
child2.change();
parent.show();
child1.show();
child2.show();
配置@vite.config.json
"allowSyntheticDefaultImports" :true,
"paths": {
"@/*" :[
"src/*"
]
}
配置代理
server :{
proxy :{
"/api":{
target : "" //真正的地址,
changeOrigin: true, //是否跨域
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}