#Chrome扩展程序开发教程--05:Service worker

引言

        本系列博客旨在带来最新的Chrome扩展程序开发入门教程。


1、基本介绍

        Service worker 是一个基于事件的脚本,在后台运行,通常用来协调扩展程序中不同部分的任务和监听浏览器事件,如:扩展程序被安装、打开页面、关闭页面,创建新标签、添加新书签、点击扩展工具栏图标等。service worker 可以使用所有的Chrome API,但 service worker 不能直接与网页的内容直接进行交互,需要与 content scripts 进行通信来间接修改网页的内容(第一章中有介绍)。
        Service worker 只有当发生以下情况的时候才被执行:

  • 扩展程序被安装或者更新。
  • 所监听的事件被触发。
  • 收到 content scripts 或者 其它扩展程序发送的消息

        需要注意的是

  • 当上一个事件执行完成后,会进入 30s 的等待时间,如果这段时间内没有新的事件发生,Service worker 就会进入休眠状态,直至下一个事件的到来。
  • 只有扩展程序被安装或者更新的时候,Service worker 中的代码会被全部执行一遍,其它情况只会执行对应事件的代码。

2、注册 service worker

        扩展程序可以在 manifest.json 的 “background” 属性中注册 service worker,需要注意的是,只能指定一个 js 文件作为 service worker,如下所示:

{
  "name": "Awesome Test Extension",
  ...
  "background": {
    "service_worker": "background.js"
  },
  ...
}

3、初始化扩展程序

        通过监听 runtime.onInstalled 事件可以对扩展程序进行一次性的初始化工作,如下所示:

chrome.runtime.onInstalled.addListener(() => {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"]
  });
});

4、设置监听器

        在构建 service worker 时,开发者需要为扩展程序所需要响应的事件添加监听器。需要注意的是,监听器需要在全局范围内注册,如下所示:

chrome.runtime.onInstalled.addListener(() => {
  chrome.contextMenus.create({
    "id": "sampleContextMenu",
    "title": "Sample Context Menu",
    "contexts": ["selection"],
  });
});

// This will run when a bookmark is created.
chrome.bookmarks.onCreated.addListener(() => {
  // do something
});

        千万不能将监听器嵌套在函数中进行注册:

chrome.runtime.onInstalled.addListener(() => {
  // ERROR! Events must be registered synchronously from the start of
  // the service worker.
  chrome.bookmarks.onCreated.addListener(() => {
    // do something
  });
});

        还可以动态移除监听器,如下所示:

chrome.runtime.onMessage.addListener((message, sender, reply) => {
  chrome.runtime.onMessage.removeListener(event);
});

5、过滤事件

        可以通过以下代码为事件监听器添加过滤器:

const filter = {
  url: [
    {
      urlMatches: 'https://www.google.com/',
    },
  ],
};

chrome.webNavigation.onCompleted.addListener(() => {
  console.info("The user has loaded my favorite website!");
}, filter);

6、保持 Service Worker 处于活跃状态的方法

        触发事件或者调用 Chrome API 都可以重置等待时间。因此,我们只需要在 service worker 的代码中固定间隔访问 storage 即可,如下所示:

function sleep(ms) {return new Promise(resolve => setTimeout(resolve, ms));}


(async () => {
	while (true) {
		await sleep(25000);
		await chrome.storage.local.get();
	}
})();

### 创建和开发 Chrome 扩展 V3 教程 #### 项目结构设置 为了创建一个新的 Chrome 扩展程序版本 3 (MV3),开发者应当先建立一个基础文件夹来容纳所有的资源文件。通常情况下,这个目录会包含 `manifest.json` 文件作为扩展的核心配置文档[^1]。 ```json { "manifest_version": 3, "name": "My Extension", "version": "1.0", "description": "A simple example of a Manifest V3 extension.", "permissions": [ "activeTab" ], "background": { "service_worker": "background.js" }, "action": { "default_popup": "popup.html" } } ``` 此 JSON 对象定义了扩展的名字、描述和其他必要的权限声明;它还指定了后台脚本和服务工作线程的位置以及弹出窗口的内容页面路径。 #### 编写服务工作者 Manifest V3 推广使用 Service Workers 来替代传统的背景页。这允许更高效的内存管理和更好的性能表现。下面是一个简单的 service worker 脚本例子: ```javascript // background.js chrome.runtime.onInstalled.addListener(() => { console.log('Extension installed'); }); chrome.action.onClicked.addListener((tab) => { chrome.scripting.executeScript({ target: { tabId: tab.id }, files: ['content.js'] }); }); ``` 这段代码监听安装事件并记录一条消息到控制台;同时也处理当用户点击浏览器操作按钮时触发的动作,向当前标签注入内容脚本。 #### 构建用户界面 对于大多数交互式的 Chrome 扩展来说,提供给用户的图形化接口是非常重要的组成部分之一。可以利用 HTML 和 CSS 来构建这些 UI 组件。这里给出 popup 页面的一个简单实例: ```html <!-- popup.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Popup</title> <style> body { font-family: Arial; padding: 10px;} button { display:block;width:100%;margin-top:5px;padding:.7em;text-align:center;background-color:#4CAF50;color:white;border:none;border-radius:4px;cursor:pointer;font-size:16px;} </style> </head> <body> <h2>Hello from Popup!</h2> <button id="clickMe">Click Me</button> <script src="popup.js"></script> </body> </html> ``` 关联的 JavaScript 可能如下所示: ```javascript document.getElementById('clickMe').addEventListener('click', () => { alert('Button was clicked!'); }); ``` 上述代码片段展示了如何通过内联样式表美化网页布局,并且绑定了按钮点击事件处理器以响应用户输入行为。 #### 测试与调试 完成编码之后,在本地环境中加载未打包的扩展来进行初步的功能验证非常重要。打开 Chrome 浏览器,进入 `chrome://extensions/` 地址栏位置,启用右上角的“开发者模式”,然后选择“加载已解压的扩展”。最后按照提示选取之前准备好的文件夹即可成功部署自定义插件供进一步测试之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值