当前位置: 首页 > news >正文

js在浏览器执行原理

浏览器多进程与多线程

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

在这里插入图片描述

+-------------------+       +-------------------+       +-------------------+
| 浏览器主进程        |       | 渲染进程(标签页) |       | 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

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

相关文章:

  • golang -- 认识channel底层结构
  • AI软件汇总与功能解析:赋能未来的智能工具库
  • 以项目的方式学QT开发(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
  • mysql 基础复习-安装部署、增删改查 、视图、触发器、存储过程、索引、备份恢复迁移、分库分表
  • 8、SpringBoot集成MinIO
  • 鸿蒙OSUniApp 制作简洁高效的标签云组件#三方框架 #Uniapp
  • 插槽(Slot)的使用方法
  • GPUGeek云平台实战:DeepSeek-R1-70B大语言模型一站式部署
  • 应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
  • buildroot使用外部编译链编译bluez蓝牙工具
  • MySQL-数据库分布式XA事务
  • 连接指定数据库时提示not currently accepting connections
  • Golang基础知识—cond
  • LM2902:一款高性能四运算放大器的解析
  • 蓝桥杯 2024 C++国 B最小字符串
  • 论文学习_Directed Greybox Fuzzing
  • 《MySQL:MySQL视图特性》
  • rsync入门笔记
  • 第30节:现代CNN架构-轻量级架构EfficientNet
  • 【YOLO 系列】基于YOLO的道路坑洞检测识别系统【python源码+Pyqt5界面+数据集+训练代码】
  • 烤肉店从泔水桶内捞出肉串再烤?西安未央区市监局:停业整顿
  • 网易一季度净利增长三成,丁磊:高度重视海外游戏市场
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战
  • 优化营商环境,服务上海“五个中心”建设,北外滩有何举措?
  • 视频丨美国两名男童持枪与警察对峙,一人还试图扣动扳机
  • 俄乌拟在土耳其举行会谈,特朗普:我可能飞过去