浏览器工作原理与实践
李兵
前盛大创新院高级研究员
立即订阅
6167 人已学习
课程目录
已完结 42 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 参透了浏览器的工作原理,你就能解决80%的前端难题
免费
宏观视角下的浏览器 (6讲)
01 | Chrome架构:仅仅打开了1个页面,为什么有4个进程?
02 | TCP协议:如何保证页面文件能被完整送达浏览器?
03 | HTTP请求流程:为什么很多站点第二次打开速度会很快?
04 | 导航流程:从输入URL到页面展示,这中间发生了什么?
05 | 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
06 | 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
浏览器中的JavaScript执行机制 (5讲)
07 | 变量提升:JavaScript代码是按顺序执行的吗?
08 | 调用栈:为什么JavaScript代码会出现栈溢出?
09 | 块级作用域:var缺陷以及为什么要引入let和const?
10 | 作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?
11 | this:从JavaScript执行上下文的视角讲清楚this
V8工作原理 (3讲)
12 | 栈空间和堆空间:数据是如何存储的?
13 | 垃圾回收:垃圾数据是如何自动回收的?
14 | 编译器和解释器:V8是如何执行一段JavaScript代码的?
浏览器中的页面循环系统 (6讲)
15 | 消息队列和事件循环:页面是怎么“活”起来的?
16 | WebAPI:setTimeout是如何实现的?
17 | WebAPI:XMLHttpRequest是怎么实现的?
18 | 宏任务和微任务:不是所有任务都是一个待遇
19 | Promise:使用Promise,告别回调函数
20 | async/await:使用同步的方式去写异步代码
浏览器中的页面 (8讲)
21 | Chrome开发者工具:利用网络面板做性能分析
22 | DOM树:JavaScript是如何影响DOM树构建的?
23 | 渲染流水线:CSS如何影响首次加载时的白屏时间?
24 | 分层和合成机制:为什么CSS动画比JavaScript高效?
25 | 页面性能:如何系统地优化页面?
26 | 虚拟DOM:虚拟DOM和实际的DOM有何不同?
27 | 渐进式网页应用(PWA):它究竟解决了Web应用的哪些问题?
28 | WebComponent:像搭积木一样构建Web应用
浏览器中的网络 (3讲)
29 | HTTP/1:HTTP性能优化
30|HTTP/2:如何提升网络速度?
31|HTTP/3:甩掉TCP、TLS 的包袱,构建高效网络
浏览器安全 (5讲)
32 | 同源策略:为什么XMLHttpRequest不能跨域请求资源?
33 | 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?
34 | CSRF攻击:陌生链接不要随便点
35 | 安全沙箱:页面和系统之间的隔离墙
36 | HTTPS:让数据传输更安全
结束语 (1讲)
结束语 | 大道至简
课外加餐 (4讲)
加餐一|浏览上下文组:如何计算Chrome中渲染进程的个数?
加餐二|任务调度:有了setTimeOut,为什么还要使用rAF?
加餐三|加载阶段性能:使用Audits来优化Web性能
加餐四|页面性能工具:如何使用Performance?
浏览器工作原理与实践
登录|注册

17 | WebAPI:XMLHttpRequest是怎么实现的?

李兵 2019-09-12
上一篇文章中我们介绍了 setTimeout 是如何结合渲染进程的循环系统工作的,那本篇文章我们就继续介绍另外一种类型的 WebAPI——XMLHttpRequest。
自从网页中引入了 JavaScript,我们就可以操作 DOM 树中任意一个节点,例如隐藏 / 显示节点、改变颜色、获得或改变文本内容、为元素添加事件响应函数等等, 几乎可以“为所欲为”了。
不过在 XMLHttpRequest 出现之前,如果服务器数据有更新,依然需要重新刷新整个页面。而 XMLHttpRequest 提供了从 Web 服务器获取数据的能力,如果你想要更新某条数据,只需要通过 XMLHttpRequest 请求服务器提供的接口,就可以获取到服务器的数据,然后再操作 DOM 来更新页面内容,整个过程只需要更新网页的一部分就可以了,而不用像之前那样还得刷新整个页面,这样既有效率又不会打扰到用户。
关于 XMLHttpRequest,本来我是想一带而过的,后来发现这个 WebAPI 用于教学非常好。首先前面讲了那么网络内容,现在可以通过它把 HTTP 协议实践一遍;其次,XMLHttpRequest 是一个非常典型的 WebAPI,通过它来讲解浏览器是如何实现 WebAPI 的很合适,这对于你理解其他 WebAPI 也有非常大的帮助,同时在这个过程中我们还可以把一些安全问题给串起来。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《浏览器工作原理与实践》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(23)

  • 蓝配鸡
    如何高效学习安全理论

    1. why, 知道为什么有这个安全机制, 历史是什么样的

    2. how,知道why之后自己先想想怎么解决这个问题, 再去看看别人是怎么解决的, 分析利弊

    3. 学完之后自己上手试试

    4. 拉个你身边最蠢的小伙伴把这件事给他说明白

    作者回复: 很赞,学安全一定要知道why,知道why才知道how!

    等到了我们专栏的安全篇时,这套理论再结合实践就完美了。

    2019-09-12
    1
    9
  • レイン小雨
    老师后面能详细的讲一下浏览器同源策略的具体实现吗?作为前端最基本的常识性知识却总是感觉理解的不够深入,开始我以为是跨域的请求是被浏览器“拦截在了门内”----即请求没有发送出去,但是看了很多文章中说,其实跨域的请求是发送出去了,服务器也接收到了并响应了,而是在返回的时候被浏览器“拦截在门外”,还有人说,不同的浏览器实现也不一样,很是困惑这里,希望老师能给一个确定的答案。
    2019-09-14
    4
    6
  • Geek_d972f2
    建立tcp连接是在xhr open还是send?

    作者回复: open方法仅仅是配置数据,没有任何真实的连接产生,所有连接阶段都是在send之后

    2019-09-13
    5
  • yihang
    请教老师,我看到 es6中可以通过一个 fetch api来请求,它的实现是用了 xmlHttpRequest么?如果不是,原理上有什么不同?

    作者回复: fetch采用了promise来封装,在使用方式上更强现代化,同时还原生支持async/await。在chromium中,fetch是完全重新实现的,和xmlhttprequest没有什么关系!

    在项目中推荐使用fetch

    2019-09-12
    3
  • bobi
    老师,什么时候专门讲微任务?

    作者回复: 后面三节

    微任务
    Promise
    async/await

    2019-09-12
    3
  • mfist
    作为一名前端开发工程师,要如何高效地学习前端web安全理论呢?
    作为web工程师可以稍微把自己领域知识向后端扩展一些,这样理解web问题、网络传输问题会
    更加得心应手。比如说前端浏览器因为跨域block,后端到底有没有处理请求;XSS 漏洞 以及CSRF
    漏洞如果能前后端一起模拟一下,会更容易理解的。

    今日总结
    xmlhttprequest是为了解决网页局部数据刷新产生的技术。通过同步回调和异步回调以及系统调用栈来引出了
    xmlhttprequest运行机制。一个xhr主要包含下面四个步骤:1. 创建xmlhttprequest对象;2. 为xhr对象
    注册回调函数(ontimeout、onerror、onreadystatechange);3. 打开请求(xhr.open('GET', url,true))4. 配置基础的请求信息(timeout/responseType/setRequestHeader);5. 发送请求。xhr中场景的坑(
    跨域和混合内容)

    作者回复: 通过这些实践理解安全问题是个好方法,最好还要搞清楚为什么有这种或者那种的安全问题,这样我们对安全问题就会融会贯通。

    2019-09-12
    3
  • 老师你好,我有以下几个疑问:
    1.渲染进程里的主线程while循环空转,为啥不会造成系统卡死?我们自己code里空while死循环会造成卡死
    2.就是网络进程IPC给渲染进程时,渲染进程收到消息。这里的”消息“具体包含哪些内容啊?
    谢谢。
    2019-09-17
    2
  • oc7
    异步回调的第二种方式 把异步函数添加到微任务队列中 具体是哪些WebAPI呢? Promise.then?

    作者回复: Promise的resolve和reject会创建微任务。

    还有MutationObserver,如果监听了某个节点,那么通过DOMAPI修改这些被监听的节点也会产生微任务。

    2019-09-12
    2
  • imperial
    老师,异步函数的调用不应该有三种方式吗,可以放到队列尾,微任务中,也可以放入延迟队列中,为什么不放入延迟队列中呢

    作者回复: 延时队列中的任务包含JS通过定时器设置的回调函数、还有一些浏览器内部的延时回调函数。 它们属于宏任务!

    另外正常的消息队列中的任务也属于宏任务!

    所以通常我说放入消息队列就是指放入了宏任务队列(包括了延时队列或者正常的消息队列)

    因为分开来描述会有点啰嗦!

    2019-10-24
    1
  • l1shu
    为什么有些文章说渲染进程中有一个定时器线程用来计时的 到时间后会把回调函数塞到消息队列 而没有提到延迟队列这个说法 求老师解答
    2019-10-22
    1
  • Geek_177f82
    有个疑惑,就是使用setTimeout执行任务时会把任务添加到延迟消息队列,但是在函数中使用setTimeout就是异步回调。而异步回调函数有两种方式:1, 放入微任务处理;2,放入消息队列处理。这样以来就有点迷糊了。那使用setTimeout执行的任务到底应该放哪里执行。还是依据执行环境分别处理。希望老师解答疑惑。谢谢🙏!
    2019-09-16
    3
    1
  • Hurry
    IPC是什么

    作者回复: 进程间通信,比如浏览器进程需要网络进程下载数据,浏览器进程就是通过IPC告诉网络进程需要下载哪些数据,网络进程接收到之后才会开启下载流程

    2019-09-14
    1
  • 朱维娜🍍
    想知道 延时任务是不是一种微任务啊

    作者回复: 不是,宏任务,定时器产生的任务都会保存到延时队列中

    2019-09-12
    1
  • -_-_aaa
    HTTPS下加载http资源会提示‘mixed content’,ajax请求‘been blocked’。那么在http下加载https资源和发送协议是https的ajax请求,会都挂掉吗?
    2019-12-06
  • 海之蓝心
    老师,只有XMLHttpRequest 这种异步请求会出现的跨域问题吗,同步的请求也会吧?
    2019-12-05
  • 老师,您好,有个疑惑想请教一下:
    如果当前js执行过程中产生了异步回调,回调函数被封装成任务添加在消息队列末尾,正在执行的任务结束后(当前的js代码),拉取消息队列中的回调函数进行执行,这时候的执行环境是什么呢,之前的js执行上下文已经消失了???
    2019-11-06
  • 韦一
    1,了解web安全历史,通过历史了解到都暴露出了哪些安全问题,然后他们是怎么解决的。
    2,研究为什么会有这些安全问题,深究原因,才能更好理解解决方案。
    2019-10-11
  • AICC
    老师什么时候出一个web安全的专栏啊,好想系统性的学学
    2019-09-23
  • Lx
    之前看别的文章说浏览器有网络进程,而在渲染进程中除了js引擎线程,gui线程,定时器线程,异步请求线程,事件触发线程。我不太懂,异步请求线程和网络进程的功能边界是什么?
    2019-09-18
  • summerrr
    老师,为什么xhr请求的回调是放在消息队列里面,而我们用axios这种http库发出的请求最后回调是放在微任务里面啊,虽然axios里面用到了promise,promise的回调是微任务,可是axios说到底还是对原生xhr的封装啊。
    2019-09-15
收起评论
23
返回
顶部