客户端容器|青训营笔记

108 阅读4分钟

客户端容器

浏览器结构

  • 单进程架构
  • 多进程架构
  • 面向对象架构

硬件限制出现单进程结构,会节约资源,面向对象架构很可能会在未来替代多进程架构

结构对比

image.png

渲染进程

浏览器内核

浏览器内核(Rendering Engine),是指浏览器最核心的部分,负责对网页语法的解释(如标准通用标记语言下的一个应用HTML、JavaScript)并渲染(显示)网页。通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。

浏览器内核主要包括三个技术分支:排版渲染引擎、 JavaScript引擎,以及其他。JavaScript引擎是用来渲染JavaScript的,JavaScript的渲染速度越快,动态网页的展示也越快。

多线程架构

内部是多线程实现的,一般包括js引擎线程、GUI渲染线程、定时器线程、事件线程、网络线程

js引擎与渲染引擎

相互独立的,通过桥接方式通信,有一定延迟的

多线程工作流程

image.png

Chrome运行原理

八股文:浏览器地址输入URL后发生了什么?

  • DNS解析:将域名解析成IP地址
  • TCP连接:TCP三次握手
  • 发送HTTP请求
  • 服务器处理请求并返回HTTP报文
  • 浏览器解析渲染页面(下文)
  • 连接结束:TCP四次挥手

浏览器主进程中:

输入处理:判断是地址还是查询

开始导航:UI线程通知网络线程发起网络请求

读取响应:收到http响应后,检查响应头媒体类型,html交给渲染进程处理

寻找渲染进程:主进程通过IPC消息告知渲染进程处理导航 image.png

前端的优化方法

首屏优化

  • 压缩、分包、删除无用代码

  • 静态资源分离

  • JS脚本非堵塞加载;可以放在包底部

  • 缓存策略;打包软件

  • SSR渲染

  • 预置loading、骨架屏(防止白屏)

渲染优化

  • GPU加速

  • 减少回流、重绘

  • 离屏渲染:

  • 与普通渲染不同,离屏渲染的流程:APP需要渲染的数据->CPU计算->GPU渲染->离屏渲染缓冲区(Offscreen Buffer)->保存在帧缓存区(Frame Buffer)->视频控制器读取帧缓存区数据并显示在屏幕上

  • 懒加载

JS优化

  • 防止内存泄露

  • 循环尽早break(满足条件后尽快跳出)

  • 合理使用闭包

  • 减少Dom访问

  • 防抖、节流(在规定时间内只会执行一次)

  • Web Workers:使得一个Web应用程序可以在与主执行线程分离的后台线程中运行一个脚本操作。这样做的好处是可以在一个单独的线程中执行费时的处理任务,从而允许主(通常是UI)线程运行而不被阻塞。它的作用就是给JS创造多线程运行环境,允许主线程创建worker线程,分配任务给后者,主线程运行的同时worker线程也在运行,相互不干扰,在worker线程运行结束后把结果返回给主线程。这样做的好处是主线程可以把计算密集型或高延迟的任务交给worker线程执行,这样主线程就会变得轻松,不会被阻塞或拖慢。

跨端容器

跨端优点:开发成本低、效率高、一致性体验、前端开发生态过多,跨端解放客户端资源

跨端方案

Web View

可以内嵌在移动端,实现前端的混合式开发

小程序

微信、支付宝

渲染还是Webview的方案

数据通信,native转发

React Native/WeeX

通过原生组件渲染、使用React/Vue框架

Lynx

基于web view框架,使用JSBinding替换JSBridge

Flutter

基础UI组件wideget

逻辑控制引擎dart VM

跨端方案通用的原理

  • UI组件

  • 渲染引擎:webview、native、自研引擎

  • 逻辑控制引擎:js引擎、dart vm

  • 通信桥梁

  • 底层API抹平表现差异

注:都是基于Webview渲染,小程序和webview对比,小程序体验流畅,因为小程序封死了一些危险的操作,类如Dom操作

未来跨端方案可能会回归Webview

参考链接:www.jianshu.com/p/ac8be505b…