浏览器

1.浏览器渲染过程

① 首先是DOM树和CSSOM树的构建,分为解析,Token化,生成Nodes并构建几个过程

  • 解析:对获得的HTML原始字节码进行解码,得到相应字符串
  • Token化:根据得到的字符串,通过词法分析器进行Token化,Token会注明开始标签,结束标签,文本标签等
  • 生成Nodes并构建:根据Token化标签生成相应的Nodes,并将Nodes串联起来,构建DOM树和CSSOM树
    PS1:并非Token化全部完成后才会去生成Nodes,而是边Token化边生成Nodes,这样当Token化完成后DOM树和CSSOM树也就构建完成了
    PS2:js标签若不设置async或defer属性,会阻塞DOM树的构建,等待js代码解析并执行完毕才会继续构建DOM树,这时若js操作了还未构建完成的DOM就会报错; js并不会阻塞CSSOM树构建,由于js可能会对CSS进行操作,因此js会等待CSSOM构建完成后才会执行,而又由于js会阻塞DOM树构建,因此等待CSSOM构建时也会阻塞DOM树构建,这就是所谓的CSS阻塞
    PS3:CSSOM树要完全构建完成后才能使用,因为后面的CSS样式能会覆盖前面的CSS样式

② DOM树和CSSOM树构建完毕后,构建Render树

  • Render树为每一个节点构建一个RenderObject,它的每一个节点几乎都与DOM树的结点对应,并有相应的CSS样式属性
  • 一些标签和元素会被Render树忽略,如html,<script>,<link>等标签,display被设置为none的元素
  • 构建Render Layer树,根据元素属性确定是否被选中分层,如是否为根元素,是否透明,是否设置z-index,是否有内容溢出等等,根据这些属性对RenderObject进行分层,未被选中的元素从属于其父节点的Render Layer

③ 布局,根据Render树计算节点的确切位置和大小进行布局

④ 渲染,根据布局进行网页绘制,完成渲染

重绘和重排
重排会触发重新计算layout过程
重绘会触发重新渲染Paint过程
重排一定重绘,但重绘不一定重排

如何减少重绘和重排
当需要进行的操作会引起多次重绘,重排时, 先将该元素设置为display: none, 然后对其进行操作, 最后再取消display: none, 这样只触发两次重排
使用CSS3实现动画, 而不是使用js操作DOM
添加元素时, 使用文档碎片Fragment创建子树, 然后拷贝到文档流中, 只触发一次重排
拷贝旧节点, 对拷贝节点进行操作, 然后用新节点替换旧节点, 只触发一次重排
大量样式发生变化时, 采用切换类名或cssText改变, 而不是每一条去改变
使用局部变量缓存布局信息, 因为每次读取布局信息都会使浏览器立即执行渲染队列中的“待处理变化”, 触发重排, 因此我们需要减少读取次数, 使用局部变量存储布局信息参与计算, 进而减少直接读取布局信息次数

2.webSocket

webSocket是一个持久性协议, 而HTTP是非持久性协议
HTTP是一个请求对应一个回应, 即使存在长连接, 也只能不停请求获取响应, 不能由服务端直接向客户端发送消息
webSocket支持双工通信, 客户端可以主动向服务端发送消息, 服务端也可以主动向客户端发送消息
webSocket是基于HTTP协议的, 或者说是借用HTTP协议完成一部分的握手, 它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了. 即webSocket分为两部分:HTTP握手+TCP传输
它比HTTP协议多携带了一些信息:
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
其中,
Upgrade: websocket和Connection: Upgrade通知服务器我要开启webSocket通信;
Sec-WebSocket-Key是一个Base64 encode的值, 是浏览器随机生成的, 需要服务端返回正确的Sec-WebSocket-Accept值才能建立连接, 否则会报错, Sec-WebSocket-Accept值是通过Sec-WebSocket-Key值进行计算的;
Sec-WebSocket-Protocol指定协议;
Sec-WebSocket-Version指定版本

服务端会返回相应的响应:
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Upgrade: websocket和Connection: Upgrade通知客户端我采用webSocket成功建立连接了;
Sec-WebSocket-Accept返回确认值, 只有Sec-WebSocket-Key字段的值经过固定算法加密后的数据和响应头里的Sec-WebSocket-Accept的值保持一致,该连接才会被认可建立;
Sec-WebSocket-Protocol最终采取的协议

在握手成功后, 将不再依赖HTTP协议, 而是转为webSocket协议, 通信时不再使用 HTTP 的数据帧,而采用 WebSocket独立的数据帧, 因此可实现客户端与服务端的双工通信.

3. Nodejs优缺点及适用场景

Nodejs主要特点:

  • 异步事件驱动
  • 非阻塞I/O
  • 单线程(主线程)
  • 性能好

异步事件驱动
主要是使用异步回调实现, 当遇到阻塞任务时, 放到事件队列, 通过主线程进行事件队列循环执行, 不让事件阻塞主线程, 在合适时机去执行这些事件
非阻塞I/O
遇到I/O操作时, 会生成一个回调函数放入事件队列中, 当同步代码执行完毕, 再去执行相应回调
单线程
利用事件驱动和异步回调实现非堵塞, 但主线程是单线程的
性能好
底层选择用c++和v8来实现的, 采用事件驱动, 异步回调, 性能很好

适用场景:
I/O密集型, 频繁I/O操作, 但对CPU使用率不高, 非堵塞I/O使用于此场景
不适用场景:
CPU密集型, 复杂计算操作, CPU占用率很高, 但I/O操作很少

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355