通往中高端Web前端:浏览器篇

原文链接:https://mbd.baidu.com/newspage/data/landingshare?pageType=1&context=%7B%22nid%22%3A%22news_9413238870058743542%22%7D

原文标题:通往中高端Web前端:浏览器篇

新标题:

【注:本文作者原创作品,未经允许禁止抄袭。侵权必究!全网追踪】

这里系列到此已经发布的四篇,分别是:一篇CSS篇、3篇JavaScript。没收到推送的朋友可以在我的历史文章中查看。

今天的内容,是浏览器篇,希望可以给大家带来帮助。

正文

1. 跨标签页通讯

不同标签页间的通讯,本质原理就是去运用一些可以 共享的中间介质,因此比较常用的有以下方法:

通过父页面window.open()和子页面postMessage异步下,通过 window.open('about: blank') 和 tab.location.href = '*'设置同域下共享的localStorage与监听window.onstorage重复写入相同的值无法触发会受到浏览器隐身模式等的限制设置共享cookie与不断轮询脏检查(setInterval)借助服务端或者中间层实现2. 浏览器架构

用户界面主进程内核渲染引擎JS 引擎执行栈事件触发线程消息队列微任务宏任务网络异步线程定时器线程3. 浏览器下事件循环(Event Loop)

事件循环是指: 执行一个宏任务,然后执行清空微任务列表,循环再执行宏任务,再清微任务列表

微任务 microtask(jobs): promise / ajax / Object.observe(该方法已废弃)宏任务 macrotask(task): setTimout / script / IO / UI Rendering4. 从输入 url 到展示的过程

DNS 解析TCP 三次握手发送请求,分析 url,设置请求报文(头,主体)服务器返回请求的文件 (html)浏览器渲染HTML parser --> DOM Tree标记化算法,进行元素状态的标记dom 树构建CSS parser --> Style Tree解析 css 代码,生成样式树attachment --> Render Tree结合 dom树 与 style树,生成渲染树layout: 布局GPU painting: 像素绘制页面5. 重绘与回流

当元素的样式发生变化时,浏览器需要触发更新,重新绘制元素。这个过程中,有两种类型的操作,即重绘与回流。

重绘(repaint): 当元素样式的改变不影响布局时,浏览器将使用重绘对元素进行更新,此时由于只需要UI层面的重新像素绘制,因此 损耗较少回流(reflow): 当元素的尺寸、结构或触发某些属性时,浏览器会重新渲染页面,称为回流。此时,浏览器需要重新经过计算,计算后还需要重新页面布局,因此是较重的操作。会触发回流的操作:页面初次渲染浏览器窗口大小改变元素尺寸、位置、内容发生改变元素字体大小变化添加或者删除可见的 dom 元素激活 CSS 伪类(例如::hover)查询某些属性或调用某些方法clientWidth、clientHeight、clientTop、clientLeftoffsetWidth、offsetHeight、offsetTop、offsetLeftscrollWidth、scrollHeight、scrollTop、scrollLeftgetComputedStyle()getBoundingClientRect()scrollTo()回流必定触发重绘,重绘不一定触发回流。重绘的开销较小,回流的代价较高。

最佳实践:

css避免使用table布局将动画效果应用到position属性为absolute或fixed的元素上javascript避免频繁操作样式,可汇总后统一 一次修改尽量使用class进行样式修改减少dom的增删次数,可使用 字符串 或者 documentFragment 一次性插入极限优化时,修改样式可将其display: none后修改避免多次触发上面提到的那些会触发回流的方法,可以的话尽量用 变量存住6. 存储

我们经常需要对业务中的一些数据进行存储,通常可以分为 短暂性存储 和 持久性储存。

现代浏览器为JavaScript创造的 多线程环境。可以新建并将部分任务分配到worker线程并行运行,两个线程可 独立运行,互不干扰,可通过自带的 消息机制相互通信。

基本用法:

// 创建 workerconst worker = new Worker('work.js');// 向主进程推送消息worker.postMessage('Hello World');// 监听主进程来的消息worker.onmessage = function (event) { console.log('Received message ' + event.data);}复制代码限制:

同源限制无法使用 document / window / alert / confirm无法加载本地资源8. V8垃圾回收机制

垃圾回收: 将内存中不再使用的数据进行清理,释放出内存空间。V8 将内存分成 新生代空间和 老生代空间。

新生代空间: 用于存活较短的对象又分成两个空间: from 空间 与 to 空间Scavenge GC算法: 当 from 空间被占满时,启动 GC 算法存活的对象从 from space 转移到 to space清空 from spacefrom space 与 to space 互换完成一次新生代GC老生代空间: 用于存活时间较长的对象从 新生代空间 转移到 老生代空间 的条件经历过一次以上 Scavenge GC 的对象当 to space 体积超过25%标记清除算法: 标记存活的对象,未被标记的则被释放增量标记: 小模块标记,在代码执行间隙执,GC 会影响性能并发标记(最新技术): 不阻塞 js 执行压缩算法: 将内存中清除后导致的碎片化对象往内存堆的一端移动,解决 内存的碎片化9. 内存泄露

意外的全局变量: 无法被回收定时器: 未被正确关闭,导致所引用的外部变量无法被释放事件监听: 没有正确销毁 (低版本浏览器可能出现)闭包: 会导致父级中的变量无法被释放dom 引用: dom 元素被删除时,内存中的引用未被正确清空可用 chrome 中的 timeline 进行内存标记,可视化查看内存的变化情况,找出异常点。

尾声

【注:本文作者原创作品,未经允许禁止抄袭。侵权必究!全网追踪】

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190222A0LESX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券