TCYL面试问题记录

164 阅读8分钟

1.http1.0 1.1 2.0区别

http1.0和1.1区别

1.1添加了keep-alive长链接,开启一个链接可以发送多个请求

1.1在缓存方面添加了实体标识etag,1.0只有过期时间

http1.1和2.0区别

2.0是基于二进制的,1.1是基于文本的

2.0实现了多路复用,公交车和打车的区别

2.0对于请求头部进行了压缩 

2.vue2和vue3的区别

原理上:

双向绑定的原理不同,v2用的是对象劫持Object.defineProperties,v3使用的是es6的proxy代理

vdiff算法不同,v2采用的是vdom全量比较,将差异的部分更新到页面上,v3会给vdom打上标识,数据变化的时候根据这个标识去比较发生变化的vdom,将差异的部分更新到页面上,没有发生变化的vdom不会进行比较

使用上:

v3使用的是组合式api,v2使用的是选项式api

v3 template里支持多个根节点

v3生命周期将beforeCreate和created合并为setup()

在同一个节点上面v-if和v-for的优先级差异

v3可以监听到数组内部的变化,v2直接通过数组下标改变数组项的时候监听不到变化

3.webpack 1 2 3 4 5的区别

1 -> 2

增加了es6支持

增加了tree-shaking,减小打包后的代码包体积

增加了es6 import和commonJs require的混用

2 -> 3

增加了scope hoisting作用域提升,之前版本将每个依赖都分别封装在一个闭包函数中来独立作用域,这些闭包函数降低了解析速度,w3可以通过配置将有联系的模块放到同一闭包函数中,从而减少闭包函数的数量

增加了webpack-dev-server内置插件

增加了magic comment魔法注释,用来解决代码分隔后import()动态引入的模块命名问题

3 -> 4

增加了mode的配置,可以通过配置mode来设置process.env.node_env

w3配置模块解析规则支持loaders和rules写法,w4删除了loaders写法,只支持rules写法

删除了部分插件,比如commonChunksPlugin,可以使用splitChunks进行代码分割,删除了extrat-text-webpack-plugin,新增了mini-css-extract-plugin,将css从js中抽离,防止js文件太大,加载时间太长

增加了happypack,可以进行多进程loader打包

4 -> 5

压缩代码和缓存配置可以通过配置项进行设置,不需要再通过引入插件来设置

w4只能输出es5的代码,w5可以输出es5,es6的代码

4.webpack性能优化

配置loader搜索文件的范围

使用代码分割,import()动态按需加载

使用tree shaking清除无用的代码

使用插件抽取公用代码

部分库可以通过cdn引入,不打包进最终的代码包

启用代码和图片的压缩

5.CDN的作用和原理

将资源和服务部署到全球各地的服务器上,访问的时候去最近的服务器上面获取,可以提高访问速度

6.webpack loader和plugin区别

loader是加载器,加载资源文件并进行处理

plugin是插件,可以监听到webpack生命周期过程中产生的事件,可以执行更加广泛的任务

7.computed和watch有什么区别

computed依赖的是响应的数据对象,watch可以监听任意一个数据对象

computed依赖的数据没有发生变化会用上一次的缓存结果,watch每次都会执行

computed每次都会执行,watch第一次不执行,需要第一次执行的话需要开启 immediate:true

8.vue组件之间的通信

父子之间:

父传子props,子传父emit一个事件

祖先和后代之间:

provide/inject

兄弟之间:

通过共同的父组件

通过eventBus

通过引入vuex

9.vuex的理解

vuex是vue生态下的状态管理模式

有5个核心概念 state getters mutations actions modules

state存放数据变量

getters相当于state的计算属性

mutations是改变state的方法,只能是同步的

actions是异步的,通过提交mutations的方式改变state

modules可以将vuex划分模块,每个模块都有对应的state getters mutations actions

10.vue路由

前端路由是在单个html中对于多页的一种模拟,是url和页面之间的一种对应

分为hash模式和history模式

hash就是url上#后面的部分,hash的变化不会刷新页面,通onhashchange监听hash变化进行模拟

history通过popstate,replacestate来操作浏览器的历史记录栈,可以任意改变url而不刷新页面,去掉了难看的hash,但是刷新页面的时候会向服务端请求当前url, 假如服务端没有匹配会导致404

11.常用html标签

section div p span form input a img ol ul li table tr th td...

12.日常h5新特性使用

section aside header footer语义化标签,有利于seo搜索

audio video canvas

localStorage和sessionStorage

13.css3常用的新特性

box-sizing

border-radius

text-shadow

box-shadow

background设置size和origion

渐变gradient

过渡transition

动画animation

transform,2D3D变换

14.less和sass的区别

都是预处理器,根据sass或者less的语法写样式,最后转成正常的css,提供了变量和嵌套写法等

sass基于Ruby,需要安装Ruby

sass支持if else条件语句,for循环语句

sass变量使用$,less变量使用@

15.闭包理解

闭包是能够读取其他函数内部变量的函数,可以理解为定义在一个函数内部的函数

闭包可以提供对于封闭作用域内的变量访问,同时闭包内部的数据变量会一直保存在内存中,可以做数据存储使用

16.localStorage sessionStorage cookie区别

需注意大小限制cookie4kb,storage5M左右

17.http和https的区别

https其实是构建在ssl之上的http协议,相比之下有如下的不同

http传输是明文传输,https传输是加密传输

http的页面响应速度比https要高,因为握手次数不一样:http是3次握手,https是http3次+ssl的9次握手一共是12次握手

使用的端口号不一样,http80和https443

18.es6常用的新特性有哪些

let const

模板字符串

解构赋值

箭头函数

promise

async await

es6的模块化

19.promise的优势

回调地狱

假设后续操作依赖多个异步任务的返回结果,promise可以将多个异步任务包裹起来在合适的时机返回结果

20.微信登录过程

涉及小程序 微信服务器 业务服务器

(1)小程序通过wx.login()获取登录凭证code

(2)小程序将登录凭证code和其他参数传递给业务服务端

(3)业务服务端根据code和其他信息换取用户id

(4)将微信用户id和自己的业务id进行绑定,并生成自己的登录凭证sessionId

(5)将sessionId返回给小程序,下次每次请求接口的时候都要带上这个sessionId

21.微信小程序template和组件有什么区别

在一个template.wxml文件里面可以定义多个templale,使用name进行区分,使用的时候用is进行切换

使用template没有json文件和js文件,有利于减小代码包的体积

template中没有js文件,因而点击事件需要在使用的js文件里面定义

使用template的时候需要引入其模板和样式文件,而使用component的时候需要在使用的json文件里面定义组件名称和访问路径

22.bind和capture的区别

事件的传递分为冒泡阶段和捕获阶段:

bind在冒泡阶段获取

capture-bind在捕获阶段获取

catch在冒泡阶段获取但是会阻止向上冒泡

capture-catch在捕获阶段获取,会中断继续向下捕获和冒泡

23.小程序生命周期

页面生命周期 onLoad onShow onReady onHide onUnload

组件生命周期 created attached ready moved detached

组件所在页面生命周期 show hide resize

24.小程序分包

单个分包/主包大小不超过2M,总包大小不超过20M

25.优化相关

优化问题都可以从以下的几个方面进行考虑

减小最终打包的代码的体积:

不要无用的代码,能压缩的压缩,能合并的合并,能抽取公共部分的就抽取出公共部分,可以不打包的就不打包放入CDN

按需加载:

页面访问到的时候再去加载,组件使用到的时候再去加载,图片曝光进入可视区域的时候再去加载

合理利用缓存:

加载页面用到的数据可以提前预先拉取,拉取数据过程中可以添加骨架屏友好提示,拉取的数据可以缓存下来下次先用缓存数据进行渲染,新的数据拿到以后再去热更新

争对具体场景的一些优化:

vue:

可以服务端渲染ssr

webpack:

配置loader搜索文件范围,公共代码提取,删除无用代码tree-shaking

微信小程序:

启用分包,独立分包

注入的时候启用按需注入和用时注入

启用初始渲染缓存

启用数据预先拉取

接口数据用localStorage缓存供下次使用

setData的一些优化