浏览器一个Tab对应一个渲染进程?浏览器渲染进程个数究竟与什么有关系(多进程浏览器Chrome为例)

默认情况下,多进程浏览器的一个Tab下的确就一个渲染进程,不过相信各位也看到过多个Tab页面共用一个渲染进程的情况。事实上,也存在一个Tab下有多个渲染进程的情况,这其实与window.opener属性以及浏览器安全策略——站点隔离相关。(文章基于chrome 版本 90.0.4430.11测试)


怎么看浏览器的渲染进程?

在这里插入图片描述

在这里插入图片描述

案例测试

在A页面(父页面)定义了一个打印参数值的方法test(),设置一个在新窗口打开B页面的链接,一个window.open()在新窗口打开B页面的链接,还注释了一个链接到百度首页的iframe

//A.html  父页面
<script>
	function test(n) {
		console.log(n)
	}
</script>
<body>
	<a href="B.html" target="_blank">to B page </a><br />
	<a href="#" onclick="javascript:window.open('B.html')">window.open to B page </a>
	<!-- <iframe src="https://www.baidu.com" height="400" width="600"></iframe> -->

在B页面(子页面)分别定义了一个调用父页面test方法的方法,还定义了一个将父页面地址改变的方法,还有一个打开C页面的方法。

//B.html  子页面
<body>
	<button onclick="useOpenerMethod()">使用父页面的方法</button>
	<button onclick="changeOpener()">盗换父页面</button>
</body>
<script>
	function useOpenerMethod(){
		window.opener.test(1234);
<span class="token punctuation">}</span>
<span class="token keyword">function</span> <span class="token function">changeOpener</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
	window<span class="token punctuation">.</span>opener<span class="token punctuation">.</span>location<span class="token punctuation">.</span>href<span class="token operator">=</span><span class="token string">"https://www.baidu.com"</span>
<span class="token punctuation">}</span>

情景演示

情景一:每次直接输入url打开A页面

通过浏览器的任务管理器可以观察到每新建一个Tab页,都会新建一个渲染进程。

在这里插入图片描述

情景二:取消对A页面iframe那部分代码的注释

取消对A页面iframe那部分代码的注释,启动A页面,打开浏览器任务管理器可以看到有个叫做辅助框架的进程,打开正是我们iframe的设置的百度页面。也就是说一个Tab下是可以不止一个渲染进程的。
在这里插入图片描述

情景三:通过链接打开B页面

通过链接每打开一个B页面就会分配独立的CPU资源

在这里插入图片描述

情景四:通过window.open()打开B页面

A,B页面共用系统资源,也就是在同一个渲染进程下。即多个Tab可包含在同一个渲染进程
在这里插入图片描述

情景五:观察使用链接和window.open()打开的B页面方法的调用情况

链接打开的B页面:
在这里插入图片描述
window.open()打开的B页面:
在这里插入图片描述
可见window.open()打开的B页面能调用A页面的方法和改变A页面的网址。

情景分析

关于window.opener属性我就不做过多阐述了,各位可看下我这篇文章window对象的opener知多少

window.opener属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用。
简单点说,就是从父页面打开一个子页面,子页面是可以读取和修改父页面的信息的(注意:有一定的限制条件)。

为什么情景一每次新建一个A页面就会多一个渲染进程呢?

通过URL打开的各个页面都毫无关联的,并不会因为在同一个域名下就会将渲染进程合并为一个。

原因在于它们的window.opener属性都为null,说明都是独立开启,没有任何页面依赖关系,资源相互独立,自然就要给其分配独立的运行内存空间。

在这里插入图片描述

情景二中一个Tab页出现超过一个渲染进程?

浏览器实现了站点隔离,跨域读取阻止。网站隔离有效地使不受信任的网站更难访问或窃取您在其他网站上的帐户中的信息。

站点隔离(site-isolation),所有跨站点的导航都将成为跨进程的,因此来自不同站点的文档不会彼此共享一个进程,然后将外部站点独立出一个渲染进程。这样就可以避免外部网站的数据进入父站点的渲染进程读取内存数据。一般对iframe才会独立一个辅助框架进程。

情景三通过链接每打开一个B页面就会分配独立的CPU资源

直接使用<a>标签打开的新页面,得到的window.opener属性的值都是null

情景四window.open()打开B页面与父页面共享渲染进程

通过window.open()打开新页面时可以获取到window.opener属性
在这里插入图片描述


情景五其实是对opener属性的补充和例证。

📌注意:谷歌浏览器的优化策略

还有一种情况就是,你不停的打开新的标签页,也会合并为一个渲染进程,但是当你在新标签页搜索或者查询之后,也会将该页面独立出来一个渲染进程。

总结

  • 父页面的打开的子页面在没有跨域访问的情况下,是会共用父页面的渲染进程的。(more tab one process)
  • 页面中采用iframe框架引入其他页面,则iframe会独立成辅助框架,有自己的渲染进程。(one tab more process)
  • 共用渲染进程的数个页面,当顶级的父页面关闭了或者跨域了,则会禅让该渲染进程。
  • 新建的标签页也会合并为一个渲染进程,仅限不进行搜索查询的时候,这是谷歌刘浏览器的内存优化策略。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要开发一个Chrome插件来监听浏览器的交互,您可以按照以下步骤操作: 1. 创建一个新的文件夹,作为您的插件项目的根目录。 2. 在根目录中创建一个名为“manifest.json”的文件。这是Chrome插件的配置文件,其中包含插件的名称、版本、图标等信息。示例: ``` { "manifest_version": 2, "name": "My Extension", "version": "1.0", "description": "My Chrome Extension", "icons": { "16": "icon16.png", "48": "icon48.png", "128": "icon128.png" }, "background": { "scripts": ["background.js"], "persistent": false }, "permissions": ["tabs", "activeTab"] } ``` 3. 在根目录中创建一个名为“background.js”的文件。这是您的插件的后台脚本,用于监听浏览器的交互事件。示例: ``` chrome.runtime.onInstalled.addListener(function() { console.log("Extension installed"); }); chrome.tabs.onActivated.addListener(function(activeInfo) { console.log("Tab activated: " + activeInfo.tabId); }); chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { if (changeInfo.status == "complete") { console.log("Tab updated: " + tabId); } }); chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { console.log("Message received: " + message); }); ``` 4. 在Chrome浏览器中打开“扩展程序”面(可以在地址栏中输入“chrome://extensions/”打开)。在面右上角启用“开发者模式”。 5. 点击“加载已解压的扩展程序”,选择您的插件项目的根目录。 6. 您的插件现在已经加载,并在后台监听浏览器的交互事件。您可以在“background.js”中编写适当的代码来响应这些事件。 需要注意的是,您需要在“manifest.json”文件中声明必要的权限,例如“tabs”和“activeTab”,以便您的插件能够访问浏览器标签和活动标签

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值