面向对象编程_五大原则
- 单一职责原则
- 开放封闭原则
- 里式替换原则
- 依赖倒置原则
- 接口分离原则
函数式编程
- 聚合转发
- 可缓存
- 可移植
- 可测试
- 可推理
- 可并行
- Currying
- 闭包
- 参数重复
- Composition
- 手动组合 -> 提高效率
-
Functor 容器类型,类型支持队容器内元素进行操作
-
Monad 去除容器嵌套容器类型
-
Applicative 直接对两个容器进行操作
- 移植性规则
- 重构性规则
- 交换规则
- 组合规则
响应式编程
异步离散的函数式编程
- 数据流
- 操作符:过滤、合并、转化、高阶
- Observable
- 观察者模式:订阅
Promise/EventTarget超集:Promise超集:数据持续来,不止一次;EventTarget超集:取消订阅就不推送消息;
- 迭代式模式:推送数据
- 操作符
- 合并
- 过滤
- 转化
- 异常处理
- 多播
- Monad
- 去除嵌套的Observable
浏览器架构演进
- 单进程架构
- 多进程架构(现代)
- 面向服务架构
渲染进程
- js引擎:解析js脚本,运行js程序,与GUI渲染互斥,js执行时间过长页面会卡顿
- GUI渲染:渲染浏览器界面,解析html,css,构建dom树和render树,布局、绘制,和js引擎线程互斥,GUI更新会在js引擎空闲时立即执行
- 定时器触发:定时器所在线程,setTimeout,setInterval计时完毕后,将会带哦添加到事件队列,等待js引擎执行
- 网络线程:在XHR、Fench等发起请求后新开一个网络线程请求,如果设置了回调函数,在状态变更时,将回调放入事件队列,等待js引擎执行
- 事件触发:由宿主环境提供,用于控制事件循环,不断地从事件队列里取出任务执行
JS引擎 VS 渲染引擎
JS引擎和渲染引擎相互独立
多线程工作流程
Chrome运行原理_如何展示网页
- 浏览器主进程:输入处理 -> 开始导航 -> 读取响应 -> 寻找渲染进程
- 渲染进程:资源加载(加载子资源 -> 执行脚本)-> 构建(构建DOM -> 构建CSSOM -> 构建渲染树)-> 布局 -> 绘制(构建图层 -> 绘制图层)-> 合成 (光栅化)-> 展示完成
- 输入处理 :是URL则直接请求站点资源,是Qurry将输入发送给搜索引擎
- 开始导航:请求过程中,tab处于loading
- 读取响应:是HTML交给渲染进程,是其他的交给下载管理器
- 寻找渲染进程:IPC消息 -> 开始处理 -> 导航结束进入加载阶段
- 资源加载:加载HTML文档,子资源(图片,css样式和JavaScript脚本)
- 构建渲染树:构建DOM树(将HTML文本转化为浏览器能理解的结构) -> 构建CSSOM树(将CSS代码转化为可理解的结构 -> 构建渲染树)
- 页面布局:根据渲染树计算每个节点的位置和大小 -> 绘制元素边框 -> 比案例渲染树,将元素以盒模型的形式写入文档流
- 页面绘制:构建图层(为特定节点生成专用图层) -> 绘制图层(一个图层分为多个绘制指令,按顺序组成列表,交给合成线程)-> 合成线程接受指令生成图块 -> 栅格线程将图块进行栅格化(将图块转为位图) -> 展示在屏幕上
首屏优化
- 压缩、分包、删除无用代码
- 静态资源分离
- JS脚本非阻塞加载
- 合理使用缓存策略
- SSR
- 预置loading、骨架屏
渲染优化
- GPU加速(新建图层耗时)
- 减少回流、重绘(不用tab)
- 离屏渲染:开辟一段内存,在渲染之前将其先渲染一遍,然后需要时直接调用
- 懒加载:将所需资源提前加载到本地(界面滚动)
JS优化
- 防止内存泄漏(使用全局变量时,定时器忘记删除 -> 定时器自动删除)
- 循环尽早break
- 合理使用闭包(不合理使用会造成内存泄漏,合理时可以减少元素创建)
- 减少Dom访问(JS引擎和渲染引擎交互费时间,Dom常用则直接缓存)
- 防抖、节流(多次调用只访问一次)
- Web Workers:和JS相互独立(图片、视频、音频)
跨端容器
- 优点
- 开发成本低、效率高
- 一致性体检
- 前端开发生态
- WebView 网页视图,用于加载url,展示内容控件
- Android
- IOS
- 国产Android
- WebView使用原生能力
- JavaScript调用Native
- Native调用JavaScript
跨端容器 -> WebView <-> Native 通信
没听明白
跨端容器小程序
- 微信、支付宝、百度
- 渲染层:webview
- 双线程,多webview架构
- 数据通信Native转发
跨端容器-React Native
- 原生组件渲染
- React/Vue框架
- virtual dom
- JSBridge
跨端容器-Lynx
- Vue
- JS Core / v8
- JSBinding -> Renderer
- Native UI / Skia
跨端容器-Flutter
- wideget
- dart vm
- skia图形库
跨端容器通用原理
- UI组件
- 渲染引擎
- 逻辑控制引擎
- 通信桥梁
- 底层API抹平表现差异