五一之后第二周(5.11-5.17)的安排
重点js基础/Vue框架/Css/node
- Vuex模拟实现
- 手写一个简单的mvvm
- BFC 以及 清除浮动以及原理
- 闭包
- 观察者模式
- http1.x和http2.x
Vuex源码以及模拟实现
vuex的模拟实现
手写简单的mvvm
使用
1 | <body> |
具体的实现:
1 | // 创造一个实例 |
yun….一头雾水,我太难了!!!
BFC 以及 清除浮动以及原理
BFC(block formatting context) 块级格式化上下文,用于决定块盒子(block box)的布局及浮动相互影响范围的一个区域,是一个独立的渲染区域,让处于 BFC 内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响。
BFC创建触发条件
- 根元素或其它包含它的元素;
- 浮动 (元素的float不为none);
- 绝对定位元素 (元素的position为absolute或fixed);
- 行内块inline-blocks(元素的 display: inline-block);
- 表格单元格(元素的display: table-cell,HTML表格单元格默认属性);
- overflow的值不为visible的元素;
- 弹性盒 flex boxes (元素的display: flex或inline-flex);
平常中,设置overflow: hidden/scroll, float: right/left,position: absolute,display: flex/inline-flex;
即当前元素创建了一个BFC
BFC约束规则
- 内部的盒会在垂直方向一个接一个排列(可以看作BFC中有一个的常规流)
- 处于同一个BFC中的元素相互影响,可能会发生外边距重叠((完整的说法是:属于同一个BFC的两个相邻Box的margin会发生重叠(塌陷),与方向无关。))
- 每个元素的margin box的左边,与容器块border box的左边相接触(对于从左往右的格式化,否则相反),即使存在浮动也是如此
- BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
- 计算BFC的高度时,考虑BFC所包含的所有元素,连浮动元素也参与计算
- 浮动盒区域不叠加到BFC上,(BFC区域不会与float的元素区域叠加)
BFC阔以解决的问题
- 垂直外边距重叠问题
- 去除浮动 (BFC区域不会与float的元素区域叠加)
- 自适用两列布局(float + overflow)
实例中理解BFC的约束规则
如何实现左侧宽度固定,右侧宽度自适应
1
2
3
4
5
6<div class='box' >
<div class='left'>
</div>
<div class='right'>
</div>
</div>float + margin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19.left{
border: 10px solid red;
background: green;
border: 3px solid yellow;
width: 200px;
height: 200px;
float: left;
}
.right{
background: pink;
border: 3px solid black;
height: 200px;
margin-left: 200px;
}
.box{
background:#888;
height: 100%;
margin-left: 50px;
}float + calc
1
2
3
4
5
6
7
8
9
10
11
12
13
14.left1{
background: green; /* 绿色 */
opacity: 0.5;
width: 200px;
height: 200px;
float: left;
}
.right1{ /* 粉色 */
background: pink;
opacity: 0.5;
height: 200px;
float: right;
width: calc(100% - 200px);
}float + overflow(BFC应用场景)
1
2
3
4
5
6
7
8
9
10
11
12
13div {
height: 200px;
}
.left2 {
width: 200px;
float: left;
background: green;
}
.right2 {
background: pink;
outline: 1px solid black;
overflow: hidden;
}利用BFC约束规则第六点:浮动盒区域不叠加到BFC上,(BFC区域不会与float的元素区域叠加)
最佳选择 flex
1
2
3
4
5
6
7
8
9
10
11
12.box {
display: flex; // 触发BFC
}
.left3 {
width: 200px;
background: green;
}
.right3 {
flex: 1; // flex-grow: 1;flex-shrink: 1;flex-basis: 0%;
background: pink;
outline: 1px solid black;
}清除浮动
清除浮动主要有两种方式,分别是clear清除浮动和BFC清除浮动
clear清除浮动
底层原理是在被清除浮动的元素上边或者下边添加足够的清除空间;浮动的三个特点很重要。
- 脱离文档流。
- 向左/向右浮动直到遇到父元素或者别的浮动元素。
- 浮动会导致父元素高度坍塌。
- 解决父元素高度坍塌的方式就是清除浮动,常规的方法是clear清除浮动和BFC清除浮动,推荐clearfix的方式
1 | // 全浏览器通用的clearfix方案 |
参考链接
闭包
观察者模式
http1.x和http2.x
http1.x几大缺陷
- 规定客户端对同一域的并发连接最多只能2个(一般是2-8个)
- 线头阻塞(head of line block) 同一个连接中的请求,需要一个接一个串行发送和接收
- 基于文本协议,请求和响应头信息大,无法压缩
- 不能控制响应优先级,必须按照请求顺序响应
- 只能单向请求,客户端请求什么,服务器返回什么
Http2
HTTP2 的前身是 SPDY协议(一个 Google 主导推行的应用层协议,作为对 HTTP1 的增强)。HTTP2必须在维持原来 HTTP 的范式(不改动 HTTP/1.x 的语义、方法、状态码、URI 以及首部字段等等)前提下,实现突破性能限制,改进传输性能,实现低延迟和高吞吐量。
Http2 特性
- 传输内容使用二进制协议
- 使用帧作为最小传输单位
- 多路复用
- 头压缩
- 服务器推送
- 优先级与依赖性
- 可重置
- 流量控制
- HTTPS rfc 规范并没有要求 HTTP2 强制使用 TLS,但是目前世界所有浏览器和服务器实现都基于 HTTPS 来实现 HTTP2
二进制
HTTP1.x 时代,无论是传输内容还是头信息,都是文本/ASCII编码的,虽然这有利于直接从请求从观察出内容,但是却使得想要实现并发传输异常困难(存在空格或其他字符,很难判断消息的起始和结束)。使用二进制传输可以避免这个问题,因为传输内容只有1和0,通过下面第二点的“帧”规范规定格式,即可轻易识别出不同类型内容。同时使用二进制有一个显而易见的好处是:更小的传输体积
二进制分帧
HTTP2 在维持原有 HTTP 范式的前提下,实现突破性能限制,改进传输性能,实现低延迟和高吞吐量的其中一个关键是:在应用层(HTTP2)和传输层(TCP or UDP)之间增加了二进制分帧层
多路复用(Multiplexing)和流
多路复用是解决 HTTP1.x 缺陷第一点(并发问题)和第二点(HOLB线头问题)的核心技术点
头压缩
HPACK专门为头部压缩设计的算法,还被指定成单独的草案中。
HTTP2 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;通信期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型,等等)只需发送一次
Http2.0优势
- 更小的传输体积,更小或者省略重复的头消息
- 突破原有的 TCP 连接并发限制,使用一个 TCP 连接即可实现多请求并发,单链接也能减轻服务端的压力(更少的内存和 CPU 使用)
- 解决 HOLB 线头问题,慢的请求或者先发送的请求不会阻塞其他请求的返回
- 结合 CDN 提供实时性更高,延迟更低的内容分发代理服务,大大减少白屏时间
- 数据传输优先级可控,使网站可以实现更灵活和强大的页面控制
- 能在不中断 TCP 连接的情况下停止(重置)数据的发送