- 网页性能优化方案
- dns预解析
<link rel="dns-prefetch" href="//www.baidu.com" />
- 静态资源使用cdn地址
- 服务端开启gzip压缩
- 使用http缓存静态资源
- 页面中图片使用懒加载
- 合并页面中小图标用雪碧图
- js/css资源压缩合并,减少tcp链接消耗,减少报文传输大小
- 构建项目,chunk分离,减少首次加载包大小
- 优化代码
- 缓存变量,减少作用域链查找
- dom操作时,减少浏览器重排重绘次数
- 动画使用animation, 开启gpu加速模式
- dns预解析
- 在浏览器输入url到页面展示经历了哪些过程
- DNS查询
- 浏览器缓存查询
- 系统缓存查询
- hosts查询
- 本地域名服务器查询
- 建立TCP连接
- 发起http请求
- 服务器处理请求并返回结果
- 浏览器解析并渲染
- 解析html构建DOM树
- 解析css构建CSSOM树
- 合并DOM和CSSOM生成渲染树
- 断开连接
- DNS查询
- http状态码
- 1xx 信息
- 2xx 成功
- 3xx 重定向
- 301 永久重定向
- 302 临时重定向
- 304 使用缓存
- 4xx 客户端错误
- 403 禁止访问
- 404 找不到页面
- 5xx 服务端错误
- 502 网关错误
- http缓存方式
- Expire 过期时间
- cache-control
- no-store 不适用缓存
- prviate 客户端可缓存
- public 客户端、路由器可缓存
- max-age 最大缓存时间(s)
- no-cache 对比缓存 未过期 服务端返回304状态码,本地使用缓存
- Etag / IF-None-Match
- 响应头返回唯一标识 / 请求头携带上次响应的资源唯一标识
- Last-modified / if-modified-scene
- 响应头返回资源上次修改时间 / 请求头携带上次响应资源修改时间
- Etag / IF-None-Match
- tcp/ip 三次握手 四次挥手
- TCP 三次握
- 客户端发起 SYN=1 seq=x
- 服务端发起 ACK=1 SYN=1 ACKnum=x+1 seq=y
- 客户端发起 ACK=1 SYN=0 ACKnum=y+1
- TCP 四次挥手
- 客户端准备断开连接
- 服务返回可以断开连接了并等待
- 服务端返回断开连接
- 客户端断开连接
- TCP 三次握
- https是什么
- 七层/五层 网络协议
- 七层
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
- 五层
- 应用层 HTTP
- 传输层 TCP
- 网络层 IP
- 数据链路层 物理上传输的数据帧
- 物理层 二进制物理硬件上传输数据
- 七层
- jsonp原理
- xhr状态码
- open -> send -> onreadystatechagne
- 0 未初始化
- 1 启动 已使用open未使用send
- 2 发送 调用send,并接受到header
- 3 接收 接收到部分响应报文
- 4 完成 已接收全部数据
- 移动端首屏优化
- 基础优化方案与网页性能优化相同
- 使用服务端渲染
- 首次只加载首屏使用数据和资源,其他延后加载
- 在客户端,使用离线包
- 预加载下一页所需资源
- 300ms延迟
- 移动端有双击放大操作
- fastclick原理
- 在touchend结束后,触发一个自定义的click事件,取消浏览器的click事件
- 淘宝flexble原理
- 将设计稿宽度分为100分
- 一份为1个单位a
- 1rem = 10a
- 例如:
- 750宽的设计稿
- 1rem = 75px
- html标签上font-size就为75px
- 适应到400宽度的手机屏幕上,html标签上font-size就为 400 / 75 = 53.6px
- 移动端适配
- 使用flexble,利用rem
- 使用媒体查询,对不同尺寸屏幕,使用不同样式
- 原型链
- 闭包
- new操作符做了哪些操作
function creactObj(func) {
const obj = {};
obj.__proto__ = func.prototype;
const result = func.call(obj);
if (typeof result !== 'object') return obj;
return result;
}
promise是什么
import/export
BFC是什么
- 块级格式上下文,BFC是一个独立的布局环境,其中的元素布局是不受外界的影响
- 1、float的值不是none。
- 2、position的值不是static或者relative。
- 3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex
- 4、overflow的值不是visible
flex布局
垂直居中
- 单行文本 line-height = height
- 绝对布局 top: 50% , transform: translateY(-50%)
- flex布局 align-item: center
- display: table-cell; vertical-align: middle;
- 绝对定位 四方都为0,margin: auto
react优势
- 组件化思想,使得代码复用率变高,代码之间的耦合性也降低了
- 使用数据控制视图,使得数据流向清晰
- 能够实现服务端渲染
- 使用虚拟dom,在更新视图时使用diff算法计算出需要更新的节点,减少不必要的重复操作,提高性能
react生命周期
- 老版生命周期
- 初始化
- constructor
- componentWillMount
- render
- componentDidMount
- 更新
- componentWillRecvieProps
- shouldCompnentUpdate
- compnentWillUpdate
- render
- compnentDidUpdate
- 卸载
- compoentWillUnmoment
- 初始化
- 新版生命周期
- 初始化
- constructor
- getDerivedStateFromProps
- render
- componentDidMount
- 更新
- getDerivedStateFromProps
- shouldCompnentUpdate
- render
- getSnapshotbeforeUpdate
- compnentDidUpdate
- 卸载
- compoentWillUnmoment
- 初始化
- 老版生命周期
什么是虚拟dom
- 使用js对象表述dom节点
- 减少不必要的更新
- 更新dom的代价是很大的,这涉及到浏览器的重排跟重绘
diff算法是什么
- 三个假设
- 跨层级的dom操作比较少
- 相同的组件生成的树结构相似
- 同一层组件,可以使用id区分
- 同层比较,只有创建和删除
- 组件级比较
- 同类组件,按照原策略进行比较
- 不同类组件,则需要移除
- 同类组件可能虚拟dom未变化,所有组件可以使用shouldcomponentupdate来决定是否需要对比
- 同层子组件对比
- 使用key唯一标识,若存在相同的则只需要做移动操作
- 三个假设
redux是什么
- 单一数据源
- 不可变数据
- 纯函数修改数据
前端框架选型
- 成本
- 组内成员是否已掌握该框架
- 若没有,上手难以如何
- 框架生态
- 良好的生态,说明该框架有良性的发展
- 发现问题,可能会很容易解决
- 使用该框架是否对组内成员有成长
- 成本
js基本数据类型
- boolean string undefined null number object symbol
如何实现keep-alive
- 使用renderPortal将缓存的组件渲染隐藏的容器中
函数柯里化
- 定义
- 将接受多个参数的函数转换成介绍单一参数并返回结果的技术
- 实际使用体现在
高阶函数
- 优势
- 参数复用
- 提前确认
- 延迟执行
- 定义
跨域解决方案
- 浏览器的同源策略,相同协议/域名/端口号才同源
- 响应报文添加 Access-Control-Allow-Origin
- jsonp
- iframe
- postMessage
- nginx 反向代理
- websocket