客户端容器
web浏览器以及跨端方案
01 浏览器架构
浏览器架构演进
1.单进程架构:所有模块在同一个进程里,包含网络、插件、javascript运行环境等
2.多进程架构:(进程间隔开,安全性高)主进程、网络进程、渲染进程、GPU进程、插件进程
3.面向服务架构:升级版多进程架构 基础服务等作为一个独立的基础服务
将原来的UI\数据库、文件、设备、网络等,作为一个独立的基础服务
设备间定义好ip接口,通过ip通信进行交互
浏览器架构对比
单进程: 扩展性低 安全性低(插件访问) 稳定性低(页面崩溃导致浏览器崩溃)
流畅度卡顿
多进程架构:扩展性中 安全性(插件隔离)稳定性高 流畅度高
面向服务架构:扩展性高 安全性高 稳定性高 流畅度流程
浏览器进程-任务管理器
浏览器(主进程):大多数能看到的 前进后退 标签页 主要负责展示逻辑,用户交互,子进程管理
CPU进程:负责UI绘制,包含整个浏览器的全部UI
网络进程:网络服务进程,负责网络资源加载
标签页(渲染进程 之后着重讲) 控制tab内的所有内容,将Html,javascript转化为用户可以交互的网页
插件进程:控制网站运行的插件,比如flash,modheader等
其他进程:上图所示程序:stortage network audio service
为什么会会有单进程架构:早起硬件限制
面向服务架构(谷歌2016的演进 优势:在性能好的设备上会变成面向服务器架构 在差设备上会退化成多进程)是否会替代多进程架构:长期来看会替代
02渲染进程
常见浏览器内核:
渲染进程-多线程架构
内部是多线程实现,主要负责界面渲染,脚本执行,事件处理,网络请求
JS引擎vs 渲染引擎(相互独立的)
1.解析执行JS 2.XML解析生成渲染树,显示在屏幕 3.桥接方式通信
渲染进程-多线程工作流程
1.网络线程负责加载网页资源
2.JS引擎解析JS脚本并且执行
3.JS解析引擎空闲时,渲染线程立即工作
4.用户交互、定时器操作等产生回调函数放入任务队列中
5.时间进程进行事件循环,将队列里的任务取出交给JS引擎队列
(事件循环:把队列里的事件回调)
20s时把data回调到现在执行
30s时回调
先输出log(data.now()-now) const now是赋予变量
03chrome 浏览器运行原理
1.如何展示网页
(浏览器地址输入URL后发生了什么)经典面试问题
1.输入处理:ui限制会先看是地址URL请求站点资源还是查询条件(QUERY发送给搜索引擎)
2.开始导航:UI线程通知网络线程发起一个网络请求,来获取站点内容
请求过程中,tab处于loading
3.读取响应:http响应后检查应头的媒体类型
如果是html文件 则将后续内容交给渲染进程 如果拿到其他类型文件(zip.exe)则走的是下载的逻辑
4.寻找渲染进程
网络线程检查后,会告知祝进程数据已准备完毕,祝进程确认后为这个站点寻找一个渲染进程——主进程通过IPC消息告知渲染进程去处理本次导航——渲染进程开始接收数据并告知主进程自己已开始处理,导航结束,进入文档加载阶段
5.资源加载
收到主进程消息后,开始加载html文档资源——还需加载一些子资源,图片,css央视文件或者js脚本
6.构建渲染树
构建dom树,将html文本转化成浏览器能偶理解的结构——构建cssom树,浏览器同样不认识css,需要将css代码转化成可以理解的cssom——构建渲染树,渲染树是dom树和cssom树的结合
7.页面布局
根据渲染树计算每个节点的位置和大小——在浏览器页面区域绘制元素边框——遍历渲染树,将元素以盒模型的形式写入文档流
8.页面绘制
构建图层:为特定节点生成专用图层——绘制图层 一个图层分成很多指令,按指令顺序绘制列表,交给合成线——合成线程接收指令生成图块——栅格线程将图块进行栅格化(gpu加速生成一个一个像素点)——展示在屏幕上
前端性能performance
1.时间都花在哪
2.什么情况下会卡顿
前端优化手段:
首屏优化:
1.压缩、分包、删除无用代码
2.静态资源分离
3.js脚本非阻塞加载
4.缓存策略
5.Ssr
6.预置loading、骨架屏(防止白屏,不在body里挂idel)
渲染优化:
1.gpu加速(透明度改变:像素点改变)在set里设置wellsum属性(?
2.减少回流、重绘(left top?影响布局会回流 tab布局 ui divr工具实现
3.离屏渲染(开辟一段内存缓冲区,在里面渲染好了再添加到显示器上)
解决动画掉帧
4.懒加载(提前加载到本地,从缓存里面去取)
JS优化:
1.防止内存泄漏(用全局变量,dom和JS变量,变量删除了,但是dom没会可能内存泄漏 ,定时器忘记删除,可以放定时清除的定时器
2.循环尽早break或者return
3.合理使用闭包
4.减少dom访问(JS和渲染引擎交互费时间,所以减少dom访问,如果一个dom经常访问可以找一个内存储存起来)
5.防抖、节流(一段时间内多次调用执行一次)
6.Web workers
04跨端容器
为什么需要跨端:
1.开发成本低、效率高
2.一致性体验
3.前端开发生态(解放客户端人力
开发工具:html5 css3 javascript
终端:web 安卓 ios
有哪些跨端方案:
Webview:网页视图,用于加载网页url,并展示其内容动的控件
可以内嵌在移动端app内,实现前端混合开发,大多数混合矿机都是基于webview的二次开发,比如ionic,cordova
常用webview分类:安卓(webview,ios(safiri,国产安卓(uc\qq自己的webview
使用webview的优势:一次开发,处处使用,使用成本低 随时发布,及时更新不用下载安装包, 性能有保障
webview使用原生能力:
javascript调用native
native调用javascript
Webview js bridge进行native通信
1.js环境中提供通信的js bridge
2.native端提供sdk响应js bridge发出的调用
3.前端和客户端分别实现对应模块功能
实现一个简易js bridge
小程序
轻应用时代
2.渲染层:webview
3.双线程 多webview架构
4.数据通信,native转发
React native (rn) wee x
1.原生组件渲染
2.React\vue框架
3.Virtual dom
4.Js bridge
Lynx(字节本公司的)没开源 正考虑向skia迁移
把dom的构建放在native层 js只用管业务逻辑
1.vue
2.Js cor/v8
3.Jsbinding(更高效的js bridge)
4.Native ui/skia
Flutter
1.Widget
2.Dart vm
3.skia图形库
跨端容器通用原理:
1.Ui组件
2.渲染引擎
3.逻辑控制引擎
4.通信桥梁
5.底层api抹平表现差异
跨端方案对比:
同样是web view渲染,小程序为什么体验比web view更流畅?
预缓存,基于webview把一些危险操作都封死了,收口
未来的跨端方案?
回归webview,性能体验不是最好的,但却是最广的(前端开发
⭐️:比较重要