You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
你看下是不是开了vpn和代理,我这边看是OK的
在 2020年2月19日 下午5:56:40, Craw ([email protected]) 写到:
你好,博文中的图片都看不到,请问是什么原因呢?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or unsubscribe.
有一道经典的题目叫做
从输入URL到页面加载完成的过程中发生了什么
除去一些硬件、后端,我顺着整个学习流程,查了一些资料,参考了许多前辈们的博客(再次谢过开源分享的前辈们),在前端方向总结出来的一些知识点,几乎囊括了整个前端体系,可以看到JS在整个流程里面也只是一个很小一块知识点而已(当然,一切的基础围绕JS展开)
如果再加上性能(可以从本文延伸出来)、框架原理、工程化、安全、移动端的一些东西,几乎就是目前一个大前端的知识体系了,也是比较庞大了,不再是以前大家眼中简简单单HTML+CSS+JS走天下的时代了,过去了……路漫漫其修远兮,吾将上下而求索!
前面先捋一捋一些比较核心的基础概念,后面再细细展开,如果觉得后面逻辑有点乱了,可以回头再看看这个图,沿着脉络去看会事半功倍
一、进程和线程
查看电脑中的进程,mac可以打开
活动监视器
单线程与多线程,都是指在一个进程内的单和多
浏览器是多进程的
理论上:在浏览器中打开一个网页相当于新起了一个独立的浏览器进程(进程内有自己的多线程)
打开chrome的任务管理器,可以发现,有些tab的进程会被合并,这应该是浏览器的优化机制
浏览器的进程
浏览器的主要进程有如下几个
浏览器多进程的优势
当然,这样内存也会增加,空间换时间吧
二、Browser进程与浏览器内核通信
先看个简单的宏观模型
网上盗图一张
三、浏览器渲染(render)进程(浏览器内核)
重点关注渲染进程,以下动作都是这个进程执行的
浏览器的渲染进程是多线程的,它包含了如下线程(得区分清楚进程和线程的概念)
1、GUI渲染线程
2、JS引擎线程
3、事件触发线程
4、 定时触发器线程
5、异步HTTP请求线程
好了,回顾一下,浏览器是多进程的,JS是单线程的
四、关于浏览器渲染进程的一些概念
1、GUI渲染线程与JS线程互斥
JS可以操作DOM,如果GUI和JS线程可以用时运行,那么最后的DOM是不可预测的
所以当JS引擎执行时GUI线程会被挂起, GUI更新则会被保存在一个队列中等到JS引擎线程空闲时立即被执行
2、
WebWorker
改变了JS单线程的本质吗Web Worker 允许 JavaScript 脚本创建多个线程,但是子线程完全受主线程控制,且不得操作 DOM 。
所以,这个新标准并没有改变 JavaScript 单线程的本质
WebWorker
和SharedWorker
区别Web Workers除了WebWorker,还有SharedWorker、Service Workers
具体详看MDN
Web Workers API - Web API 接口 | MDN
大概提一下,
WebWorker
只是属于该render进程下的一个线程,SharedWorker
由独立的进程管理,多个render进程可以共享3、JS阻塞页面
由于JS线程和GUI线程互斥 ,所以一旦某段JS代码执行时间过长,页面渲染就会渲染不连贯,出现“加载阻塞”页面渲染的现象
从性能方面考虑,以下几个地方需要优化的
requestAnimationFrame
来实现动画视觉变化,setTimeout
或setInterval
的回调在帧的某个时间点运行,如果刚好在末尾,可能导致丢帧,引发卡顿4、CSS加载会否阻塞页面?
因为CSS有可能会影响DOM节点,所以如果不阻塞render树渲染,有可能会造成回流(重绘倒是小事),造成不必要的性能开销
5、普通图层和复合图层
普通文档流都在一个复合图层内,绝对布局absolute/fixed也不例外,依然在这个普通图层中
可以通过
硬件加速
的方式来声明新的复合图层
,新的复合图层不会影响默认图层内的回流重绘GPU会单独分配资源,单独绘制各个复合图层,互不影响
absolute和硬件加速的区别
absolute脱离了普通文档流,但没有脱离默认复合图层
absolute中的信息变化不会影响render树,但依然会影响最终的默认复合图层的绘制,会引起重绘,所以也会消耗资源(对本页面的渲染消耗)
而硬件加速,则只会影响新的复合图层,改动后可以避免整个页面重绘
但也不能无节制的使用复合图层,否则也会引起资源消耗过度(对GPU的资源消耗)
五、从输入url到呈现页面(前端角度)
简单过一下整体流程,每一块都值得细细展开去了解更多
后面重点聊聊浏览器渲染流程
整个过程
1、DNS解析
首先在本地域名服务器中查询IP地址,如果没有,按照如下顺序
根域名服务器
.
-> 顶级域名服务器com
-> …… -> 本地域名服务器. -> .com -> google.com. -> www.google.com.
优化:DNS缓存
浏览器缓存 -> 系统缓存 -> 路由器缓存 -> ISP(运营商)DNS缓存 -> 根域名服务器 -> 顶级域名服务器com -> 主域名服务器的顺序
浏览器缓存可通过在浏览器输入
chrome://net-internals/#dns
查看系统缓存在
/etc/hosts
文件中(linux系统)2、TCP请求(三次握手)+ HTTP请求
客户端:我要请求数据,可以吗
服务器:可以
客户端:好的
客户机与服务器建立连接后就可以通信,浏览器向web服务器发送http请求
3、浏览器解析渲染页面
DOMContentLoaded
事件触发代表初始的 HTML 被完全加载和解析,不需要等待 CSS,JS,图片加载。Load
事件触发代表页面中的 DOM,CSS,JS,图片已经全部加载完毕。4、连接结束,四次挥手
客户端:我没要数据要发送了,准备挂了
服务器:收到,但我还有一些数据没发送完,稍等一哈
…
服务端:好了,发送完了,可以断开连接了
客户端:OK,你断开连接吧(内心独白:我将会在2倍的最大报文段生存时间后关闭连接,如果再收到服务器的消息,那么服务器就是没听到我最后这句话,我就再发送一遍)
六、浏览器解析渲染页面
The text was updated successfully, but these errors were encountered: