小结: js 在浏览器执行原理

news2025/5/17 2:07:41

浏览器多进程与多线程

现代浏览器的标签环境隔离主要通过多进程架构多线程机制实现,以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析:

在这里插入图片描述

+-------------------+       +-------------------+       +-------------------+
| 浏览器主进程        |       | 渲染进程(标签页) |       | GPU进程            |
| - UI管理           |◄----► | - 主线程          |◄----► | - 图形渲染加速     |
| - 网络管理         |       |   (JS执行/渲染)   |       | - 图层合成         |
| - 存储管理         |       | - 合成线程 ▲      |       +-------------------+
+-------------------+       | - 网络线程 ▲      |               ▲
        ▲                    | - 定时器线程 ▲    |               |
        | IPC协议            | - 事件触发线程 ▲  |               | 提交图层数据
        ▼                    +-------------------+               |
+-------------------+               |  ▲                        |
| 插件进程(可选)    |               |  |                        |
| - 第三方插件运行    |               |  | 事件回调/资源响应       |
+-------------------+               ▼  |                        |
                                +-------------------+           |
                                | 任务队列          |◄—定时器线程/网络线程/事件线程
                                | - 宏任务队列       |           |
                                | - 微任务队列       |◄—Promise/MutationObserver
                                +-------------------+
层级技术实现隔离目标
进程级多进程架构 + IPC崩溃隔离、系统权限控制
沙箱级操作系统限制 + Mojo接口代理系统资源访问隔离
站点级Site Isolation + 同源策略跨站脚本攻击防御
渲染级独立合成层 + GPU多队列视觉/性能干扰隔离

1. 多进程架构

浏览器的多进程架构将不同功能模块分配到独立进程中,典型进程包括:

  • 浏览器进程(Browser Process)
    • 负责管理用户界面(地址栏、书签、历史记录等)、网络请求、文件访问等全局功能。
    • 协调其他进程的通信和资源分配。
    • 通常是单进程,运行主线程和若干辅助线程。
  • 渲染进程(Renderer Process)
    • **每个标签页(或一组相关标签页)通常对应

一个独立的渲染进程

,负责解析 HTML、CSS、执行 JavaScript、渲染页面等。**

  • 站点隔离(Site Isolation):现代浏览器(如 Chrome)为不同域名(如 example.com 和 sub.example.com)的页面分配不同渲染进程,进一步增强安全性,防止跨站脚本攻击(XSS)或数据泄露。
  • 每个渲染进程运行在沙箱环境中,限制其对系统资源的直接访问。
  • GPU 进程(GPU Process)
    • 负责处理图形渲染任务,利用 GPU 加速绘制页面内容(如 CSS 动画、WebGL)。
    • 所有渲染进程共享此进程,避免重复初始化 GPU 资源。
  • 网络进程(Network Process)
    • 处理所有网络请求(如 HTTP、WebSocket),确保网络操作集中管理和优化。
    • 隔离网络操作,防止渲染进程直接访问网络,提升安全性。
  • 插件进程(Plugin Process)
    • 运行 Flash 或其他浏览器插件(现已逐渐淘汰)。
    • 隔离插件运行环境,防止插件崩溃影响整个浏览器。
  • 扩展进程(Extension Process)
    • 运行浏览器扩展,隔离扩展逻辑,防止恶意扩展干扰页面或浏览器。

多进程的优势

  • 安全性:进程间通过沙箱隔离,单个标签页崩溃或被攻击不会影响其他标签或浏览器。
  • 稳定性:一个渲染进程崩溃不会导致整个浏览器崩溃。
  • 性能:不同进程可并行运行,充分利用多核 CPU。

多进程的挑战

  • 资源占用:每个进程需要独立内存,多个标签页可能导致高内存消耗。
  • 进程间通信(IPC)开销:进程间通过 IPC(如 Mojo 在 Chrome 中)通信,增加复杂性和延迟。

2. 多线程机制

每个进程内部通常包含多个线程,以处理特定任务。以下以渲染进程为例,说明线程的角色和交互:

渲染进程的主要线程

  • 主线程(Main Thread)
    • 负责解析 HTML/CSS、构建 DOM 和渲染树、执行 JavaScript(通过 V8 引擎)、处理用户交互事件(如点击、滚动)。
    • 运行事件循环(Event Loop),按顺序处理任务队列中的任务。
    • 所有 DOM 操作和同步 JavaScript 代码都在主线程执行,因此主线程阻塞(如长时间运行的 JavaScript)会导致页面卡顿。
  • 合成线程(Compositor Thread)
    • 负责将渲染好的图层(Layers)合成最终画面,交给 GPU 进程绘制。
    • 处理高效的滚动和动画(如 CSS transform),避免主线程参与。
    • 与主线程异步工作,提升页面响应性。
  • 工作线程(Worker Threads)
    • 运行 Web Worker 或 Service Worker,处理后台任务(如复杂计算、数据处理)。
    • 隔离 JavaScript 执行环境,无法直接访问 DOM,通过消息传递(postMessage)与主线程通信。
  • 光栅化线程(Raster Thread)
    • 将渲染树转换为位图(光栅化),通常在渲染进程或 GPU 进程中执行。
    • 优化图形渲染性能。
  • I/O 线程
    • 处理异步 I/O 操作,如网络请求的回调、文件读写。
    • 避免阻塞主线程。

线程间交互

  • 主线程与合成线程
    • 主线程生成渲染树和图层树后,将绘制任务交给合成线程。
    • 合成线程独立处理平滑滚动和简单动画,减少主线程负担。
    • 通过共享内存或消息队列(如 Chrome 的 cc 层)通信。
  • 主线程与工作线程
    • 主线程通过 postMessage API 向 Worker 发送任务,Worker 完成计算后返回结果。
    • Worker 线程无法直接操作 DOM,需通过主线程代理。
  • 主线程与 I/O 线程
    • I/O 线程处理网络响应后,通过事件循环将结果传递给主线程(如 fetch API 的回调)。

3. 标签环境隔离的实现

标签环境的隔离主要依赖以下机制:

  • 进程级隔离
    • 每个标签页(或站点)的渲染进程独立运行,内存空间和权限分离。
    • Chrome 的站点隔离策略确保不同源(origin)的页面运行在不同进程,即使在同一标签组内。
  • 沙箱机制
    • 渲染进程运行在沙箱中,限制对文件系统、网络、设备的直接访问。
    • 沙箱通过操作系统提供的安全机制(如 Linux 的 seccomp、Windows 的 AppContainer)实现。
  • 跨进程通信(IPC)
    • 渲染进程通过 IPC 与浏览器进程通信,请求网络资源、访问剪贴板或触发 UI 更新。
    • IPC 基于消息传递(如 Chrome 的 Mojo),确保高效且安全。
  • 线程级隔离
    • 每个渲染进程内的线程分工明确,主线程专注于 UI 和 JavaScript 执行,其他线程处理后台任务。
    • Web Worker 和 Service Worker 提供线程级隔离,运行独立脚本环境。

4. 交互架构的工作流程

以下是一个典型的用户交互流程,展示多进程和多线程的协作:

  1. 用户输入 URL
    • 浏览器进程的主线程解析 URL,发起网络请求(交给网络进程)。
  2. 网络进程返回数据
    • 网络进程通过 IPC 将 HTML 数据传回浏览器进程,浏览器进程分配一个渲染进程。
  3. 渲染进程解析与渲染
    • 渲染进程的主线程解析 HTML/CSS,构建 DOM 和渲染树,执行 JavaScript。
    • 光栅化线程将渲染树转为位图,合成线程生成最终图层。
  4. 绘制到屏幕
    • 合成线程将图层数据发送到 GPU 进程,GPU 进程完成硬件加速绘制。
  5. 用户交互(如点击)
    • 主线程处理点击事件,执行相关 JavaScript。
    • 如果涉及动画,合成线程接管高效绘制。
  6. 后台任务
    • Web Worker 处理复杂计算,Service Worker 缓存资源或处理离线逻辑。

5. 典型浏览器的实现

  • Google Chrome
    • 采用严格的多进程架构,每个标签页默认一个渲染进程(可通过站点隔离细化为每站点一个进程)。
    • 使用 Mojo 进行高效 IPC,Blink 引擎负责渲染。
    • 合成线程和光栅化线程优化动画和滚动性能。
  • Mozilla Firefox
    • 通过 **Electrolysis(E10S)**项目实现多进程架构,但渲染进程数量较 Chrome 更少(默认 4-8 个)。
    • 使用 WebRender 优化渲染性能,Servo 引擎逐步集成。
  • Safari(WebKit)
    • 采用多进程架构,但渲染进程共享更多资源(如 JavaScript 引擎)。
    • WebKit 引擎强调低功耗,适合移动设备。

6. 优化与未来趋势

  • 内存优化
    • 浏览器通过进程合并(将低活跃标签页合并到同一进程)或内存压缩减少占用。
    • Chrome 的 Tab Discarding 机制卸载后台标签页内存。
  • 性能优化
    • 异步渲染(如 OffscreenCanvas)将更多任务从主线程卸载。
    • WebAssembly 和 GPU 加速提升复杂应用的性能。
  • 安全增强
    • 更严格的站点隔离和沙箱策略。
    • 限制第三方 Cookie 和跨站跟踪,强化隐私保护。
  • WebGPU 和低级 API
    • 未来浏览器将支持更底层的图形和计算 API(如 WebGPU),需要更复杂的进程和线程协作。

网页的生命周期状态转换

在这里插入图片描述

主要由用户操作、系统事件和浏览器行为驱动。以下是常见的生命周期状态、转换流程以及可捕获的事件,简要概述:**

1. 网页生命周期状态

网页生命周期通常包括以下状态(基于HTML标准和浏览器行为):

  • 加载中 (Loading):页面开始加载,资源(如HTML、CSS、JS)正在获取和解析。
  • 交互 (Interactive):DOM已构建完成,可交互,但部分资源(如图片、异步脚本)可能仍在加载。
  • 完成 (Complete):所有资源加载完成,页面完全渲染。
  • 隐藏 (Hidden):页面不可见(如切换标签页或最小化浏览器)。
  • 终止 (Terminated):页面被销毁(如关闭标签页或刷新)。

2. 状态转换流程及触发条件

以下是状态之间的转换逻辑及触发条件:

  • 初始 → 加载中
    • 触发:用户输入URL、点击链接或刷新页面,浏览器发起导航请求。
    • 事件beforeunload(前页面卸载)、DOMContentLoaded(DOM解析开始)。
  • 加载中 → 交互
    • 触发:HTML解析完成,DOM树构建完成,主文档进入可交互状态。
    • 事件DOMContentLoaded(DOM完全可用)。
  • 交互 → 完成
    • 触发:所有子资源(图片、脚本、样式等)加载完成,页面完全渲染。
    • 事件load(窗口和所有资源加载完成)。
  • 完成 → 隐藏
    • 触发:用户切换标签页、最小化窗口或设备进入休眠。
    • 事件visibilitychange(页面可见性变化,结合document.hidden)。
  • 任何状态 → 终止
    • 触发:用户关闭标签页、刷新页面或导航到新页面。
    • 事件unload(页面卸载)、beforeunload(可提示用户确认离开)。
  • 隐藏 → 完成
    • 触发:用户返回页面(如切换回标签页)。
    • 事件visibilitychangefocus

3. 可捕获的事件

以下是与生命周期相关的主要事件,开发者可通过JavaScript监听:

  • 导航与加载
    • beforeunload:页面即将卸载,可提示用户确认。
    • DOMContentLoaded:DOM解析完成,脚本可操作DOM。
    • load:所有资源加载完成。
  • 可见性与焦点
    • visibilitychange:页面可见性变化,检查document.visibilityStatevisiblehidden)。
    • focus / blur:窗口或元素获取/失去焦点。
  • 卸载与终止
    • unload:页面卸载,清理资源(不推荐过多依赖,因执行不保证)。
  • 用户交互
    • click, keydown, input等:用户操作触发,影响页面动态状态。
  • 网络与资源
    • error:资源加载失败。
    • abort:资源加载被中止。

4. 附加说明

  • 用户操作:如点击链接、表单提交、刷新等,直接影响导航和状态转换。
  • 系统事件:如网络断开(online/offline事件)、电池状态变化(batterystatus),可能触发页面行为调整。
  • 浏览器行为:如缓存(Service Worker)、预加载、懒加载等,影响资源加载顺序和生命周期效率。
  • 性能监控:使用Performance API(如performance.timing)捕获详细的加载时间点,便于优化。

5. 开发者注意事项

  • 事件监听:优先使用addEventListener绑定事件,确保兼容性和性能。
  • 状态管理:通过document.readyStateloadinginteractivecomplete)实时检查页面状态。
  • 兼容性:不同浏览器对unload等事件的支持可能不一致,需测试。
  • 优化:避免在unload中执行复杂逻辑,利用requestIdleCallback处理低优先级任务。
// 1. beforeunload - 页面卸载前提示用户确认
window.addEventListener('beforeunload', (event) => {
  // 提示用户是否离开(某些浏览器可能忽略自定义消息)
  event.preventDefault();
  event.returnValue = ''; // 触发默认提示
  // 自定义提示(部分浏览器不支持)
  return '您有未保存的更改,确定要离开吗?';
});

// 2. DOMContentLoaded - DOM 解析完成
document.addEventListener('DOMContentLoaded', () => {
  console.log('DOM 完全加载并解析完成!');
  // 示例:初始化 DOM 元素
  const button = document.querySelector('#myButton');
  if (button) {
    button.addEventListener('click', () => alert('按钮被点击!'));
  }
});

// 3. load - 所有资源加载完成
window.addEventListener('load', () => {
  console.log('页面及所有资源(如图片、CSS)已加载完成!');
  // 示例:隐藏加载动画
  const loader = document.querySelector('.loader');
  if (loader) {
    loader.style.display = 'none';
  }
});

// 4. visibilitychange - 页面可见性变化
document.addEventListener('visibilitychange', () => {
  if (document.visibilityState === 'visible') {
    console.log('页面可见,恢复活动(如动画、轮询)');
    // 示例:恢复视频播放
    const video = document.querySelector('video');
    if (video) video.play();
  } else {
    console.log('页面隐藏,暂停活动以节省资源');
    // 示例:暂停视频播放
    const video = document.querySelector('video');
    if (video) video.pause();
  }
});

// 5. unload - 页面卸载
window.addEventListener('unload', () => {
  console.log('页面正在卸载,清理资源');
  // 注意:现代浏览器可能限制unload中的复杂逻辑
  // 示例:发送分析数据(需快速执行)
  navigator.sendBeacon('/analytics', JSON.stringify({ event: 'page_unload' }));
});

// 6. focus / blur - 窗口焦点变化
window.addEventListener('focus', () => {
  console.log('窗口获得焦点');
  // 示例:更新页面标题
  document.title = '欢迎回来!';
});

window.addEventListener('blur', () => {
  console.log('窗口失去焦点');
  // 示例:暂停计时器
  clearInterval(someTimer); // 假设 someTimer 是全局定时器
});

// 7. error - 捕获资源加载错误
window.addEventListener('error', (event) => {
  console.error('资源加载错误:', event.message, event.filename);
  // 示例:记录错误到服务器
  fetch('/log-error', {
    method: 'POST',
    body: JSON.stringify({ error: event.message, file: event.filename }),
  });
}, true); // 使用捕获阶段

// 8. online / offline - 网络状态变化
window.addEventListener('online', () => {
  console.log('网络已连接');
  // 示例:恢复离线时暂停的请求
  retryPendingRequests();
});

window.addEventListener('offline', () => {
  console.log('网络断开');
  // 示例:显示离线提示
  const offlineMessage = document.querySelector('#offlineMessage');
  if (offlineMessage) {
    offlineMessage.style.display = 'block';
  }
});

浏览器渲染流程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1. DOM(文档对象模型)

  • HTML Parser:解析HTML源代码,将其转换为DOM Tree(文档对象树)。
  • Content Sink:接收解析后的内容,构建DOM节点。

2. CSS 处理

  • CSS Parser:解析CSS样式表和内联样式,生成CSSOM(CSS对象模型)。
  • Style Rules:存储CSS规则,用于后续样式计算。

3. 构建渲染树(Content Model)

  • 结合DOM和CSSOM,生成渲染树(Render Tree),仅包含需要显示的节点(如忽略display: none的元素)。

4. 布局(Reflow)

  • Frame Constructor:为渲染树中的每个节点创建布局框架(Frame)
  • Frame Tree:计算每个节点的几何信息(位置、大小等),这一过程称为**回流(Reflow)**或布局。

5. 绘制(Painting)

  • 将布局后的节点转换为屏幕上的实际像素,生成绘制指令(如填充颜色、绘制边框等)。

6. 显示(Display)

  • 最终将绘制结果合成并显示到屏幕上(可能涉及图层合成、GPU加速等)。

js脚本解析 the-script-element

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【实战篇】低代码报表开发——平台运营日报表的开发实录

前言 myBuilder的推广有段时间了,想开发个报表看看平台运营的情况。采用myBuilder强大的报表、数据交换模块功能,直接开干。 1. 报表指标思考与概要设计 首先是报表模块的概要设计,先构思一下,我希望报表能查看新用户注册、活跃…

使用Qt操作SQLite数据库

目录 一、开发成果二、环境配置与基础概念1. 引入SQL模块2. SQLite数据库特性三、数据库连接与操作流程1. 创建并连接数据库2. 执行SQL语句3. 查询与遍历数据四、进阶操作与最佳实践1. 事务处理2. 错误处理3. 使用模型/视图架构五、完整代码示例(学生人员管理)1.mainwindow.h…

ZYNQ笔记(二十):Clocking Wizard 动态配置

版本:Vivado2020.2(Vitis) 任务:ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…

探秘高可用负载均衡集群:企业网络架构的稳固基石

目录 高可用负载均衡集群 一、集群的本质与核心价值​ 二、高可用集群与负载均衡集群的定义​ 高可用集群(HA Cluster)​ 负载均衡集群(Load Balance Cluster)​ 三.高可用与负载均衡的完美融合 四.…

JAVA:ResponseBodyEmitter 实现异步流式推送的技术指南

1、简述 在许多场景下,我们希望后端能够以流式、实时的方式推送数据给前端,比如消息通知、日志实时展示、进度条更新等。Spring Boot 提供了 ResponseBodyEmitter 机制,可以让我们在 Controller 中异步地推送数据,从而实现实时流式输出。 样例代码:https://gitee.com/lh…

CSS- 1.1 css选择器

本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 HTML系列文章 已经收录在前端专栏,有需要的宝宝们可以点击前端专栏查看! 系…

ABP-Book Store Application中文讲解 - Part 2: The Book List Page

本章用于介绍如何创建Book List Page。 TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 1: Creating the Server Side 项目之间的引用关系。 目录 1. 多语言配置 1.1 zh-Hans.json 1.2 en.jso…

08 web 自动化之 PO 设计模式详解

文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构?1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…

langchain4j集成QWen、Redis聊天记忆持久化

langchain4j实现聊天记忆默认是基于进程内存的方式,InMemoryChatMemoryStore是具体的实现了,是将聊天记录到一个map中,如果用户大的话,会造成内存溢出以及数据安全问题。位了解决这个问题 langchain4提供了ChatMemoryStore接口&am…

WebGL图形编程实战【7】:变换流水线 × 坐标系与矩阵精讲

变换流水线 #mermaid-svg-Omabd9LSNCdIvWqB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Omabd9LSNCdIvWqB .error-icon{fill:#552222;}#mermaid-svg-Omabd9LSNCdIvWqB .error-text{fill:#552222;stroke:#552222;…

DVWA靶场通关笔记-SQL注入(SQL Injection Medium级别)

目录 一、SQL Injection 二、代码审计(Medium级别) 1、源码分析 (1)index.php (2)Medium.php 2、渗透思路 (1)SQL安全问题分析 (2)SQL渗透思路 三、…

vue异步导入

vue的异步导入 大家开发vue的时候或多或少路由的异步导入 component: () >import(“/views/A_centerControl/intelligent-control/access-user-group”),当然这是路由页面,那么组件也是可以异步导入的 使用方式 组件的异步导入非常简单,主要是一个…

2025年,如何制作并部署一个完整的个人博客网站

欢迎访问我的个人博客网站:欢迎来到Turnin的个人博客 github开源地址:https://github.com/Re-restart/my_website 前言 2024年年初,从dji实习回来之后,我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java,…

腾讯云运营开发 golang一面

redis为什么单线程会快 每秒10w吞吐量 io多路复用 一个文件描述符整体拷贝;调用epoll_ctl 单个传递 内核遍历文件描述符判断是否有事件发送;回调函数列表维护 修改有事件发送的socket为可读或可写,返回整个文件描述符;返回链…

一个简单的静态页面

这个页面采用了现代化的 UI 设计&#xff0c;包括卡片式布局、微交互动画、分层设计和响应式结构。页面结构清晰&#xff0c;包含导航栏、英雄区域、功能介绍、产品特性、用户评价和联系表单等完整组件&#xff0c;可作为企业官网或产品介绍页面的基础模板。 登录后复制 <!D…

使用 163 邮箱实现 Spring Boot 邮箱验证码登录

使用 163 邮箱实现 Spring Boot 邮箱验证码登录 本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器&#xff0c;实现 Spring Boot 项目中的邮件验证码发送功能&#xff0c;并解决常见配置报错问题。 一、为什么需要邮箱授权码&#xff1f; 出于安全考虑&#xff0c;大…

多模态大语言模型arxiv论文略读(六十八)

Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文标题&#xff1a;Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文作者&#xff1a;Qiji Zhou, Ruoc…

APS「多目标平衡算法」如何破解效率与弹性的永恒博弈

APS&#xff08;高级计划与排程&#xff09;系统作为企业智能制造的核心引擎&#xff0c;通过整合需求预测、产能规划、生产调度、物料管理及数据分析等模块&#xff0c;构建了覆盖产品全生产流程的“感知-决策-执行-优化”闭环体系。 精准需求预测 APS系统通过构建需求特征数…

网张实验操作-防火墙+NAT

实验目的 了解防火墙&#xff08;ENSP中的USG5500&#xff09;域间转发策略配置、NAT&#xff08;与路由器NAT配置命令不同&#xff09;配置。 网络拓扑 两个防火墙连接分别连接一个内网&#xff0c;中间通过路由器连接。配置NAT之后&#xff0c;内网PC可以ping公网&#xf…

05 web 自动化之 selenium 下拉鼠标键盘文件上传

文章目录 一、下拉框操作二、键盘操作三、鼠标操作四、日期控件五、滚动条操作六、文件上传七、定位windows窗口及窗口的元素总结&#xff1a;页面及元素常用操作 一、下拉框操作 from selenium.webdriver.support.select import Select import time from selenium.webdriver.…