浏览器架构
架构演进
单进程-->多进程-->面向服务架构
- 单进程架构,是所有模块运行在同一个进程里,是前期计算机资源有限无奈的选择。
- 多进程架构,可以分为
主进程、网终进程、渲染进程、GPU进程、插件进程
(可通过浏览器-更多工具-任务管理器查看)。 - 面向服务架构,将原来的U、数据库、文件、设备、网络等,作为一个独立的
基础服务
。
渲染进程(标签页)
浏览器渲染进程内部是多线程实现的,包括JS引擎线程、GUI渲染线程、定时器触发线程、网络线程、事件触发线程
,JS引擎与GUI渲染引擎的通信是通过Bridge桥接进行的。
多线程的工作流程:
- 网络线程负责加载网页资源;
- JS引警解析JS脚本并且执行;
- JS解析引擎空闲时,渲染线程立即工作(
JS引擎与渲染线程是互斥的
); - 用户交互、定时器操作等产生回调函数放入任务队列中;
- 事件线程进行事件循环,将队列里的任务取出交给JS引擎执行。
任务队列可以分为
宏任务队列
和微任务队列
,执行顺序如下(web前端知识:js中的微任务和宏任务 - 掘金 (juejin.cn)):
- 首先执行当前代码(同步任务),直到遇到第一个宏任务或微任务。
- 如果遇到微任务,则将它添加到微任务队列中,继续执行同步任务。
- 如果遇到宏任务,则将它添加到宏任务队列中,继续执行同步任务。
- 当前任务执行完毕后,JavaScript 引擎会先执行所有微任务队列中的任务,直到微任务队列为空。
- 然后执行宏任务队列中的第一个任务,直到宏任务队列为空。
- 重复步骤 4 和步骤 5,直到所有任务都被执行完毕。 需要注意的是,微任务比宏任务优先级要高,因此在同一个任务中,如果既有微任务又有宏任务,那么微任务会先执行完毕。而在不同的任务中,宏任务的执行优先级要高于微任务,因此在一个宏任务执行完毕后,它才会执行下一个宏任务和微任务队列中的任务。
Chrome运行原理
从一道面试题开始:浏览器地址输入URL后发生了什么?
前端性能优化
首屏优化
- 压缩、分包、删除无用代码
- 静态资源分离
- JS脚本非阻塞加载
- 缓存策略
- SSR
- 预置loading、骨架屏
渲染优化
- GPU加速 主要是CSS3,用transform做动画
- 减少回流、重绘 千万不要用table,一改就要重绘
- 离屏渲染 canvas
- 懒加载
JS优化
- 防止内存泄漏 全局变量,严格模式可以检测风险;DOM引用没有删除;定时器没清除(自己封装一个能自动清除的定时器)
- 循环尽早break
- 合理使用闭包 单例
- 减少Dom访问 js访问DOM需要桥接,非常耗时;使用classname,只访问一次
- 防抖、节流
- Web Workers H5的新特性;与JS线程独立,
跨端容器
跨端开发的原因
- 开发成本、效率
- 一致性体验
- 前端开发生态
跨端方案
webview
WebView类似于浏览器渲染进程
1.同样是基于webview渲染,为什么小程序体验比webview流畅? 小程序会预先对资源进行缓存 2.未来的跨端方案会是什么? 会回归webview
webview优势:
- 一次开发,处处使用,学习成本低;
- 随时发布,即时更新,不用下载安装包;
- 移动设备性能不断提升,性能有保障;
- 通过JSBridge和原生系统交互,实现复杂功能
JS与Native通信