浏览器:通往中高端Web前端的必经之路

今天小编来给大家分享一下通往中高端web前端的一大步:浏览器

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 Rendering

4. 从输入 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、clientLeft

offsetWidth、offsetHeight、offsetTop、offsetLeft

scrollWidth、scrollHeight、scrollTop、scrollLeft

getComputedStyle()

getBoundingClientRect()

scrollTo()

回流必定触发重绘,重绘不一定触发回流。重绘的开销较小,回流的代价较高。

最佳实践:

css

避免使用table布局

将动画效果应用到position属性为absolute或fixed的元素上

javascript

避免频繁操作样式,可汇总后统一一次修改

尽量使用class进行样式修改

减少dom的增删次数,可使用字符串或者 documentFragment 一次性插入

极限优化时,修改样式可将其display: none后修改

避免多次触发上面提到的那些会触发回流的方法,可以的话尽量用变量存住

6. 存储

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

短暂性的时候,我们只需要将数据存在内存中,只在运行时可用

持久性存储,可以分为 浏览器端 与 服务器端

浏览器:

cookie: 通常用于存储用户身份,登录状态等

http 中自动携带, 体积上限为 4K, 可自行设置过期时间

localStorage / sessionStorage: 长久储存/窗口关闭删除, 体积限制为 4~5M

indexDB

服务器:

分布式缓存 redis

数据库

7. Web Worker

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

基本用法:

限制:

同源限制

无法使用 document / window / alert / confirm

无法加载本地资源

8. V8垃圾回收机制

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

新生代空间: 用于存活较短的对象

又分成两个空间: from 空间 与 to 空间

Scavenge GC算法: 当 from 空间被占满时,启动 GC 算法

存活的对象从 from space 转移到 to space

清空 from space

from space 与 to space 互换

完成一次新生代GC

老生代空间: 用于存活时间较长的对象

从 新生代空间 转移到 老生代空间 的条件

经历过一次以上 Scavenge GC 的对象

当 to space 体积超过25%

标记清除算法: 标记存活的对象,未被标记的则被释放

增量标记: 小模块标记,在代码执行间隙执,GC 会影响性能

并发标记(最新技术): 不阻塞 js 执行

压缩算法: 将内存中清除后导致的碎片化对象往内存堆的一端移动,解决内存的碎片化

9. 内存泄露

意外的全局变量: 无法被回收

定时器: 未被正确关闭,导致所引用的外部变量无法被释放

事件监听: 没有正确销毁 (低版本浏览器可能出现)

闭包: 会导致父级中的变量无法被释放

dom 引用: dom 元素被删除时,内存中的引用未被正确清空

可用 chrome 中的 timeline 进行内存标记,可视化查看内存的变化情况,找出异常点。

尾声

看完了,不知道大家感觉如何。路漫漫其修远兮...编程这条路还需要一步步走呐...

       如果大家还有其他的看法,欢迎大家在评论里跟小编进行讨论,也可以关注微信公众号【筑梦前端】,跟小编一起探讨更多的编程小知识。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • - 「黑暗有重量嗎?」 - 「黑暗沒有重量,但當你人生處於黑暗的時期,又為什麼會被他壓垮呢?」 - 「黑暗沒有重量...
    11243a阅读 179评论 0 0
  • springboot项目直接引入hystrix,对于调用第三方接口的,用hystrix进行隔离,熔断控制 mave...
    把爱放下会走更远阅读 6,677评论 0 3
  • 游戏,被众人所唾弃。 每当大人们谈论起来,游戏必定是害群之马,乃是罪恶之源头。 然而,他们却不懂得,事物之好坏...
    易诺三仟阅读 180评论 0 0
  • 【导师】王玉印 【分舵】天地会 【舵主】王雅叶 【导图解说】 点评三位同学作品,其实蛮自愧不如的,因为同学们的画工...
    田丽清阅读 275评论 6 0