做自我介绍,你好,我是来面试贵公司的前端开发工程师岗位的,主要技术栈为xxx,当前在本公司主要从事xxx方面的前端开发工作(一堆随意说都行)
无先后顺序
1.type和interface的区别
type的区别
- type可以定义 基本类型的别名
- type可以通过 typeof 操作符来定义
- type可以声明 联合类型
- type可以声明 元组类型
interface的区别
- interface可以 声明合并
2.vue2和vue3的区别
- vue2使用optionsAPI,vue3使用compositionAPI
- vue3向外提供了很多内置API使用,而vue2没有
- vue2所有的方法和数据几乎都挂在vue实例原型上,可能会出现初始化加载慢等问题
- vue2使用definePropert对数据进行劫持,vue3使用Proxy对数据进行代理
- defineProperty只能监听某个对象属性,不能对全对象监听,Proxy可以监听数组,不⽤再去单独的对数组做特异性操作,通过Proxy可以直接拦截所有对象类型数据的操作,完美⽀持对数组的监听
- 另外vue3还新增了⼀些内置组件和⽅法,比如teleport传送门组件,setup函数
- vue3加入了TS类型支持
3.es module和commonjs的区别
- commonjs nodejs里的标准
- commonjs这种加载称为运行时加载
- es6 module 这种加载称为编译时加载或者静态加载
- CommonJs导出值是拷贝,可以修改导出的值,这在代码出错时,不好排查引起变量污染
- Es Module导出是引用值之前都存在映射关系,并且值都是可读的,不能修改
4.首屏加载慢有哪些优化办法
- 数据分页
- 图片懒加载
- ssr
- 第三方模块按需加载
- 减少同步阻塞操作
- seo优化
- 路由懒加载,异步组件
- 在更多的情况下,使用v-if代替v-show
- 如果需要使用v-for给每个元素绑定事件时,使用事件委托
- 压缩代码
- 缓存优化(客户端缓存,服务端缓存)
5.webpack与vite的区别
- 开发环境的区别
- vite自己实现server,不对代码打包,充分利用浏览器对
- webpack-dev-server 常使用babel-loader 基于内存打包,比vite慢很多
- 生产环境区别
- vite使用 rollup + esbuild 来打包js代码
- webpack使用babel来打包js代码,比esbuild(go语言编写)慢很多
- webpack能使用esbuild吗?可以,需要自己配置很麻烦
- 文件处理时机
-
vite只会在你请求某个文件的时候处理该文件
-
webpack 会提前打包好 main.js,等你请求的时候直接输出打包好的js给你
-
6.webpack都做过哪些优化
- 构建时间的优化:
thread-loader,多进程打包,放在耗费时间的babel-loader之前cache-loader,缓存资源,提高二次构建速度,放在比较耗时间的loader之前- 开启热更新,提高修改代码重新构建的时间
exclude和include配置不需要处理和需要处理的文件,配置这两个属性可以提高构建速度- 区别构建环境,1.开发环境中去除
代码压缩gzip体积分析等优化提高构建速度。2.生产环境中需要代码压缩gzip体积分析等优化,减少整个打包文件的体积 - 提高webpack版本,版本越高打包效果越好
- 打包体积的优化
- css优化
css-minimizer-webpack-plugincss代码压缩 - js优化
terser-webpack-pluginjs代码压缩 3.tree-shaking 只打包有用代码,无用代码不会打包
- css优化
- 用户体验的优化
1.js模块懒加载,分成很多js小文件
2.开启gzip优化打包体积
comporession-webpack-plugin3.小图片转为base64格式asset-module4.合理配置hash值,为了让浏览器能识别更新前后的hash值,未更新的才能命中缓存,从而达到性能优化的目的
7.Promise.all, Promise.race, Promise.allSettled,三个方法的区别
1. Promise.all -> 返回一个promise,在all参数中的由promise组成的可迭代对象,全部都由等待状态变为成功状态时,会返回一个resolve到返回的promise中。相反promise组成的数组中有一个由等待状态变为失败状态的,就会返回一个reject到返回的promise中
2. Promise.race -> 返回一个promise, 在race参数中的由promise组成的可迭代对象,只要有一个由等待状态变成成功或者失败状态,就会返回一个resolve或者reject到返回的promise中
3. Promise.allSettled -> 返回一个promise,在allSettled参数中由promise组成的可迭代对象,全部都由等待变成成功或者失败时,会返回一个数组promise,该数组由成功和失败结果一起组成的promise结果
8.es6有哪些新特性
- 新增symbol类型
- const/let
- 变量得结构赋值,剩余运算符,扩展运算符
- 模板字符串
- 箭头函数
- Set和Map
- Proxy/Reflect
- Promise
- async await
- Class
- Module语法(import/export)
9.v-model在vue2和vue3中的区别
1.vue2中v-model可以使用 sync修饰符
2.vue3中废除sync修饰符,可以使用多个v-model,v-model可以使用自定义修饰符
10.实现v-model
自行搜索
11.一个字典数据,如果做到请求一次多个组件使用
我回答了,vuex全局缓存,他说不是想要这个答案,说是排除外部工具,我也没懂啥意思,我就说如果是兄弟组件的话,可以在父组件请求字典数据,然后组件通信把数据传入子组件中去。 看当时面试官的表情,感觉还像是没对,我又说我可以定义一个model文件,在文件中封装请求字典方法导出全局使用也行,我心想我这不跟vuex一个意思吗? 希望有知道的朋友补充
12.proxy和Object.defineProperty的区别
1.Object.defineProperty是对一个对象属性进行拦截,拦截属性的setter和getter方法,在对象属性发生变化时进行特定的操作。而proxy则是劫持整个对象
2.proxy会返回一个对象,直接对这个对象进行操作即可,而defineProperty则需要遍历对象属性进行修改
3.Object.defineProperty 监听不了拦截数组新增成员的改变,而proxy可以
4.Object.defineProperty 兼容性比proxy好很多
13.watch与computed的区别
1.watch是一个对象,对象的键就是需要监听的值,而接收变化的是一个回调函数,回调函数的参数就是监听变化的值,用于监听值的变化来进行一些副作用的操作逻辑。
2.computed计算属性,计算属性的值会被缓存,当计算属性函数中的值没有变化时,就会使用缓存中的值,当计算属性函数中的值变化时,会更新缓存中的值,然后继续使用缓存中的值。
13.事件冒泡和事件委托
1. 事件冒泡,在某一个对象上触发事件,如果事件在自己身上就在自身触发,如果没有就向父对象上传播,最终父对象触发事件
2. 事件委托,是利用事件冒泡的机制,把事件挂载到父对象上,在子节点触发事件时,利用事件冒泡机制向父节点传播,父节点事件触发之后可以在事件参数中拿到对应触发事件的子节点。因此,可以把子节点上定义的事件函数定义在父节点事件上,由父节点来统一管理子节点事件,达到一个事件委托代理的目的。
14.跨域的解决方案有哪些
1.nodejs中间件
2.cors
3.websocket
4.jsonp
5.nginx反向代理
6.postMessage
7.脚手架代理
8.proxyTable
9.iframe
15.改变this指向有哪些方法
1.call,apply,bind(箭头函数的this指向改不了,因为箭头函数没有this)
16.mixins和组件的生命周期顺序
1.mx created -> page created -> mx mounted -> page mounted
2.mx 与 page 同名变量 只执行 page
3.mx 与 page 同名方法 只执行 page
17.知道哪些安全策略
1.xss 代码注入攻击,避免方式: 1.url使用 encodeURLComponent 方法转译。2.尽量不要使用 innerHtml插入HTML内容。3.使用特殊字符,标签转义符。
2.csrf 跨站请求伪造,避免方式:1.添加验证码。2.使用token
3.ddos 避免方式:1.限制单IP请求次数。2.防火墙等防护设置禁止ICMP包等。3.检查特权端口的开发
18.vue 什么是单向数据流
单向数据流就是,数据由父组件流向子组件,子组件不能主动修改父组件的数据,必须得子组件向父组件发送事件请求父组件修改数据的方式。单向数据流保证了数据来源的唯一性,避乱了代码混乱和不可测的结果。增加了代码的维护性和调试性。