客户端容器
①浏览器架构
1.浏览器架构演进
- 单进程架构:所有模块运行在同一个进程里,包含网络、插件、JavaScript运行环境等
- 多进程架构:主进程、网络进程、渲染进程、GPU进程、插件进程
- 面向服务架构:将原来的UI、数据库、文件、设备、网络等、作为一个独立的基础服务
2.浏览器架构对比
3.浏览器架构-任务管理器
4.多进程分工
5.浏览器架构的局限性
- 单进程架构:硬件要求比较低
- 面向对象架构:未来有可能替代多进程架构
②渲染进程
1.常见浏览器内核
2.渲染进程-多线程架构
内部是多线程实现的,主要负责页面渲染,脚本执行,事件处理,网络请求
JS引擎 VS 渲染引擎
- 解析执行js
- XML解析生成渲染树,显示在屏幕
- 桥接方式通信
3.渲染进程-多线程工作流程
- 网络线程负责加载网页进程
- JS引擎解析JS脚本并且执行
- JS解析引擎空闲时,渲染线程立即工作
- 用户交互、定时器操作等产生回调函数放入任务队列中
- 时间线程进行事件循环,将队列里的任务取出交给JS引擎执行
一道笔试题的例子
③Chrome运行原理
1.Chrome运行原理-如何展示网页
2.Chrome运行原理-输入处理
- 用户url框输入内容之后,UI线程会判断输入的是一个URL地址,还是一个query查询
- 如果是URL,直接请求站点资源
- 如果是query,将输入发送给搜索引擎
3.Chrome运行原理-开始导航
- 当用户按下回车,UI线程通知网络线程发起一个网络请求,来获取站点内容
- 请求过程中,tab处于loading状态
4.Chrome运行原理-读取响应
↓
5.Chrome运行原理-寻找渲染进程
↓
6.渲染进程-资源加载
↓
7.渲染进程-构建渲染树
↓
8.渲染进程-页面布局
↓
9.渲染进程-页面绘制
↓
PS:
- 为了减少绘制次数,会进行合成
- 栅格化即是将绘图转化成像素点,然后绘制 、
10.前端性能performance
↓
11.优化手段
(1) 首屏优化
- 压缩、分包、删除无用代码
- 静态资源分离
- JS脚本非阻塞加载
- 缓存策略(借助打包工具)
- SSR
- 预置loading、骨架屏
(2) 渲染优化
- GPU加速(opacity,transform等)
- 减少回流、重绘(减少tab布局)
- 离屏渲染(先渲染好再贴到屏幕上)
- 懒加载(将所需资源提前加载到本地)
(3) JS优化
- 防止内存泄露(如自己封装定时器等)
- 循环尽早break
- 合理使用闭包
- 减少Dom访问(Dom访问比较耗费时间)
- 防抖、节流
- Web Workers
④跨端容器
1.跨端原因
- 开发成本、效率
- 一致性体验
- 前端开发生态
2.跨端方案
- webview
- 小程序
- RN/WeeX
- Lynx
- Flutter
3.跨端容器-WebView
(1)常见WebView分类:
(2)使用WebView优势:
- 一次开发,处处使用,学习成本低
- 随时发布,即时更新,不用下载安装包
- 移动设备性能不断提升,性能有保障
- 通过JSBridge和原生系统交互,实现复杂功能
(3)WebViw使用原生能力:
(4)WebView-Native通信:
- JS环境中提供通信的JSBridge
- Native 端提供SDK响应JSBridge发出的调用
- 前端和客户端分别实现对应功能模块
(5)实现一个简易JSBridge:
4.跨端容器-小程序
- 微信、支付宝、百度小程序、小米直达号
- 渲染层-Webview
- 双线程,多WebView架构
- 数据通信,Native转发
5.跨端容器-React Native/WeeX
- 原生组件渲染
- React/Vue框架
- virtual dom
- JSBridge
6.跨端容器-Lynx
- Vue
- JS Core/V8
- JSBinding
- Native UI/Skia
7.跨端容器-Flutter
- wideget
- dart vm
- skia图形库
8.跨端容器-通用原理
- UI组件
- 渲染引擎
- 逻辑控制引擎
- 通信桥梁
- 底层API抹平表现差异
9.跨端方案对比
小程序比WebView流畅:
- 小程序有预加载,访问的是本地资源
- 小程序进行了优化,减少了危险的操作
未来的跨端方案:
大概率还是WebView