浏览器工作原理和实践

1.介绍

见正文3

2.应用背景

参透了浏览器的工作原理,可解决80%的前端难题.

帮助高效快速安全开发web前端项目.

3.学习

课程目录

开篇词 (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 的包袱,构建高效网络

参考:

https://blog.csdn.net/william_n/article/details/123175716

浏览器安全 (5讲)

32 | 同源策略:为什么XMLHttpRequest不能跨域请求资源?

33 | 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?

34 | CSRF攻击:陌生链接不要随便点

35 | 安全沙箱:页面和系统之间的隔离墙

36 | HTTPS:让数据传输更安全

该专栏已经学习了两遍, 挺好的,  感觉还需要后续学习第三遍, 并结合其他资料, 以及前端项目一起学习消化, 融化贯通    ///  20210305 12:20 周五 家里

4.问题/补充

Note:

含记名不记名网友问题

& chatgpt

1 回顾浏览器的进化路线,你认为推动浏览器发展的主要动力是什么?

[一个角度来说,最大动力就是chrome的出现。曾经的IE像极了诺基亚,chrome就像是横空出世的iPhone ,当着IE的面告诉IE,浏览器应该这么玩儿。
另一个角度也是互联网的发展需要,人们所需要的不再是只是简单展示个页面的浏览器,需要有复杂的交互,浏览器应该能做更多的事情,这对浏览器的稳定性、以及性能都有了新的要求。所以出来一个性能符合要求的浏览器也是必须的。
还有就是11年后相对规范的es5的出现,再之后es6.7,web能做的事情越来越多了,web工程化,再后来node的出现,前端体系越来越庞大]

2. 07 | 变量提升:JavaScript代码是按顺序执行的吗?

1.老师好,请教您一个问题。

debugger;
(function(){
    console.log(g)
    if(true){
        console.log('hello world');
        function g(){ return true; }
    }
})();

这个函数步进调试时,发现打印g时值是undefined而不是提示not defined,说明if中g函数确实是提升了,但是为何不是g()而是undefined?然后走完function g(){ return true; }这一步后 console.log(g)中的g才变为g()。这里条件声明函数的变量提升有点搞不明白。
作者回复: 

ES规定函数只不能在块级作用域中声明,

function foo(){
    if(true){
        console.log('hello world');
        function g(){ return true; }
    }
}

也就是说,上面这行代码执行会报错,但是个大浏览器都没有遵守这个标准。

接下来到了ES6了,ES6明确支持块级作用域,ES6规定块级作用域内部声明的函数,和通过let声明变量的行为类似。

规定的是理想的,但是还要照顾实现,要是完全按照let的方式来修订,会影响到以前老的代码,所以为了向下兼容,个大浏览器基本是按照下面的方式来实现的:

function foo(){
    if(true){
        console.log('hello world');
        var g = function(){return true;} 
    }
}

这就解释了你的疑问,不过还是不建议在块级作用域中定义函数,很多时候,简单的才是最好的。

2. ES6 在附录B里面规定:

1.允许在块级作用域内声明函数。
2.函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
3.同时,函数声明还会提升到所在的块级作用域的头部。

这里的表现应该是这样:
function foo(){
    var g1;
    if(true){
        function g2(){return true;}
        console.log('hello world');
        g1 = g2;
    }
}

g1和g2表示引用不一样,这里是同名关系,但是所在的变量作用域是不一样的。

下面这个文章详细解释了。
https://juejin.im/post/5eaa8211e51d454de64e388e
 

3. 老师,可以请教下吗,在编译完成之后是单单生成了字节码,再到执行过程中变成对应平台的机器码? 还是编译过程已经生成了对应平台的机器码, 执行阶段就直接去执行相应的机器码?
作者回复: 先是生成字节码,然后解释器可以直接执行字节码,输出结果。 但是通常Javascript还有个编译器,会把那些频繁执行的字节码编译为二进制,这样那些经常被运行的函数就可以快速执行了,通常又把这种解释器和编译器混合使用的技术称为JIT

3. DOM API和BOM API

DOM(Document Object Model) 和 BOM(Browser Object Model) 是浏览器中用来操作网页的两个 API(应用程序编程接口)。

DOM API 是用于解析和操作 HTML、XML 等文档的 API,它提供了一个抽象层次结构来模拟文档的结构和内容。通过 DOM API,开发人员可以使用脚本将数据插入、修改和删除文档中的元素,以及遍历文档树、提取信息等。DOM API 主要由 JavaScript 语言提供,但也可以使用其他编程语言实现。

BOM API 是用于操作浏览器窗口和浏览器对象的 API,它提供了访问浏览器窗口、导航栏、状态栏、标签栏等的 API。BOM API 提供了与浏览器相关的操作,如打开新窗口、关闭窗口、切换标签页等。BOM API 主要由 JavaScript 语言提供,但也可以使用其他编程语言实现。

DOM 和 BOM 是浏览器中用来操作网页的两个重要 API,它们为开发人员提供了访问和操作网页的机制,从而可以更方便、更高效地编写网页应用程序。

DOM API 和 BOM API 都是由浏览器提供的 API,它们定义了浏览器中如何处理 HTML、XML 和其他文档,以及如何与浏览器窗口和浏览器对象进行交互。

JavaScript 语言作为浏览器脚本语言,也为 DOM API 和 BOM API 提供了实现和支持。开发人员可以使用 JavaScript 代码来操作 DOM 和 BOM,从而实现网页的交互和动态效果。

虽然 DOM API 和 BOM API 是由浏览器提供的,但 JavaScript 语言也可以为这些 API 提供更高级别的抽象和封装,以便开发人员更方便、更高效地使用这些 API。同时,JavaScript 语言也可以使用其他 API 来操作文档、窗口和其他浏览器对象,例如 HTML5 应用程序框架 (App Framework)。

让我来举一个例子来说明 DOM API 和 BOM API 是由浏览器提供的还是由 JavaScript 语言提供的。

假设我们要在网页中创建一个标签,可以使用 HTML 语言的 <tag> 元素,例如:

<tag>Hello World!</tag>

在这个例子中,我们使用 <tag> 元素来创建了一个标签,这个标签包含了一个文本节点。要创建这个标签,我们需要在 HTML 文档中使用 <tag> 元素。

但是,如果我们想要在 JavaScript 中创建这个标签,我们可以使用 DOM API 中的 createElement 方法。

例如:

const tagNode = document.createElement('tag');

在这个例子中,我们使用 createElement 方法在文档对象模型 (DOM) 中创建了一个名为 tag 的新标签节点。DOM API 提供了这个方法来创建新的元素节点,而这个节点可以包含文本、图像、链接等元素。

同样地,如果我们想要在 JavaScript 中创建浏览器窗口对象,我们可以使用 BOM API 中的 window.open 方法。例如:

const url = 'https://www.example.com'; const window = window.open(url);

在这个例子中,我们使用 window.open 方法创建了一个新窗口,这个窗口可以连接到 https://www.example.com 网址。BOM API 提供了这个方法来打开新窗口或切换现有窗口。

因此,虽然 DOM API 和 BOM API 都是由浏览器提供的,但 JavaScript 语言也为这些 API 提供了更高级别的抽象和封装,以便开发人员更方便、更高效地使用这些 API。

除了上述提到的 DOM 和 BOM API,还有一些重要的 API 不是由浏览器提供的。这些 API 是由操作系统或操作系统之上的更高级别抽象层提供的,它们可以让开发人员在桌面应用程序或移动应用程序中操作文件系统、访问摄像头、麦克风等硬件设备,以及进行系统级别的操作。

例如,Windows 操作系统提供了 API 来访问文件系统,Linux 操作系统也提供了类似的 API 来访问文件系统。这些 API 可以让开发人员编写桌面应用程序或移动应用程序,无需直接访问硬件设备或文件系统,而是通过更高级别的抽象层来实现。

此外,一些操作系统还提供了 API 来访问摄像头、麦克风等硬件设备,以及进行系统级别的操作,例如打开应用程序、关闭应用程序、调整音量等。

这些非浏览器提供的 API 可以让开发人员编写更加通用、灵活和可扩展的应用程序,同时也提高了应用程序与操作系统和其他硬件设备的交互能力。

...

5.推荐书籍

TBD

6..参考

极客时间专栏:浏览器工作原理和实践 --李兵 以及不记名网友的评论见解

后续补充

... 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22584.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot自动配置的模版引擎

文章目录 目录 一、Thymeleaf 1.什么是Thymeleaf? 2.什么是模版引擎? 3.JAVA中的SPI(Service Provider interface)机制? 4.META-INF目录是干嘛用的? 总结 前言 一、Thymeleaf 1.什么是Thymeleaf? hymeleaf是试用于Web和独立环境的现代服务器端Java模版引擎 目的:…

chatgpt赋能Python-python_lirc

Python-LIRC&#xff1a;让Python与遥控器无缝连接 介绍 Python-LIRC是一个Python语言的模块&#xff0c;它提供了一种接口&#xff0c;用于与Linux Infrared Remote Control&#xff08;LIRC&#xff09;系统进行通信。有了Python-LIRC&#xff0c;你可以轻松地将红外线遥控…

重磅!牛客笔试客户端可防ChatGPT作弊

上线俩月&#xff0c;月活过亿。 爆火的ChatGPT能代写文&#xff0c;撕代码&#xff0c;善玩梗&#xff0c;秒答题&#xff0c;几乎“无所不能”&#xff0c;争议也随之而来。 调查显示&#xff0c;截至2023年1月&#xff0c;美国89%的大学生利用ChatGPT应付作业&#xff0c;53…

学生用ChatGPT拿下全班最高分,教授惊呆

【导读】ChatGPT爆火两个月&#xff0c;整个教育系统都被颠覆了。学生用得不亦乐乎&#xff0c;而老师们迫不得已&#xff0c;纷纷打响了ChatGPT反击战。 ChatGPT已经让大学老师们受到惊吓了。 摸出门道的学生们&#xff0c;开始使用ChatGPT生成论文&#xff0c;得到了A的分数…

自然语言处理(NLP)之跳字(元)模型<skip-gram>与连续词袋模型<continuous bag of words>

自然语言处理(Natural Language Processing, NLP)是AI里的一个非常重要的领域&#xff0c;比如现在很火爆的ChatGPT&#xff0c;首先就需要很好的理解输入内容的意思才能够做出合理的回复。 自然语言处理应用非常广泛&#xff0c;比如机器翻译、问题回答、文本语义对比、语音识…

DeepMind:用 GNN 学习通用推理算法

文 | 智商掉了一地 小孩子才做选择&#xff0c;我的模型全&#xff01;都&#xff01;要&#xff01; 近年来&#xff0c;基于深度神经网络的机器学习系统取得了巨大进步&#xff0c;尤其是在以感知为主的任务上。这一领域表现突出的模型通常要在分布中进行泛化&#xff0c;意味…

GPT-4发布:人工智能新高度,以图生文技术震撼,短时间内挤爆OpenAI模型付费系统

“GPT-4&#xff0c;起飞&#xff01;”今日凌晨1点&#xff0c;OpenAI正式推出史上最强大的GPT-4文本生成AI系统 GPT-4&#xff1a;人工智能的新里程碑 你可能已经听说过GPT-3&#xff0c;它是一种能够生成自然语言文本的强大模型&#xff0c;可以用来回答问题、写文章、编程…

从BERT到ChatGPT,9大研究机构全面综述:「预训练基础模型」

来自&#xff1a;新智元 编辑&#xff1a;LRS 【导读】2023年了&#xff0c;还有人从头开始训模型吗&#xff1f;追踪一下从Bert以来的那些预训练模型。 ChatGPT在few-shot和zero-shot场景下展现出的惊人性能&#xff0c;让研究人员们更坚定「预训练」是一条正确的路线。 预训练…

【AI项目实战】某语言模型-stable diffusion-vits-cqhttp 实现能对话能语音能绘画的Q群机器人

好久没写文章了&#xff0c;终于想起来我有个博客账号系列。。 项目已开源在github上。 文章已滤敏&#xff0c;一切涉及语言模型名字的内容都以某语言模型代替 提示&#xff1a;AI绘画部分建议6G显存以上。 cqhttp 用于接收群友消息&#xff0c;并回复消息。 某语言模型 基于…

微信PC端各个数据库文件结构与功能简述 - 根目录

异想之旅&#xff1a;本人原创博客完全手敲&#xff0c;绝对非搬运&#xff0c;全网不可能有重复&#xff1b;本人无团队&#xff0c;仅为技术爱好者进行分享&#xff0c;所有内容不牵扯广告。本人所有文章仅在CSDN、掘金和个人博客&#xff08;一定是异想之旅域名&#xff09;…

springboot+vue集成websocket实现聊天功能

1、添加pom依赖 <!-- websocket --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 2、创建一个config文件夹&#xff0c;在config文件夹中创建…

广州租房房价分析

利用八爪鱼爬链家网上广州市租房房源数据&#xff0c;网址为https://gz.lianjia.com/zufang/&#xff0c;爬取字段为价格、租赁方式、房型、楼层、面积、朝向、地铁、小区、位置、经度、纬度等&#xff0c;保存到E盘数据分析课程设计文件夹下&#xff0c;存为“gz_zufang.csv”…

房价数据分析

文章目录 一、数据预处理1、删除多余列2、缺失值、异常值处理 二、 数据探索分析1、DistanceKM与房价关系2、14岁及以下比重与房价关系3、自驾实际值与房价关系4、65岁及以上比重与房价关系5、人口占比与房价关系 三、机器学习预测房价1、模型选择2、模型调参 四、总结 一、数据…

北京二手房房价分析(建模篇)

数据科学俱乐部 中国数据科学家社区 本篇将继续上一篇数据分析用Python分析北京二手房房价之后进行数据挖掘建模预测&#xff0c;这两部分构成了一个简单的完整项目。结合两篇文章通过数据分析和挖掘的方法可以达到二手房屋价格预测的效果。 下面从特征工程开始讲述。 特征工程…

我国主要城市2023年房价数据

房价是一个城市发展程度的重要体现&#xff0c;一个城市的房价越高通常代表这个城市越发达&#xff0c;对于人口的吸引力越大&#xff01;因此&#xff0c;房价数据是我们在各项城市研究中都非常常用的数据&#xff01; 本次我们为大家带来的是我国主要城市的房价数据&#xf…

分析天津市房价的空间因素影响

所有代码与解析 # -*- coding: utf-8 -*- """ Created on Thu Mar 4 16:23:30 2021author: 89344 """import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings(ignore) from bokeh.…

Python爬取天津房价并进行可视化

Python爬取天津房价并进行可视化 步骤代码 步骤 1.爬取网页信息 2.解析网页信息&#xff0c;获取需要的数据&#xff0c;存入CSV文件中 3.读取CSV文件&#xff0c;对数据进行处理&#xff0c;包括剔除异常值&#xff0c;空值等&#xff0c;进行可视化 代码 import requests …

房价概况:2013年2月26日天津各区县房价一览

2013年2月26日全市新建商品房交易373套、面积37502.8平方米&#xff0c;平均价格每平方米10504元。其中&#xff0c;住宅335套、面积34159.8平方米&#xff0c;平均价格每平方米9844元。二手住宅交易275套、面积22696.8平方米&#xff0c;平均价格每平方米8579元。

Spring实战----Taco Cloud(墨西哥煎玉米卷在线订购系统)

记录一下根据《Spring实战&#xff08;第五版&#xff09;》(人民邮电出版社)所学习的过程 目录 项目初始化 开发WEB应用 使用数据库 使用Spring Data JPA进行持久化数据 使用Spring Security保护Spring 自定义用户验证 项目初始化 New一个Project&#xff0c;选择Sprin…

C/C++字符串

一.C风格的字符串 1. char a[6] { h,e,l,l,o,\0 }; printf("%s", a);//hello#include<iostream> #include<string> using namespace std; int main() {char a[6] { h,e,l,l,o,\0 };char b[5] { h,e,l,l,o};//空间至少大一位留出\0位置char c[6] { h,e…