Web浏览器以及跨端方案|青训营笔记

91 阅读7分钟

笔记内容:

  • 浏览器架构
  • 渲染进程
  • chrome运行原理
  • 跨端容器

浏览器架构

架构演进历程

1.单进程架构:所有模块运行在同一个进程里,包含网络.插件、 JavaScript运行环境等
2.多进程架构:主进程、网络进程、渲染进程、GPU进程、插件进程
3.面向服务架构:将原来的UI、数据库、文件、设备.网络等,作为一个独立的基础服务

进程之间的关系

image.png

架构对比
架构类型扩展性安全性稳定性流畅度
单进程架构<font color=#"666123">低,所有模块运行在同一进程里,访问同一块内存区域,数据没有隔离,新增模块可能会影响原有功能低,三方插件可直接访问操作系统里任意资源低,三方插件漏洞或者某个tab页面JavaScript脚本问题可能导致浏览器崩溃卡顿,所有页面运行在同一进程中,开启多个页面时明显卡顿
多进程架构中,各进程分配独立的内存区域,有些进程功能较大,耦合度高高,运行在独立沙箱中,不能访问系统敏感资源高,进程相互隔离,当一个页面或者插件崩溃时,不会影响其他进程流畅,每个页面运行在独立的渲染进程中,充分利用系统资源
面向服务架构高,服务模块划分更细,更内聚、耦合性低,易于扩展高,运行在独立沙箱中,不能访问系统敏感资源高,进程相互隔离,当一个页面或者插件崩溃时,不会影响其他进程流畅,每个页面运行在独立的渲染进程中,充分利用系统资源
任务管理器

image.png

多进程分工
进程名称进程描述
浏览器(主进程)主要负责页面展示逻辑,用户交互,子进程管理;包括地址栏、书签、前进、后退、收藏夹等
GPU进程负责UI绘制,包含整个浏览器全部UI
网络进程网络服务进程,负责网络资源加载
标签页(渲染进程)控制tab内的所有内容,将Html、Css和JavaScript转换为用户可交互的网页
插件进程控制网站运行的插件,比如flash、ModHeader等
其他进程如上.图所示:适用程序Storage/Network/Audio Service 等
思考
  • 为什么会有单进程架构
    由于早期的浏览器要展示的网页内容比较简单,只是展示图片和文字等,很少交互的功能,所以采用单进程架构能更节省内存。
  • 面向服务架构是否会替代多进程架构
    个人认为根据使用的场景不同可以选择更为适合的架构,面向服务架构不一定会代替多进程架构

渲染进程

常见的浏览器内核

image.png

多线程架构

渲染进程时内部是有多线程实现的,它们主要负责页面渲染,脚本执行事件处理,网络请求等

image.png

JS引擎VS渲染引擎

image.png

多线程工作流程
  1. 网络线程负责加载网页资源
  2. JS引|擎解析JS脚本并且执行
  3. JS解析引擎空闲时,渲染线程立即工作
  4. 用户交互、定时器操作等产生回调函数放入任务队列中
  5. 事件线程进行事件循环,将队列里的任务取出交给JS引擎执行

image.png

Chrome运行原理

展示网页过程

image.png

输入处理
  1. 用户Url框输入内容的后,UI线程会判断输入的是一个URL地址呢,还是一个query查询条件
  2. 如果是URL,直接请求站点资源
  3. 如果是query,将输入发送给搜索引擎
开始导航
  1. 当用户按下回车,U线程通知网络线程发起一个网络请求,来获取站点内容
  2. 请求过程中, tab处于loading状态
读取响应
  1. 网络线程接收到HTTP响应后,先检查响应头的媒体类型(MIIME Type)
  2. 如果响应主体是一个HTMIL文件,浏览器将内容交给渲染进程处理
  3. 如果拿到的是其他类型文件,比如Zip.exe等,则交给下载管理器处理

image.png

寻找渲染进程
  1. 网络线程做完所有检查后,会告知主进程数据已准备完毕,主进程确认后为这个站点寻找一个渲染进程
  2. 主进程通过IPC消息告知渲染进程去处理本次导航
  3. 渲染进程开始接收数据并告知主进程自己已开始处理,导航结束,进入文档加载阶段
  • 渲染进程-资源加载
  1. 收到主进程的消息后,开始加载HTMIL文档
  2. 除此之外,还需要加载子资源,比如—些图片,CSS样式文件以及JavaScript脚本
  • 渲染进程-构建渲染树
  1. 构建DOM树,将HTML文本转化成浏览器能够理解的结构
  2. 构建cSSOM树,浏览器同样不认识cSs,需要将CSS代码转化为可理解的CSSOM
  3. 构建渲染树,渲染树是DOM树和cSSOM树的结合
  • 渲染进程-页面布局
  1. 根据渲染树计算每个节点的位置和大小
  2. 在浏览器页面区域绘制元素边框
  3. 遍历渲染树,将元素以盒模型的形式写入文档流
  • 渲染进程-页面绘制
  1. 构建图层:为特定的节点生成专用图层
  2. 绘制图层:一个图层分成很多绘制指令,然后将这些指令按顺序组成一个绘制列表,交给合成线程
  3. 合成线程接收指令生成图块
  4. 栅格线程将图块进行栅格化
  5. 展示在屏幕上
前端性能优化
  • 首屏优化
  1. 压缩、分包、删除无用代码
  2. 静态资源分离
  3. JS脚本非阻塞加载
  4. 缓存策略
  5. SSR
  6. 预置loading、骨架屏
  • 渲染优化
  1. GPU加速
  2. 减少回流、重绘
  3. 离屏渲染
  4. 懒加载
  • JS优化
  1. 防止内存泄漏
  2. 循环尽早break
  3. 合理使用闭包
  4. 减少Dom访问
  5. 防抖、节流
  6. Web Workers

跨端容器

image.png

webView

  • Webview,即网页视图,用于加载网页Url,并展示其内容的控件

  • 可以内嵌在移动端App内,实现前端混合开发,大多数混合框架都是基于Webview的二次开发;比如lonic、Cordova
    分类: image.png

    常用:webview , Android , IOs、国产Android
    优势:

    1. —次开发,处处使用,学习成本低
    2. 随时发布,即时更新,不用下载安装包移动设备性能不断提升,性能有保障
    3. 通过JSBridge和原生系统交互,实现复杂功能

    原生能力:

    • Javascript调用Native
      • API注入: Native获取Javascript环境上下文,对其挂载的对象或者方法进行拦截
      • 使用Webview URL Scheme跳转拦截
      • lOS上window.webkit.messageHandler直接通信
    • Native 调用Javascript
      • 直接通过webview暴露的API执行JS代码
      • lOS webview.stringByEvaluatingJavaScriptFromString
      • Android webview.evaluateJavascript

webView<->Native通信

  • JS环境中提供通信的JSBridge
  • Native端提供SDK响应JSBridge 发出的调用
  • 前端和客户端分别实现对应功能模块

image.png

小程序

  1. 微信、支付宝、百度小程序、小米直达号
  2. 渲染层一webview
  3. 双线程,多webview架构
  4. 数据通信,Native转发

image.png

React Native/WeeX

  1. 原生组件渲染
  2. React/Vue框架
  3. virtual dom
  4. JSBridge

image.png

Lynx

  1. Vue
  2. JS Core / v8
  3. JSBinding
  4. Native Ul /Skia

image.png

Flutter

  1. wideget
  2. dart vm
  3. skia图形库

image.png

通用原理

  1. UI组件
  2. 渲染引擎
  3. 逻辑控制引擎
  4. 通信桥梁
  5. 底层API抹平表现差异

image.png

跨端方案对比

image.png

思考

  • 同样是基于webview渲染,为什么小程序体验比webview流畅
    可能是小程序的优化做的比原生的好
  • 未来的跨端方案会是什么
    继承现在跨端方案的一些优点,改正缺点,迎合市场的需求。

课程总结

image.png