(2)浏览器工作原理与实践

从气象预报到物流规划:多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用 本文深入探讨了多尺度地理加权回归(MGWR)在ArcGIS Pro中的实战应用。通过对比传统GWR模型,MGWR的核心优势在于能识别不同解释变量的独特空间作用尺度,有效解决空间异质性问题。文章结合气象预报误差修正物流网点选址两个案例,详细讲解了从数据准备、参数设置、带宽优化到结果解读的全流程,为地理数据分析师处理复杂空间数据提供了强大工具。 阅读详情

前言:本系列主要是前端高阶课程的笔记整理,所以在讲述知识点的同时会延伸映射一些面试题,内容之间有点跳跃,但是全文的知识点还是循序渐进的。阅读本文你将了解认识在浏览器运行态下的JS,包括

  • BOM

  • 浏览器原理

一、 认识在浏览器运行态下的JS

在开始之前笔者先帮大家整理了相应的知识点概念逻辑,方便各位理解

BOM:Browser Object Model 是浏览器对象模型,浏览器对象模型提供了独立与内容的、可以与浏览器窗口进行互动的对象结构,BOM由多个对象构成,其中代表浏览器窗口的window对象是BOM的顶层对象,其他对象都是该对象的子对象。

DOM:当网页被加载时,浏览器会创建页面的文档对象模型

 (function(context, undefined){
        const _class = ['js', 'browser', 'vue']

        // 向全局中挂载
        window.classArr = _class.map(item => item)

        // 获取当前页面地址
        const _url = location.href

        // 设置tab标题
        document.title = 'zhaowa class'

        // 获取渲染节点
        document.getElementById('app')
    })(this)

window是我们浏览器的进程中唯一挂载的一个窗口
location是我们用户当前存在的一个位置,或者说是地址document指我们可视范围内的文本通过上面的代码可以看到,不光有执行环境,还有我们跟用户的交互,和文本的交互,
其实可以简述成下面的面试题 

面试题: 了解浏览器JS的执行态

 Q:  // 简述:
    // ECMAScript - 基础逻辑、数据处理
    // DOM - 对于浏览器视窗内,文本的相应操作
    // BOM - 对于浏览器本身区域能力的处理 

今天主要的是讲一下BOM

BOM

先在控制台打印一下我们的location,了解一下我们的location有哪些东西

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uo23TbWU-1652062986396)(https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/01cbf167e548461e83ef77afd8f4716b~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image?)]

location.href => 'https://www.baidu.com/search?class=browser#comments' => 路径栏所有
        .orgin => 'https://www.baidu.com'
        .protocol => 'https:'
        .host => 'www.zhaowa.com'
        .port => ''
        .pathname => '/search/'
        .search => '?class=browser&id=2' //不包含哈希
        .hash => '#comments' 

以上是location的一些API

除此之外,location还有一些方法

 .assign('') // 跳转到指定path => 替换pathname
    .replace('') // 同上,同时替换浏览历史
    .reload()    //重新载入当前文档
    .toString() // 产出当前地址字符串 

面试方向:

*** location本身api操作 – 提取相关信息、api间对比 => assign vs replace

  • *路由相关: 跳转、参数、操作 => 场景:面试官问你,从列表页面进到详情页面,再点击详情页面的某个模块的详情页,然后在改模块点击返回,但是此时返回到的不是第一个详情页,而是列表页面,请问,为什么会出现这种页面返回不对的情况** 记住:凡是出现页面返回不对的问题,就是跟history有关,要么就是第二次跳转调用了replace()直接清空了, 要么就是直接整个路由重置了

**避免跳转异常方法:**是否刷新(hash)=> replace替换assign、携带参数

  • url处理 - 正则 or 手写js处理
  • URI & URL: uniform resource identifier / locator

Q: URI是统一资源标识符。标识资源详细名称。

URL是统一资源定位器。定位资源的网络位置。

资源:可以通过浏览器访问的信息统称为资源。(图片、文本、HTML、CSS等等。。。)

URI标识资源的详细名称。包含资源名。即文件id  

URL定位资源的网络位置。包含http:。即路径位置

可以说URL是URI(URL是URI的子集),但URI永远不能是URL。

hash和history的区别

  • hash: 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器;hash路由一个明显的标志是带有**#**,我们主要是通过监听url中的hash变化来进行路由跳转。hash的优势就是兼容性更好,在老版IE中都有运行,问题在于url中一直存在#不够美观,而且hash路由更像是Hack而非标准,相信随着发展更加标准化的History API会逐步蚕食掉hash路由的市场。

  • history : 依赖 HTML5 History API 和服务器配置。具体可以查看 HTML5 History 模式;

  • history会出现后台解析不了的情况,因为他跟真实的路由是一样,所以我们需要给后台一个默认指向

navigator

我们试着在控制台打印一下

可以把他理解为浏览器系统信息大集合

navigator.userAgent  //获取当前用户的环境信息 

面试方向 :

  1. userAgent 读取信息 => 浏览器兼容性、上报信息

  2. 剪切板、键盘

screen

表征显示区域 – 荧幕

面试方向(初级工程师常考) - 视图判断

全局入口处:

window.innerHeight 
window.innerWidth 

文本处获取:

 document.documentElement.clientHeight 
 document.documentElement.clientWidth
 document.body.clientWidth
 document.body.clientWidth 

网页视图的size -> offsetHeight = clientHeight + 滚动条 + 边框

document.documentElement.offsetHeight
document.documentElement.offsetWidth
document.body.offsetHeight
document.body.offsetWidth 

动态定位

scrollLeft / scrollTop - 距离常规左 / 上滚动距离

offsetLeft / offsetTop - 距离常规左 / 上距离

Element.getBoundingClientRect() //方法返回元素的大小及其相对于视口的位置
Element.getBoundingClientRect().top
Element.getBoundingClientRect().left
Element.getBoundingClientRect().bottom
Element.getBoundingClientRect().right
兼容性 - IE是会多出来2像素 

相关文档 developer.mozilla.org/zh-CN/docs/…

Event事件模型

 <div id="app">
        <p id="dom"></p>
    </div>

    // 冒泡 - ms: p => div => body => HTML => document
    // 捕获 - ns: document => HTML => body => div => p

    el.addEventListener(event, function, useCapture) // 默认值false

    // 追问:
    // 1. 如何阻止时间的传播
    event.stopPropgation() 
    // 注意:阻止传递行为 => 无法阻止默认事件

    // 2. 阻止默认事件 - a  
    event.preventDefault()

    // 3. 相同节点绑定多个同类事件
    event.stopImmediatePropagation()

    引申型面试核心: 兼容性 & 性能
     4. 手写兼容性事件绑定
    实际上面试官就是要考我们IE - attachEvent vs addEventListener两者区别
    区别:
   a. 传参:attachEvent 对于事件名需要加上'on'
   b. 执行顺序:attachEvent - 后绑定先执行; addEventListener - 先绑定先执行
   c. 解绑:detachEvent vs removeEventListener
   d. 阻断:event.cancelBubble = true vs event.stopPropgation() 
   e. 默认事件拦截:event.returnValue = false vs event.preventDefault() 

按照上面的步骤,我们就来手写一下兼容性事件绑定

兼容性事件绑定

先写出我们整体的框架,然后再去补充里面的内容

class bindEvent{
    constructor(element){
        this.element = element;
    }
//绑定
addEventListener = (tyype,handler) =>{
    }
//解绑
removeEventListener = (type,handler) =>{
    }
//阻断
static stopPropgation(e) =>{}
//默认拦截
static preventDefault(e){}

} 

详细版本

 class bindEvent {
        constructor(element) {
            this.element = element;
        }
        // 绑定
        addEventListener = (type, handler) => {
            if(this.element.addEventListener) {
                this.element.addEventListener(type, handler, false)
            } else if(this.element.attachEvent) {
                this.element.attachEvent('on' + type, () => {
                    handler.call(element);
                })
            } else {
                this.element['on' + type] = handler;
            }
        }
        // 解绑
        removeEventListener = (type, handler) => {
            if(this.element.removeEventListener) {
                this.element.removeEventListener(type, handler, false)
            } else if(this.element.detachEvent) {
                this.element.detachEvent('on' + type, () => {
                    handler.call(element);
                })
            } else {
                this.element['on' + type] = null;
            }
        }
        // 阻断
        static stopPropgation(e) {
            if (e.stopPropagation) {
                e.stopPropagation()
            } else {
                e.cancelBubble = true;
            }
        }
        // 默认拦截
        static preventDefault(e) {
            if(e.preventDefault) {
                e.preventDefault()
            } else {
                e.returnValue = false;
            }
        }
    } 

性能优化部分 – 事件代理

 <ul class="list">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
    </ul> 
    <div class="content"></div> 

将以上代码进行事件绑定,我们先用for循环方法进行绑定

 var list = document.querySelector('.list');
    var li = list.getElementsByTagName('li');

    // 硬碰硬
    for(var n = 0; n < li.length; n++) {
        li[n].addEventListener('click', function() {
            // 业务逻辑
        })
    } 

这种方法的缺点在于,会对每一个dom节点进行监听,后期如果这些节点是动态添加的,那么性能的损耗就更大了

这时,我们可以采用事件代理的方式进行优化

//代理后,利用事件传递,优化的方向在于减少对DOM的操作和减少对事件的绑定

 function onClick(e) {
    //兼容
        var e = e || window.event;

        if(e.target.nodeName.toLowCase() === 'li') {
            // 业务逻辑
            var liList = this.querySelectorAll('li');
            // ……
        }
    }

    list.addEventListener('click', onClick, false)

addEventListener()方法第一个参数是事件的类型 (如 "click" 或 "mousedown").第二个参数是事件触发后调用的函数。第三个参数是个布尔值用于描述事件是冒泡还是捕获。该参数是可选的。 

addEventListener方法可参考这篇文章

网络层

如果你还不了解XMLHttpRequest,可以先看一下这篇文章

 // 实例化
    const xhr = new XMLHttpRequest();

    //初始化建立
    xhr.open(method, url, async) // get/post; 请求的地址; 是否为异步请求

    // 方法的发送请求 - send
    xhr.send(data) // get - 可以不传或传入null,post - encodeURIComponent编码拼接

    // 接收
    // xhr.readyStatus - 0 - 尚未建立open;1 - 已经调用open; 2 - 已经调用send; 3 - 已经收到请求返回; 4- 请求已经完成
    xhr.onreadystatuschange = () => {
        if(xhr.readyStatus === 4) {
            // 判断http状态码
            if(xhr.status >= 200 &&
                xhr.status < 300 ||
                xhr.status == 304) {
                    // xhr.responseText
            }
        }
    }

    // 超时时间
    xhr.timeout = 30000
    xhr.ontimeout = () => {
        // 超时后
    } 

面试方向

// 1、TCP => HTTP/HTTPs

// 2、状态码 => 2xx 4xx 5xx | 3xx => 浏览器缓存 => 强缓存(Expires + cache-control) / 协商缓存(last-modified + Etag)

常问的是3开头的状态码,面试常常会引申浏览器缓存,埋个坑,下次性能优化篇章我们详细讲

强缓存(Expires + cache-control)

协商缓存(last-modified + Etag)

关于两者的区别,可参考这篇文章

对于中高级的面试,我们就不仅仅是要了解上面的内容,往往还需要我们封装手写

封装手写

实现Ajax的封装方式

 ajax({
        url: 'reqUrl',
        method: 'get',
        async: true,
        timeout: 30000,
        data: {
            payload: 'text'
        }
    }).then(
        res => {}
        err => {}
    ).catch(err => {}) 

实现

options为我们上面代码传入的配置

 // 实现:      function ajax(options) {          const {              url,              method,              async,              data,              timeout          } = options;          const xhr = new XMLHttpRequest()          //  配置超时事件          if (timeout) {              xhr.timeout = timeout;          }          return new Promise((resolve, reject) => {              // 成功              xhr.onreadystatuschange = () => {                  if(xhr.readyStatus === 4) {                      // 判断http状态码                      if(xhr.status >= 200 &&                          xhr.status < 300 ||                          xhr.status == 304) {                              // 返回拦截器                              resolve(xhr.responseText)                      } else {                          reject()                      }                  }              }              // 失败              xhr.onerror = err => reject(err)              xhr.ontimeout = () => reject('timeout')              // 传参处理              let _params = []              let encodeData = ''              if (data instanceof Object) {                  for(let key in data) {                      // 参数编码                      _params.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))                  }                  encodeData = _params.join('&')              }              // method判断连接              if (method === 'get') {                  const index = url.indexOf('?')                  if(index === -1) {                      url += '?'                  } else if(index !== url.length -1) {                      url += '&'                  }                  url += encodeData              }              // 建立连接              xhr.open(method, url, async)              // 请求拦截器……              // 发送请求,区分get和post              if (method === 'get') {                  xhr.send(null)              } else {                  // post                  xhr.setRequestHeader(                      'content-type','application/x-www-form-urlencoded'                  )                  xhr.send(encodeData)              }          })      } 

面试点: content-type => 内容类型 => 浏览器 => 兼容firefox chrome

content-type会指向我们的内容类型,

如果后台没有指定content-type,firefox会默认指定为文本类型

而chrome会默认为文件类型,所以会出现一种情况就是你在下载的时候有时候在谷歌可以下载,在火狐下载不了的情况

感谢大家看到最后,也希望大家能够多多给出意见,互相学习互相进步

   xhr.setRequestHeader(                      'content-type','application/x-www-form-urlencoded'                  )                  xhr.send(encodeData)              }          })      } 

面试点: content-type => 内容类型 => 浏览器 => 兼容firefox chrome

content-type会指向我们的内容类型,

如果后台没有指定content-type,firefox会默认指定为文本类型

而chrome会默认为文件类型,所以会出现一种情况就是你在下载的时候有时候在谷歌可以下载,在火狐下载不了的情况

感谢大家看到最后,也希望大家能够多多给出意见,互相学习互相进步

手把手教你玩转服务器芯片架构--​​7.1 项目1:基于FPGA的RISC-V软核设计(Verilog实现核心指令执行单元)​ 本文介绍了基于FPGA的RISC-V软核设计实践项目。项目采用Verilog实现RV32I指令集核心处理器,包含指令解码、ALU、寄存器堆等关键模块设计,并通过功能仿真验证。在Xilinx Artix-7 FPGA上完成综合部署,资源利用率控制在5%以内。最后探讨了五级流水线优化、指令集扩展等进阶方案。该实践完整覆盖了从指令集设计、RTL实现到FPGA部署的全流程,可作为学习处理器架构FPGA开发的典型案例。 阅读详情

相关推荐

前端必读:浏览器内部工作原理.pdf

前端必读:浏览器内部工作原理.pdf前端必读:浏览器内部工作原理.pdf前端必读:浏览器内部工作原理.pdf前端必读:浏览器内部工作原理.pdf前端必读:浏览器内部工作原理.pdf

浏览器工作原理实践-个人梳理

虽然是比较早时间整理的,但还是可以对之前的浏览器有个比较清楚的理解。

claude-code源码

低调!!!claude-code源码

浏览器工作原理实践】专栏 40 篇学习笔记合集(完结)

说明 这些文章只是笔者学习记录的笔记,仅供参考。请支持正版的专栏。 目录 Chrome架构:仅仅打开了1个页面,为什么有4个进程? TCP协议:如何保证页面文件能被完整送达浏览器? HTTP 请求流程:为什么很多站点第二次打开速度会很快? 导航流程:从输入URL到页面展示,这中间发生了什么? 渲染流程:HTML、CSSJavaScript,是如何变成页面的? 变量提升:JavaScript代码是按顺序执行的吗? 调用栈:为什么JavaScript代码会出现栈溢出? 块级作用域:var缺陷以及为什么要引入

学习前端这门手艺,栈底到栈顶依次是:浏览器架构、Web 网络、事件循环机制、JavaScript 核心、V8 的内存管理、浏览器的渲染流程、Web 安全、CSS、React、Vue、Node、构建工具链等 3148

浏览器工作原理实践

浏览器工作原理实践》是极客时间上的一个浏览器学习系列,在学习之后特在此做记录总结。未激活的页面,setTimeout执行最小间隔是1000毫秒。为了协调这些任务有条不紊地在主线程上执行,页面进程引入了消息队列事件循环机制,渲染进程内部会维护多个消息队列,比如延迟执行队列普通的消息队列。把这些消息队列中的任务称为宏任务。

zhoumeina99的博客 757

浏览器工作原理实践

07 | 变量提升:JavaScript代码是按顺序执行的吗? 变量提升, 有个执行上下文的对象 定义函数存储在堆中 当函数被调用时, 会在变量对象中查找该函数 编译过程是非常复杂的, 包括词法分析, 语法分析, 代码优化, 代码生成等 下面代码会输出什么 function showName() { console.log('极客邦'); } showName();...

qq_44291044的博客 2773

前端必会--浏览器工作原理实践

线程分为单线程多线程线程是不能单独存在的,它是由进程来启动管理的。

faith_girl的博客 1487

浏览器工作原理实践笔记_Chapter2浏览器中的JavaScript执行机制

所谓的变量提升,是指在 JavaScript 代码执行过程中,JavaScript 引擎把变量的声明部分函数的声明部分提升到代码开头的“行为”。变量被提升后,会给变量设置默认值,这个默认值就是我们熟悉的 undefined。从概念的字面意义上来看,“变量提升”意味着变量函数的声明会在物理层面移动到代码的最前面,正如我们所模拟的那样。但,这并不准确。实际上变量函数声明在代码里的位置是不会改变的,而且是在编译阶段被 JavaScript 引擎放入内存中。也就是说,一段 JavaScript 代码在执行之前

菜鸡成长站 386

浏览器工作原理实践--HTTP/2:如何提升网络速度

好了,今天就介绍这里,下面我来总结下本文的主要内容。我们首先分析了影响HTTP/1.1效率的三个主要因素:TCP的慢启动、多条TCP连接竞争带宽队头阻塞。接下来我们分析了HTTP/2是如何采用多路复用机制来解决这些问题的。多路复用是通过在协议栈中添加二进制分帧层来实现的,有了二进制分帧层还能够实现请求的优先级、服务器推送、头部压缩等特性,从而大大提升了文件传输效率。HTTP/2协议规范于2015年5月正式发布,在那之后,该协议已在互联网万维网上得到了广泛的实现部署。

echohuangshihuxue的博客 1726

【极客时间】浏览器工作原理实践-2 宏观视角下的浏览器- 2.1 Chrome架构:仅仅打开了1个页面,为什么有4个进程?

计算机中的并行处理就是同一时刻处理多个任务。正常情况下程序可以使用单线程来处理,也就是分四步按照顺序分别执行这四个任务。如果采用多线程,会怎么样呢?我们只需分“两步走”:第一步,使用三个线程同时执行前三个任务;第二步,再执行第四个显示任务。通过对比分析,你会发现用单线程执行需要四步,而使用多线程只需要两步。因此,使用并行处理能大大提升性能。进程中的任意一线程执行出错,都会导致整个进程的崩溃。线程之间共享进程中的数据。当一个进程关闭之后,操作系统会回收进程所占用的内存。

qq_37581764的博客 1264

【极客时间】浏览器工作原理实践-2 宏观视角下的浏览器-2.2 TCP协议:如何保证页面文件能被完整送达浏览器

互联网中的数据是通过数据包来传输的,数据包在传输过程中容易丢失或出错。IP 负责把数据包送达目的主机。UDP 负责把数据包送达具体应用。而 TCP 保证了数据完整地传输,它的连接可分为三个阶段:建立连接、传输数据断开连接。其实了解 TCP 协议,是为了全方位了解 HTTP,包括其实际功能局限性,之后才会更加深刻地理解为什么要推出 HTTP/2,以及为什么要推出 QUIC 协议,也就是未来的 HTTP/3。

qq_37581764的博客 983

【极客时间】浏览器工作原理实践-2 宏观视角下的浏览器 (6讲) - 2.4 导航流程:从输入URL到页面展示,这中间发生了什么?

服务器可以根据响应头来控制浏览器的行为,如跳转、网络数据类型判断。Chrome 默认采用每个标签对应一个渲染进程,但是如果两个页面属于同一站点,那这两个标签会使用同一个渲染进程。浏览器的导航过程涵盖了从用户发起请求到提交文档给渲染进程的中间所有阶段。导航流程很重要,它是网络加载流程渲染流程之间的一座桥梁,如果你理解了导航流程,那么你就能完整串起来整个页面显示流程,这对于你理解浏览器工作原理起到了点睛的作用。

qq_37581764的博客 1050

【极客时间】浏览器工作原理实践-2 宏观视角下的浏览器 (6讲) - 2.6 渲染流程(下):HTML、CSSJavaScript,是如何变成页面的?

好了,我们现在已经分析完了整个渲染流程,从 HTML 到 DOM、样式计算、布局、图层、绘制、光栅化、合成显示。下面我用一张图来总结下这整个渲染流程:渲染进程将 HTML 内容转换为能够读懂的 DOM 树结构。渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets,计算出 DOM 节点的样式。创建布局树,并计算元素的布局信息。对布局树进行分层,并生成分层树。为每个图层生成绘制列表,并将其提交到合成线程。合成线程将图层分成图块,并在光栅化线程池中将图块转换成位图。

qq_37581764的博客 918

【极客时间】浏览器工作原理实践-2 宏观视角下的浏览器 (6讲) - 2.5 渲染流程(上):HTML、CSSJavaScript,是如何变成页面的?

DOM 生成、样式计算布局。浏览器不能直接理解 HTML 数据,所以第一步需要将其转换为浏览器能够理解的 DOM 树结构;生成 DOM 树后,还需要根据 CSS 样式表,来计算出 DOM 树所有节点的样式;最后计算 DOM 元素的布局信息,使其都保存在布局树中。到这里我们的每个节点都拥有了自己的样式布局信息,那么后面几个阶段就要利用这些信息去展示页面了,由于篇幅限制,剩下的这些阶段我会在下一篇文章中介绍。

qq_37581764的博客 1461

【极客时间】浏览器工作原理实践-2 宏观视角下的浏览器 (6讲) - 2.3 HTTP请求流程:为什么很多站点第二次打开速度会很快?

HTTP 请求示意图:从图中可以看到,浏览器中的 HTTP 请求从发起到结束一共经历了如下八个阶段:构建请求、查找缓存、准备 IP 端口、等待 TCP 队列、建立 TCP 连接、发起 HTTP 请求、服务器处理请求、服务器返回请求断开连接。然后我还通过 HTTP 请求路径解答了两个经常会碰到的问题,一个涉及到了 Cache 流程,另外一个涉及到如何使用 Cookie 来进行状态管理。

qq_37581764的博客 877

【极客时间】浏览器工作原理实践-3 浏览器中的JavaScript执行机制 (5讲) - 3.2 调用栈:为什么JavaScript代码会出现栈溢出?

函数调用就是运行一个函数,具体使用方式是使用函数名称跟着一对小括号。var a = 2var b = 10return a+badd()这段代码很简单,先是创建了一个 add 函数,接着在代码的最下面又调用了该函数。那么下面我们就利用这段简单的代码来解释下函数调用的过程。在执行到函数 add() 之前,JavaScript 引擎会为上面这段代码创建全局执行上下文,包含了声明的函数变量,你可以参考下图:从图中可以看出,代码中全局变量函数都保存在全局上下文的变量环境中。

qq_37581764的博客 791

浏览器原理系列10篇正式完结

全目录 前置知识-进程线程 浏览器架构-原理篇 浏览器架构-实践篇 问题-概况篇 浏览器内核-流程概况 解析-理论剖析 解析-解析器 解析-HTML解析器 渲染树-理论剖析 渲染树-布局绘制 参考文献 结语 整个浏览器原理系列文章正式完结了。因非科班出身,所以增加了对应的前置知识。整体的文章的思路还是不断的去问自己为什么,从而激发自己更有兴趣继续去思考下 这系列文章,只是用自己的语言重述了...

weixin_34198583的博客 210

浏览器工作原理实践学习(一)

开篇词 一、以后发展 1、脚本执行速度问题 WebAssembly + javascript 2前端模块化开发 vue react 3、渲染效率问题 chrome 新布局方案[layoutNG](看了一下没咋看懂,感觉写起来有点麻烦)(https://zhuanlan.zhihu.com/p/37847490) 渲染搜身方案slim paint 宏观视角下的浏览器 一、打开一个chrome页面 4个进程 线程 进程 线程:线程是不能单独存在的,它

bluefish_flying的博客 1639

chorme浏览器(内容来自极客李兵老师的浏览器工作原理实践

1.Chrome打开一个页面需要启动多少个进程? 一共是4个, 1.浏览器主进程 2.GPU进程 3.实用程序 【Network Service】【Storage Service】 4.标签页 2.线程进程 一个进程就是一个程序的运行实例 详细解释就是,启动一个程序的时候,操作系统会该程序创建一块内存,用来存放代码、运行时的数据一个执行任务的主线程,我们把这样的一个运行环境叫进程 线程是不能单独存在的,他是由进程来启动管理的 线程是依附于进程的,而进程中使用多线程并行处理能提升运算效率。 3.进程线

syt_1013的博客 1257

肝完《浏览器基本原理实践》的精华分享

文末有福利前言作为一名前端er,日常工作打交道最多(之一)的莫过于熟悉而又陌生的浏览器了,熟悉是每天都会基于浏览器的应用层面之上码业务,陌生是很多人可能跟我一样不熟悉其内部运行原理,比如j...

前端开发博客 3573
下一篇: 一行简单的样式,让网页有「高级感」
web老猴子
博客等级 码龄4年 160粉丝 · 359原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值