[TOC]
Web的发展历程
Web 1.0 用户访问的页面是没有权限更改的,只是一个个单单的静态页面。
WeiyiGeek.
Web 2.0 则更注重用户的交互作用,用户既是网站内容的浏览者,也是网站内容的制造者
* 用户参与网站内容的制造
* Web2.0更加注重交互性
* 符合Web标准的网站设计
* Web2.0网站与Web1.0没有绝对的界限
* Web2.0的核心不是技术,而在于思想
Web3.0 只是由业内人员制造出来的概念词语,最常见的解释是,网站内的信息可以直接和其他网站相关信息进行交互,能通过第三方信息平台同时对多家网站的信息进行整合使用; 用户在互联网上拥有自己的数据,并能在不同网站上使用;完全基于web,用浏览器即可实现复杂系统程序才能实现的系统功能,用户数据审计后,同步于网络数据。
WeiyiGeek.
ISO 语言代码 描述:HTML 的 lang 属性可用于网页或部分网页的语言。这对搜索引擎和浏览器是有帮助的。为各种语言定义了缩略词,您可以在 HTML 和 XHTML 中的 lang 和 xml:lang 属性中使用它们。
常用语言代码:
* Language ISO Code
* Chinese (Simplified) zh
* Chinese (Traditional) zh
* English en
使用方式: 根据 W3C 推荐标准,您应该通过 标签中的 lang 属性对每张页面中的主要语言进行声明,比如:
<html lang="en">
...
</html>
在 XHTML 中,采用如下方式在 标签中对语言进行声明:
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
...
</html>
浏览器(采用BS简称)实现一次HTTP请求连接大体上,简单可以分为六步:
WeiyiGeek.流程详细
详细说明:
1.DNS域名解析: 类比邮政编码,你可以采用邮政编码快速找到您需要的地址;DNS 服务器是高可用、高并发和分布式
的,它是树状结构,
WeiyiGeek.结合起来的过程
在查找过程中,有以下优化点:
浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存
。2.建立TCP连接:首先判断是不是https的,如果是则HTTPS其实是HTTP + SSL / TLS 两部分组成,也就是在HTTP上又加了一层处理加密信息的模块。
ACK / SYN / FIN
)备注:
3.发送请求与处理:TCP连接建立后,浏览器就可以利用HTTP/HTTPS协议向服务器发送请求了;服务器接受到请求,就解析请求头,如果头部有缓存相关信息如if-none-match与if-modified-since,则验证缓存是否有效,若有效则返回状态码为304,若无效则重新返回资源,状态码为200.
WeiyiGeek.
4.关闭TCP连接:详细的参考TCP协议
敲黑板重点来了:
5.浏览器渲染
浏览器渲染过程(按时间顺序):构建 DOM 树、CSS样式计算、布局阶段、分层、栅格化和显示
。
1.构建 DOM 树:渲染进程将 HTML 内容转换为能够读懂DOM 树结构。
浏览器从网络或硬盘中获得HTML字节数据后会经过一个流程将字节解析为DOM树,先将HTML的原始字节数据转换为文件指定编码的字符,然后浏览器会根据HTML规范来将字符串转换成各种令牌标签,如html、body等。最终解析成一个树状的对象模型,就是dom树。
#具体步骤:
1.转码(Bytes -> Characters)—— 读取接收到的 HTML 二进制数据,按指定编码格式将字节转换为 HTML 字符串
2.Tokens 化(Characters -> Tokens)—— 解析 HTML,将 HTML 字符串转换为结构清晰的 Tokens,每个 Token 都有特殊的含义同时有自己的一套规则
3.构建 Nodes(Tokens -> Nodes)—— 每个 Node 都添加特定的属性(或属性访问器),通过指针能够确定 Node 的父、子、兄弟关系和所属 treeScope(例如:iframe 的 treeScope 与外层页面的 treeScope 不同)
4.构建 DOM 树(Nodes -> DOM Tree)—— 最重要的工作是建立起每个结点的父子兄弟关系
WeiyiGeek.
通过 link 引用的外部 CSS 文件、style标签内的 CSS、元素的 style 属性内嵌的 CSS
。将所有值转换为渲染引擎容易理解的、标准化的计算值
,这个过程就是属性值标准化。处理完成后再处理样式的继承和层叠,有些文章将这个过程称为CSSOM的构建过程。WeiyiGeek.
排除 script、meta 等功能化、非视觉节点
,排除 display: none 的节点,计算元素的位置信息,确定元素的位置,构建一棵只包含可见元素布局树;如果有js操作或者其他操作,对元素的颜色,背景等作出改变就会引起重绘
),(如果有对元素的大小、定位等有改变则会引起回流
) WeiyiGeek.
图层叠加在一起构成了最终的页面图像
。将图块转换为位图
)。
WeiyiGeek.
补充附录: 我们考虑上HTML / CSS / JS / DOM / IMG 的情况下页面加载顺序:
html → head → title → #text(网页标题)
→ style → 加载样式 → 解析样式 → link → 加载外部样式表文件 → 解析外部样式表 (CSS)
→ script → 加载外部脚本文件 → 解析外部脚本文件 → 执行外部脚本 (Javascript)
→ body → div → script → 加载脚本 → 解析脚本 → 执行脚本
→ img → script → 加载脚本 → 解析脚本 → 执行脚本
→ 加载外部图像文件 → 页面初始化完毕 → JS 的初始化装载。
浏览器加载显示html的顺序是按下面的顺序进行的:
简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程。
1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
4. 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
5. 浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
6. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
7. 浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
8. Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”),突然就少了这么一个元素,浏览器不得不重新渲染这部分代码;
9. 终于等到了</html>的到来,浏览器泪流满面:
10. 这时用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
11. 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过”,浏览器向服务器请求了新的CSS文件,重新渲染页面。
面试常问:
1.浏览器渲染过程是怎样的?
WeiyiGeek.
2.如何理解回流和重绘?
重绘:对 DOM 的修改导致了样式的变化、却并未影响其几何属性(比如修改了颜色或背景色)时,浏览器不需重新计算元素的几何属性、直接为该元素绘制新的样式(跳过了上图所示的回流环节)该过程叫做重绘 (常常是JS操作DOM)
回流:对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再将计算的结果绘制出来该过程就是回流(也叫重排)
#常见的会导致回流的元素
1) 常见的几何属性有 width、height、padding、margin、left、top、border 等等。
2) 最容易被忽略的操作:获取一些需要通过即时计算得到的属性,当你要用到像这样的属性:offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、clientTop、clientLeft、clientWidth、clientHeight 时,浏览器为了获取这些值,也会进行回流。
3) 当我们调用了 getComputedStyle 方法,或者 IE 里的 currentStyle 时,也会触发回流。原理是一样的,都为求一个“即时性”和“准确性”。
#避免方式:
1) 避免逐条改变样式,使用类名去合并样式
2) 将 DOM “离线”,使用DocumentFragment
3) 提升为合成层,如使用will-change
\#divId {
will-change: transform;
}
这样做的优点:
总结:
重绘不一定导致回流,回流一定会导致重绘。
3.渲染引擎什么情况下才会为特定的节点创建新的图层? 描述:层叠上下文是HTML元素的三维概念,这些HTML元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的z轴上延伸,HTML元素依据其自身属性按照优先级顺序占用层叠上下文的空间。
1.拥有层叠上下文属性的元素会被提升为单独的一层,拥有层叠上下文属性有`根元素 (HTML),z-index 值不为 "auto"的 绝对/相对定位元素,position,transform 属性值不为 "none"的元素等`
2.需要剪裁(clip)的地方也会被创建为图层。当我们设置一个DIV元素的长宽时候如果文字超出我们设定的长宽便会产生剪裁,并且渲染引擎会把裁剪文字内容的一部分用于显示在 div 区域;出现这种裁剪情况的时候,渲染引擎会为文字部分单独创建一个层,如果出现滚动条也会被提升为单独的层。
WeiyiGeek.
4.JavaScript 是如何支持块级作用域的? 描述:块级作用域就是通过词法环境的栈结构来实现的,而变量提升是通过变量环境来实现,通过这两者的结合JavaScript 引擎也就同时支持了变量提升和块级作用域了,词法环境跟函数上下文,都是通过栈结构实现的;
函数内部通过 var 声明的变量,在编译阶段全都被存放到变量环境(函数上下文)中,而通过let和const申明的变量会被追加到词法环境中,当这个块执行结束之后,追加到词法作用域的内容又会销毁掉。
//示例1.
function foo() {
var test = 1
let myname= 'LuckyWinty'
{
console.log(myname)
let myname= 'winty'
}
console.log(test,'---',myname)
}
foo()
//实例2.
function foo() {
var test = 1
let myname= 'LuckyWinty'
try{
{
console.log(myname)
let myname= 'winty'
}
}catch(ex){
console.error(ex)
}
console.log(test,'---',myname)
}
foo()
//分别思考一下会输出什么?
示例1.第一个console.log理论上应该输出 undefined。但是语法规定了一个”暂时性死区(TDZ,当进入它的作用域,它不能被访问(获取或设置)直到执行到达声明
)”,也就是说虽然通过let声明的变量已经在词法环境中了,但是在没有赋值之前,访问该变量JavaScript引擎就会抛出一个错误。因此第一个console.log会抛错 [Uncaught ReferenceError: Cannot access 'myname' before initialization]
。
示例2.此,{}块作用域中的内容已执行完毕,被销毁掉了,第二个console.log会输出1 “—“ “LuckyWinty”。
WeiyiGeek.
JavaScript 中的数据是如何存储在内存中的?
代码空间、栈空间、堆空间。
其中的代码空间主要是存储可执行代码的,原始类型(Number、String、Null、Undefined、Boolean、Symbol、BigInt)的数据值都是直接保存在“栈”中的,引用类型(Object)的值是存放在“堆”中的。因此在栈空间中(执行上下文),原始类型存储的是变量的值,而引用类型存储的是其在”堆空间”中的地址,当 JavaScript 需要访问该数据的时候,是通过栈中的引用地址来访问的,相当于多了一道转手流程。JavaScript 引擎需要用栈来维护程序执行期间上下文的状态,如果栈空间大了话,所有的数据都存放在栈空间里面,那么会影响到上下文切换的效率,进而又影响到整个程序的执行效率。通常情况下,栈空间都不会设置太大,主要用来存放一些原始类型的小数据。而引用类型的数据占用的空间都比较大,所以这一类数据会被存放到堆中,堆空间很大,能存放很多大的数据,不过缺点是分配内存和回收内存都会占用一定的时间。因此需要“栈”和“堆”两种空间。
问:什么是协议?
答: 双方通信交互通讯时候,遵守一种规范和规则, 这样才能使得双方可以正常交流,例如我们使用外语与外国人交流,都是准守的同一规则;
(1)http协议
HTTP Rquest(请求):包含三部分内容即请求行、请求头、请求体
<!-- 请求行 -->
<请求方法> <请求路径> <协议版本>
POST /examples/servlets/servlet/RequestParamExample HTTP/1.1
<!-- 请求头 -->
<头> : <值>
Host: 127.0.0.1:8080 <!-- 请求的主机和端口 -->
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0 <!--用户代理即Client浏览器信息-->
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 <!--客户端向服务器表示自己支持什么类型的数据 -->
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 <!--支持的语言格式 -->
Accept-Encoding: gzip, deflate <!--压缩算法 -->
Content-Type: application/x-www-form-urlencoded <!-- 提交的数据类型经过urlencoding编码的form表单的数据 -->
Content-Length: 29
Origin: http://127.0.0.1:8080 <!--站点起源地址 即验证内网、外网访问-->
Connection: keep-alive <!--连接方式:保持连接-->
Referer: http://127.0.0.1:8080/examples/servlets/servlet/RequestParamExample <!--来源地址即请求该资源的页面地址-->
Upgrade-Insecure-Requests: 1 <!--升级不安全要求-->
<!-- 请求体:发送给服务器后端处理的数据 -->
firstname=Weiyi&lastname=Geek
HTTP Response(响应):响应行、响应头、响应体
<!--响应行-->
协议版本 状态码 状态值
HTTP/1.1 200 OK
<!--响应头-->
Server: Apache-Coyote/1.1 <!--服务器提供服务名称类型 -->
Content-Type: text/html;charset=UTF-8 <!--返回数据类型以及编码-->
Content-Length: 678 <!--返回响应体的长度-->
Date: Sun, 16 Feb 2020 12:52:22 GMT <!--响应的时间-->
<!--响应体-->
<html>
.......
</html>
参考来源:
(2)https协议
Web访问顺序:web浏览器->web服务器(狭义)->web容器->应用服务器->数据库服务器
理解浏览器解析,解码顺序
WeiyiGeek.
描述:在Http/Https协议中,规定了请求和响应双方,客户端和服务器端与Web相关的资源;
它有两种分类静态资源和动态资源
QPS
RPS
apche ab
工具进行测量TPS
PV
RV
UV
IP
GMV
参考链接: