前端训练营,客户端容器,笔记
浏览器架构
多进程架构: 主进程、网络进程、渲染进程、GPU进程、插件进程 面向服务架构: 将原来的UI、数据库、文件、设备、网络等,作为一个独立的基础服务
不同进程的分工
Q1: 为什么会有单进程?
受到早期硬件的限制,内存比较贵。每个进程都会占用系统资源。
渲染进程
渲染进程为多线程架构,主要负责页面渲染,脚本执行,事件处理,网络请求等等
::GUI引擎与JS引擎互斥::
js引擎 对比 渲染引擎
JS:v8优化:高频的函数,会转为机器码,转为机器码的好处就是缓存然后下次可以直接执行,不需要像字节码一样解析执行,由此达到优化效果 渲染:CSS解析可以与HTML解析同步进行
Chrome浏览器运行原理
输入URL以后发生的响应(部分)
首先会判别是URL还是query,query就搜索引擎搜索,URL就进入导航
优化
首屏优化
1.压缩、分包、删除无用代码
-
压缩:指使用特定的算法来压缩网页中的资源文件(如 HTML、CSS、JavaScript 和图片等),以减小文件大小,加快加载速度。例如,可以使用 Gzip 或 Brotli 等压缩算法来压缩文本文件,使用 PNGquant 或 JPEGmini 等工具来压缩图片。
-
分包:指将网页中的资源文件分成多个包,按需加载。这样,用户在访问网页时只需要加载首屏所需的资源文件,而不必一次性加载所有文件。例如,可以使用 Webpack 或 Rollup 等打包工具来实现代码分包。
-
删除无用代码:指删除网页中不再使用的代码和资源文件,以减小文件大小,加快加载速度。例如,可以使用 UglifyJS 或 Terser 等工具来删除 JavaScript 代码中的无用代码,使用 PurgeCSS 等工具来删除 CSS 代码中的无用样式。
2.静态资源分离
-
静态资源分离是指将网页中的静态资源(如图片、CSS、JavaScript 等)与网页本身分开,通常放在 CDN(内容分发网络)上。这样,当用户访问网页时,浏览器可以从最近的 CDN 节点获取静态资源,加快加载速度。
-
当静态资源与网页本身位于同一个域名下时,浏览器在获取静态资源时会默认携带网页的 cookie。这是因为浏览器会将同一个域名下的所有请求视为同源请求,自动携带 cookie。
3.JS脚本非阻塞加载
放在包底部,因为渲染是自上而下,如果放在上面会导致卡顿
4.缓存策略
通过文件内容生成content hash是一种常用的缓存策略。它可以根据静态文件(如CSS,JS,图片)的内容生成对应的HASH值作为它的版本号,当文件内容发生变化时,版本号也会随之变化。这样可以有效地解决浏览器缓存问题。文件不变可以使用缓存hash。
5.SSR
6.预置loading、骨架屏
渲染优化
1.GPU加速
设置属性will-change ,提前告诉浏览器这个元素需要GPU加速,然后他会把元素放到新建的涂层里
.accelerate {
transform: translateZ(0);
will-change: transform;
}
//需要注意的是,并不是所有情况下都需要启用 GPU 加速。
//过多地使用 GPU 加速可能会导致内存占用过高,反而降低性能。
//因此,在使用 GPU 加速时应当谨慎。
2.减少回流、重绘
transfom代替left,top,display:none设置元素可见不可见会引起回流,可以使用visibilty替代。table表单大,一部分修改就会重新布局,如今不怎么用
3.离屏渲染
开辟一个缓冲区,先进行渲染,完成渲染再显示到屏幕上。可以让动画更顺畅
4,懒加载
将所需要的资源提前加载到本地,如界面滚动等等需要资源,直接从缓存加载,节省时间
JS优化
1.防止内存泄漏
-
当我们使用全局变量时,有风险。日常开发在严格模式下,辅助工具的情况下,可以检测到内存泄露风险问题,
-
比如有一些dom,我们将把它赋值给js变量,当dom被删除,js变量还没有被清空,导致DOM引用一直存在,占用内存大,需要手动删除。
-
定时器,忘记清除也会导致内存泄露。可以封装一个自动清楚定时器的功能。
2.循环尽早break
3.合理使用闭包
正确的使用闭包,可以减少元素的创建,在我们使用单例的时候,闭包函数创建,即使调用多次也只创建一个变量。
4.减少Dom访问
js引擎和渲染引擎交互比较费时间,减少访问次数,style用一条语句表示,className形式,可以用变量缓存起来。不要每次都去window查询。
5.防抖、节流
- 防抖:防止多次提交,只会提交最后一次。应用:input 输入查询搜索、scroll 滚动、表单验证、按钮提交。
- 节流:规定时间内,多次调用也只会执行一次。dom 拖拽功能的实现、计算鼠标移动的距离、监听scroll滚动。
6.Web Workers
新的浏览器支持的属性。js引擎相互独立,它在执行时不会阻塞浏览器渲染,有问题是传输是文本传输,大的数据传输也会有性能问题,优点是:ArrayBuffer可以直接传输,用在图片视频,音频处理上。
跨端容器
Q1:同样是基于webview渲染 ,为什么小程序体验比webview流畅?
封死了DOM操作等危险性较高操作,降低门槛