从点击到显示:浏览器如何在几秒内呈现网页

182 阅读8分钟

前言

浏览器底层原理是前端大佬必须掌握的核心知识之一,本文旨在探讨从在浏览器地址栏输入URL到页面完全加载显示的过程中,浏览器内部究竟发生了什么,笔者将深入解析浏览器的工作机制及js相关的一些基础概念以便帮助读者理解现代web应用的运作方式。

云操作系统与Web程序

云操作系统(Cloud OS)是一种将传统操作系统功能与云计算服务相结合的新形态操作系统。它允许用户通过轻量级硬件设备,借助互联网连接至云端服务器来执行计算任务和存储数据。所有数据、应用程序及设置均保存于远程服务器中,而非本地设备,这不仅减轻了终端设备的负担,还促进了Web应用程序的发展。例如,Chrome作为一款先进的浏览器,它能够充当云操作系统的前端界面,利用HTTP(S)协议与后端云服务无缝对接。对于阿里云等云服务商而言,提供IP服务、服务器虚拟化(如Docker容器技术)等配置,为用户提供了灵活高效的计算资源,支持开发人员构建响应迅速的应用程序。

为什么是Chrome成为主流浏览器

Chrome之所以能成为最受欢迎的浏览器之一,与其背后的强大技术支持密不可分。自2008年发布以来,Chrome凭借其卓越的技术迅速超越了Internet Explorer(IE),并在全球范围内占据了领先地位,成为当之无愧的世界NO.1。实际上,国内的许多浏览器不过是chrome套了一层壳。在笔者看来,他之所以能全球领先主要有以下几点优势:

技术优势

性能优化:Chrome浏览器使用了V8 引擎和渲染引擎,v8 引擎可以快速解析并执行JS代码,从而提高了网页加载速度,渲染引擎主要负责从 HTML、CSS 和 JavaScript 文件中提取信息,并将其转化为用户可以在屏幕上看到的内容。

多进程架构:为了提高稳定性和安全性,Chrome采用了多进程架构。每个标签页都有自己的渲染进程,这意味着即使一个页面崩溃也不会影响其他页面。此外,还有专门负责GPU加速绘图、插件管理和核心浏览器功能的进程。

安全特性:Chrome实现了沙箱技术,确保各个进程之间相互隔离,减少恶意软件对系统的威胁。同时,自动更新机制保证了用户始终使用最新版本的安全补丁。

开发者工具:对于Web开发者而言,Chrome提供了强大的开发者工具套件,支持调试、性能分析等功能,有助于提升开发效率。以前由于要考虑IE和非IE的问题,前端开发者往往要担心代码兼容性的问题,而chrome却很好的解决了这一问题。

开源项目Chromium:Chrome是基于开源项目Chromium构建的,这使得第三方厂商可以根据自身需求定制浏览器,促进了生态系统的繁荣。

用户体验

  • 简洁易用:Chrome拥有直观简洁的UI设计,减少了用户的学习成本。

  • 同步功能:借助Google账号,用户可以在不同设备间轻松同步书签、历史记录、扩展程序等信息。

  • 广泛的兼容性:无论是Windows、macOS还是Linux,Chrome都能很好地适配各种操作系统,且支持大量的网站和服务。

内核演进

早期的Chrome采用WebKit作为其渲染引擎,但后来谷歌决定对WebKit进行分支处理,创建了自己的Blink引擎。这不仅解决了代码兼容性问题,还提升了浏览器的安全性和效率。V8 引擎则是Chrome用来解释和执行js的关键组件,它优化了JS代码的编译和执行速度,极大地改善了用户体验。

浏览器架构

在讲架构之前我们先来理解两个概念,进程和线程。

进程和线程

进程:是操作系统分配资源的最小单位

线程: 是CPU调度的最小单位

简单来说,进程可以理解为正在执行的应用程序,而线程是CPU调度和分派的基本单位。当启动了浏览器,就相当于计算机启动了一个进程,进程启动后,CPU会给该进程分配相应的内存空间,在进程得到了内存之后,就可以使用线程进行资源调度,从而完成相应的功能。

image.png

单线程和多线程

聊了这么多,下面让我们来通过一段伪代码来谈谈单线程和多线程(顺带提一下,js是单线程的,这使得它可以避免许多可能出现的复杂问题如死锁):

A = 1+2
B = 20/5
c = 7*8
console.log(A,B,c);
c612b5dcbb2919e69611a5d69323971c.png

如图所示,进程A是单线程的,所有任务按顺序执行,这意味着只有任务1完成后才能执行任务2,以此往下类推,而进程B则是多进程的,每个任务由不同的线程执行,而这就说明任务1、2、3和任务4是可以并行执行的。它们的优缺点主要如下:

  • 单线程的优点主要是简单、易于理解和调试,缺点主要是效率太低。

  • 多线程优点则是它可以充分利用多核处理器的性能来提高效率,缺点是复杂性增加,需要处理线程同步和通信问题

02cdcd7e80a5925b0d2ca1aec52a9d75.png

多进程架构

当我们去开发一个浏览器时,它的架构可以是一个单进程多线程的应用程序,也可以是一个使用IPC通信的多进程应用程序。一般来讲,不同的浏览器使用不同的架构,本文以chrome为例,介绍一下浏览器的多进程架构。

进程间通信(IPC):

为了使这些独立的进程能够协同工作,Chrome实现了进程间通信机制(IPC)。IPC允许不同进程之间交换数据而不必直接访问对方的内存空间,从而保持了良好的隔离性和安全性。

chrome主要进程

在chrome中,主要的进程有以下4个:

  • 浏览器主进程:

    管理用户界面、处理交互事件(如点击和滚动),并协调子进程间的通信。它还负责存储功能,如管理cookie、localStorage和IndexedDB,确保数据的安全性和隐私保护。

  • 渲染进程:

    每个标签页都有一个独立的渲染进程,负责网页内容的布局与绘制,使用Webkit/Blink引擎解析HTML和CSS。这些进程运行在沙箱环境中,确保即使某个页面崩溃也不会影响其他页面或浏览器的整体稳定性,并通过V8引擎执行JavaScript代码,支持异步操作以提高响应速度。

  • 插件进程: 为第三方插件(如Flash或Chrome扩展)提供安全隔离环境,防止它们直接访问系统资源或其它浏览器进程。这有助于减少插件导致的安全风险和性能问题,同时保持浏览器的稳定运行。

  • GPU进程:

    专门处理图形加速任务,例如3D变换(如translate3D)、视频解码和其他复杂的视觉效果。通过利用显卡的强大计算能力,GPU进程可以显著提升网页和应用的渲染效率和视觉质量,同时减轻CPU的工作负担 Chrome采用了多进程架构来提高稳定性和安全性。每个标签页都运行在一个独立的渲染进程中,即使一个页面崩溃也不会影响其他页面。此外,还有专门负责GPU加速绘图、插件管理和浏览器核心功能(如UI渲染、网络请求)的进程。这种设计确保了即使某个组件出现问题,整个浏览器也不会崩溃。

页面加载流程

最后我们一起来看看页面的加载流程,当用户在地址栏中输入一个URL时,会发生如下所示一系列事件:

DNS解析:浏览器首先需要确定目标服务器的IP地址。

TCP连接:建立与服务器之间的TCP连接。

发送HTTP请求:向服务器发出获取资源的请求。

接收响应:服务器返回HTML文档以及其他资源(如CSS、JavaScript文件)。

解析HTML:构建DOM树。

加载外部资源:下载并解析CSS、JS等资源。

构建渲染树:结合样式信息生成可视化的渲染结构。

布局和绘制:计算元素位置大小并绘制到屏幕上。

交互准备:设置事件监听器等,准备用户交互。

c224676594aae6804009e3fe521b122.jpg