20道Vue常见面试题,你会几道?(vue的一些面试题)
sinye56 2024-10-26 14:44 6 浏览 0 评论
导语
从眼镜的皮肤和黄相见的格子似的我看到了,花花的那一分钟面试官应该是来了。我像样一样,准备好3的时间进行自我善。
在这期间,为了避免尴尬,我面试官的眉毛中间,虽然面试官很明显对我的经历不是很疯狂。他在 1 分半的时候打断了我。
你觉得自己最擅长的技术栈是什么?
Vue 吧,我尤大,最近刚发布了 Vue 的首部影片,真的很好看。
那你能讲一讲MVVM吗?
MVVM 是 Model-View-ViewModel 缩写,也就是把 MVC 中的 Controller 放大成 ViewModel。Model 层代表数据模型,View 代表 UI 组件,ViewModel 是 View 和 Model 层的路径,数据会绑定到 viewModel 层并自动将数据渲染到页面中,视图变化的时候会通知 viewModel 层更新数据。
简单说一下 Vue2.x 响应式数据原理
Vue 在初始化数据时,会使用 Object.defineProperty 重新定义数据中的所有属性,当页面使用对应属性时,首先会进行收集收集(收集当前组件的 watcher),如果属性发生变化会通知相关依赖进行更新操作(发布订阅)。
那你知道Vue3.x响应式数据原理吗?
(还好我有看,这个难不倒我)
Vue3.x 改用 Proxy 替代 Object.defineProperty。 因为 Proxy 可以直接监听对象和数组的变化,并且有路径 13 种拦截方法。并且作为新标准将受到浏览器的影响。
“代理目标代理对象的第一层,那么Vue3又是怎么处理这个问题的呢?”
(很简单啊)
判断当前 Reflect.get 的返回值是否为对象,如果是则再通过反应方法代理,这样就实现了钻探。
“数组的时候可能触发多次get/set,那么如何防止触发多个呢?”
我们可以判断键是否为当前被代理对象目标自身属性,也可以判断旧值和新值是否完全相同,只有满足以上两个条件时,才有可能触发。
面试官抬头了。心里暗想(这小子还行,比上两个强,应该是多多少少少Vue3的源码了)
vue2.x中如何监测数组变化
使用函数劫持的方式,重写了数组的方法,Vue 将数据中的数组进行了原型链构造了,框架了自己定义的数组原型方法。
这样当调用数组api时,可以通知依赖更新。如果数组中包含引用类型,则由数组中的引用类型重新循环跟踪进行监控。这样就实现了监视数组变化。
(能问到这的面试官都知道深陷,这些经常操作要牢牢)
nextTick 知道吗,实现原理是什么?
在下一次DOM更新循环结束后执行主要任务采用。nextTick使用了宏任务和微实验。承诺、突变、观察者、立即、设置如果以上不行则采用 setTimeout
定义一个异步方法,多个调用nextick方法方法存入这个T中,通过方法解析空清当前动态。
(看到这你就会发现,其实问框架还是最终挑战你的原生 JavaScript 功底)
说一下 Vue 的生命周期
beforeCreate 是 new Vue() 之后触发的第一个钩子,在当前阶段的数据、方法、计算上的数据和方法都不能被访问。
创建在实例创建完成后发生,当前阶段已经完成了数据查看,也就是可以使用数据,更改数据,更改数据不会触发更新的函数。可以做一些初步数据的获取,在当前阶段无法与 Dom 进行交互,如果非需要,可以通过 vm.$nextTick 来访问 Dom。
上山之前发生在挂载之前,在这之前模板模板已导入渲染函数编译。而当前阶段虚拟世界已经创建完成,即将开始渲染。此时也会对数据进行更改,不会触发更新。
挂载完成后发生,处于当前阶段,真实的 Dom 挂载完成,数据完成绑定操作,可以访问到 Dom 节点,使用 $refs 属性对 Dom 进行。
beforeUpdate 发生在更新之前,也就是响应式数据发生更新,dom 重渲染之前被触发,你可以在当前阶段进行虚拟化数据,不会造成重渲染。
更新发生在更新完成之后,当前阶段组件 Dom 已完成更新。要注意的是在此期间更改数据,因为这可能会导致无限循环的更新。
发生在销毁之前,可以在实例完全精细之前,在当前阶段发生完全被,在没有进行善后收尾工作,之前发生的发生发生我们。
破坏发生在除灭久之后,此时只剩下了空壳。组件已被拆解,数据绑定被解除,监听被移出,子实例也统统被敏感。
你的接口请求一般选择哪个生命周期中?
接口请求一般mounted中,但需要注意的是服务端渲染时不支持挂载,需要created中。
下一次计算和观察
计算发生的本质是一个具有缓存的观察者,依赖的属性变化会更新视图。适用计算比较消耗性能的计算场景。
当再现真实再现时,在模板中动态实时动态模板系统,可以将模拟的真实动态计算属性中处理。
观看没有缓存性,更多的是观察的作用,可以监听部分数据可以执行操作。当我们需要深度监听对象中的属性时,深度打开:真正的选项,
像这样会带来性能问题,优化的话可以使用字符串监听形式,如果没有写到组件中,不要忘记使用 unWatch 手动取消哦。
说一下 v-if 和 v-show 的区别
当条件不成立时,v-if 不会渲染 DOM 元素,v-show 操作是样式(display),切换当前 DOM 的显示和隐藏。
组件中的数据为什么是一个函数?
一个对象被实例多次事件,也会多次发生实例上。本质上,这些都是用同样的一个构造函数。如果数据是对象的话,引用类型,会影响到所有的实例。所以为了保证组件不同的实例之间数据不冲突,数据必须是一个函数。
说一下 v-model 的原理
v-model 本质就是一个语法糖,可以看成是 value + 的语法糖。可以通过模型属性的 prop 和 event 属性来进行自定义。原生的v-model,会根据标签的不同产生不同的事件和属性。
Vue 事件绑定原理说一下
原生事件绑定是通过addEventListener绑定给真实元素的,组件事件绑定是通过Vue自定义的$on实现的。
” 面试官:(这小子基础还可以,下我得上难度了)
Vue 模版编译原理知道吗,能简单说一下吗?
简单地说,Vue 的编译过程将模板转化为渲染函数的过程。会经历以下阶段:
生成AST树
优化
代码生成器
首先解析模板,生成AST语法树(一种用JavaScript对象的形式来描述整个模板)。使用大量的正则表达式对模板进行解析,
遇到标签、文本时的全部执行的钩子进行相关处理。
Vue 的数据是响应式的,但实际上模板中所有的数据都是响应式的。有一些数据首次渲染后就不会再变化,对应的 DOM 也不会变化。
那么优化过程就是深度穿越AST树,按照相关对树节点进行标记。这些被标记的节点(节点)我们就可以跳过对的比对,对运行时的框架最大的优化作用条件。
编译的最后一步是将优化后的 AST 树转化为可执行的代码。
“面试官:(精神小伙啊,有点东西,庞大提升,不信难不倒你)”
Vue2.x 和 Vue3.x 渲染器的差异分别算法说一下
简单来说,不同算法有以下几个过程
同级比较,再比较子节点
先判断一方有子节点一方没有子节点的情况(如果新的孩子没有子节点,将旧的子节点移除)
比较分别子节点的情况(core diff)
回归比较子节点
正常 Diff 两个树的时间复杂度是 O(n^3),但实际情况下我们很少会进行跨层级的移动 DOM,所以 Vue 将 Diff 进行了优化,从 O(n^3) -> O (n),
只有当新旧孩子都为多个子节点时才需要用核心的差异进行算法同层级比较。
Vue2 的核心差异算法采用了双端比较的算法,同时从新旧孩子的端开始进行比较,借助关键值找到可连接的节点,再进行相关操作。
相比React的差异,情况下可以减少移动节点次数,减少外观的性能,增加的乐趣。
Vue3.x 例子了 ivi 算法和 inferno 算法
在创建 VNode 时就确定其类型,以及在安装/补丁的过程中采用位操作类型来判断一个 VNode 的,在基础上再结合这个核心的差异算法,
(实际的实现结合Vue3.x源码可以看。)
该算法中还运用了动态规划的思想解决问题序列。
“ 面试官:(可以看,是个苗子,不过自我介绍属实无聊,下一道题)”
第三次虚拟Dom以及关键属性的作用
因为在浏览器中操作 DOM 是很简单的。 频繁的操作 DOM,会一定的性能问题。这就是产生虚拟 Dom 的产生原因。
Vue2的Virtual DOM示例了开源库snabbdom的实现。
Virtual DOM JS 本质就是用一个原生的 对象去描述一个 DOM 节点。是对真实 DOM 的抽象。(也就是源码中的 VNode 类,它定义在 src/core/vdom/vnode.js 中。)
VirtualDOM映射到真实DOM要经历VNode的create、diff、patch等阶段。
「关键的作用是事物的事物DOM元素。」
新旧孩子们中的节点不是顺序是不同的时候,最佳的操作应该是通过移动元素的位置来达到更新的目的。
需要在新孩子的旧节点中保存地图,才能在旧孩子的节点中找到可轮到的节点。关键也就是孩子中节点的唯一标识。
keep-alive 了解吗?
keep-alive 可以实现组件缓存,当组件发生变化时不会对当前组件进行卸载。
经常的两个属性包含/排除,允许组件有条件的进行修复。
两个生命周期启动/停止,得知当前组件是否发生状态。
keep-alive的中还运用了LRU(Least Nearly Used)算法。
(又是数据结构与算法,在前端有了这么多的应用)
Vue 中组件生命周期调用顺序说一下
组件的调用顺序都是先父后子,渲染完成的顺序是先子后父。
组件的精细操作是父后子,精细的先序是先子后父。
加载渲染过程
父beforeCreate->父已创建->父beforeMount->子beforeCreate->子已创建->子beforeMount->子挂载->父已挂载
子组件更新过程
父beforeUpdate->子beforeUpdate->子更新->父更新
父组件更新过程
父更新前 -> 父更新
浊过程
父beforeDestroy->子beforeDestroy->子被破坏->父被破坏
Vue2.x 组件通信有哪些方式?
父子组件通信
父->子道具,子->父 $on、$emit
获取父子组件实例$parent、$children
Ref 获取实例的方式调用组件的属性或者方法
提供、注入官方不推荐使用,但写组件库时很常用
兄弟组件通信
Event Bus 实现跨组件通信 Vue.prototype.$bus = new Vue
Vuex
跨级组件通信
Vuex
$attrs、$listeners
提供、注入
SSR了解吗?
SSR 也就是服务端渲染客户端,也就是将 Vue 再把标签渲染成 HTML 的工作触发服务端完成,然后再把 html 直接返回给客户端。SSR 一起更好的 SEO、并且首屏加载速度更快等优点。不过它也有一些对比,比如我们的条件会受到限制,服务器端渲染只支持在创建和创建两个钩子之前,当我们需要一些外部扩展库时需要特殊处理,服务端渲染应用程序也需要停止 Node.js 的运行环境。还有就是服务端渲染应用程序的剩余需求。
你都可选择哪些Vue的性能优化?
编码阶段
减少数据中的数据,数据中的数据都会增加getter和setter,会收集对应的观察者
v-if 和 v-for 不能连用
如果需要使用 v-for 给每项元素绑定事件时使用事件代理
SPA页面采用keep-alive缓存组件
在更多的情况下,使用 v-if 替代 v-show
关键保证
使用语音懒加载、异步组件
防抖、节流
数学老师导入
长列表滚动到可视区域动态加载
图片懒加载
SEO优化
预渲染
服务端渲染 SSR
打包优化
压缩代码
摇树/范围吊装
使用 cdn 加载应用模块
多线程打包happypack
splitChunks 抽离公共文件
sourceMap优化
用户体验
简屏
PWA
还可以使用缓存(客户端缓存、服务端缓存)优化、服务端开启gzip压缩等。
(优化是个大工程,会涉及,这里再申请一个很多方面)
hash 语音和历史语音实现原理说一下
location.hash 的具体值就是 URL 中#后面的东西。
history 实际采用了 HTML5 中提供的 API 来实现,主要有 history.pushState() 和 history.replaceState()。
面试官一阵已经凉透的咖啡,喝了一口。
(我难道问不倒这小子了么)
相关推荐
- Linux两种光驱自动挂载的方法
-
环境:CentOS6.4西昆云服务器方式一修改fstab文件/etc/fstab是系统保存文件系统信息?静态文件,每一行描述一个文件系统;系统每次启动会读取此文件信息以确定需要挂载哪些文件系统。参...
- linux系统运维,挂载和分区概念太难?在虚机下操作一次全掌握
-
虚拟机的好处就是可以模拟和学习生产环境的一切操作,假如我们还不熟悉磁盘操作,那先在虚机环境下多操作几次。这次来练习下硬盘扩容操作。虚拟机环境:centos8vm11linux设备命名规则在linux中...
- Linux 挂载 NFS 外部存储 (mount 和 /etc/fstab)
-
mount:手工挂载,下次重启需再重新挂载,操作命令:mount-tnfs-ooptionsserver:/remote/export/local/directory上面命令中,本地目录...
- 在Linux中如何设置自动挂载特定文件系统(示例)
-
Linux...
- Linux环境中的绑定挂载(bind mount)
-
简介:Linux中的mount命令是一个特殊的指令,主要用于挂载文件目录。而绑定挂载(bindmount)命令更为特别。mount的bind选项将第一个目录克隆到第二个。一个目录中的改变将会在...
- Linux挂载CIFS共享 临时挂载 1. 首先
-
如何解决服务器存储空间不足的问题?大家好,欢迎回来。在上一期视频中,我为大家介绍了如何利用Linux挂载来扩容服务器存储空间。这一期视频,我将以Linux为例,教大家如何进行扩容。群辉使用的是Linu...
- Linux 硬盘挂载(服务器重启自动挂载)
-
1、先查看目前机器上有几块硬盘,及已挂载磁盘:fdisk-l能够查看到当前主机上已连接上的磁盘,以及已经分割的磁盘分区。(下面以/dev/vdb磁盘进行分区、挂载为例,挂载点设置为/data)df...
- linux 挂载磁盘
-
在Linux中挂载硬盘的步骤如下:...
- 笨小猪教您Linux磁盘挂载
-
本教程针对Linux系统比较熟悉或者想学习Linux基础的用户朋友,本教程操作起来比较傻瓜式,跟着步骤就会操作,本文使用的工具是XShell同时多多注意空格(文中会有提示)。【问答】什么是磁盘挂载?答...
- Linux 磁盘挂载和docker安装命令
-
本篇给大家介绍Linux磁盘挂载和docker安装的相关内容,Linux服务器的操作是一个手熟的过程,一些不常用的命令隔断时间就忘记了,熟话说好记性不如烂笔头,还需在平时的工作中多练习记录。...
- Linux设置开机自动挂载分区
-
有时候,我们在安装完Linux系统之后,可能在使用过程中添加硬盘或者分区进行使用,这时候就需要手动把磁盘分区挂载到某个路径,但是开机之后就会消失,需要重新挂载,非常麻烦,那么我们应该如何设置开机自动挂...
- 在linux挂载一个新硬盘的完整步骤
-
以下是在Linux中挂载新原始磁盘的完整步骤,包括分区、创建文件系统以及使用UUID在/etc/fstab中启动时挂载磁盘:将新的原始磁盘连接到Linux系统并打开电源。运行以下命令,...
- Linux系统如何挂载exFAT分区
-
简介:Linux系统中不能像Windows系统那样自动识别加载新设备,需要手动识别,手动加载。Linux中一切皆文件。文件通过一个很大的文件树来组织,文件树的根目录是:/,从根目开始录逐级展开。这些文...
- Linux系统挂载硬盘
-
fdisk-l查看可挂载的磁盘都有哪些df-h查看已经挂载的磁盘...
- WSL2发布,如何在Win10中挂载Linux文件系统
-
WSL2是最新版本的架构,它为Windows子系统提供支持,使其能够在Windows上运行ELF64Linux二进制文件。通过最近的更新,它允许使用Linux文件系统访问存储在硬盘中的文件。如果你...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- 关闭防火墙linux (53)