面试题(更新中)

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/, '')
            
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容