活动页和后台页的区别

URL*_*L87 2 javascript google-chrome google-chrome-extension

在我阅读了关于Event Page的文档后,我没有得到使用 Event Page 而不是 Background Page 的优势。

假设我有以下简单案例 -

清单文件

"background": {
    "scripts": ["background.js"],
    "persistent": false
}, 
"content_scripts": [
    {
        "matches": ["<all_urls>"],
        "js": ["content.js"]
    }
]
Run Code Online (Sandbox Code Playgroud)

内容.js

chrome.runtime.sendMessage("Hi Background")
Run Code Online (Sandbox Code Playgroud)

背景.js

chrome.runtime.onMessage.addListener(messageListener);

function messageListener (request, sender, sendResponse) {
    alert(request);   
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,无论persistent"persistent": false还是 中"persistent": true的侦听器background.js都应该始终处于唤醒状态,以便从 中获取消息content.js,因此background.js无法进入挂起模式。

那么"persistent": true在这种情况下和一般情况下,事件页面 ( ) 有什么好处?请举例说明。

Del*_*iaz 5

事件页面的主要优点是在不使用时通过卸载后台脚本来释放 RAM 和 CPU 资源。

...background.js 无法进入挂起模式。

它可以。即使您的事件页面使用消息侦听器,它仍会在一段时间后卸载。Chrome 记得页面已经设置了监听器,所以浏览器会在发送消息时唤醒页面。

你可以试试这个实验:

  1. 添加这个扩展

清单文件

{
    "manifest_version": 2,
    "name": "Test",
    "version": "0.0.1",
    "description": "",
    "background": {
        "scripts": ["background.js"],
        "persistent": false
    },      
    "browser_action": {
        "default_popup": "popup.html"
    }
}
Run Code Online (Sandbox Code Playgroud)

背景.js

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    sendResponse({
        msg: "it's alive!"
    });
  }
);
Run Code Online (Sandbox Code Playgroud)

弹出窗口.html

<html>
    <body>
        <div id="text"></div>
        <script src="popup.js"></script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

弹出窗口.js

chrome.runtime.sendMessage('hello', 
    function (response) {
        document.getElementById('text').textContent = response.msg;
    }
);
Run Code Online (Sandbox Code Playgroud)
  1. 打开 Chrome 的任务管理器并等待几秒钟,直到测试扩展消失(卸载)。如果你没有看到它(它已经卸载了),你可以重新加载扩展。
  2. 单击扩展程序的浏览器操作,您将在来自事件页面的窗口内看到消息。此外,您可以在测试扩展的任务管理器中看到两个进程:一个是弹出窗口,第二个是事件页面。
    弹出窗口关闭后,事件页面将在几秒钟内再次卸载。