介绍
如果做一些简单的功能,油猴脚本就可以做到;要做一些复杂的带有界面的功能,就需要 Chrome 扩展来做了。
Chrome 扩展是基于 HTML、JavaScript 和 CSS 等 Web 技术构建的,在单独的沙盒执行环境中运行,并与 Chrome 浏览器交互。
Chrome 浏览器可以自定义地址栏搜索引擎,但是切换比较麻烦,如果有一个方便切换搜索引擎的扩展,就很方便我们搜索我们想要的东西了。下面介绍一下,如何做一个 Chrome 右键菜单搜索扩展。
因为 manifest_version2 会提示过时,所以本例使用的是 manifest_version3 来创建扩展程序。
创建清单
每个扩展都要有一个名为 manifest.json
的 JSON 格式的清单文件,第一步要创建这个文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| { "name": "搜索", "description": "百度 必应 360 搜狗 谷歌", "version": "1.0", "manifest_version": 3, "icons": { "16": "img/icon.png", "48": "img/icon.png", "128": "img/icon.png" }, "action": { "default_icon": "img/icon.png", "default_title": "搜索", "default_popup": "index.html" }, "background": { "service_worker": "background.js" }, "permissions": [ "notifications", "contextMenus" ], "content_scripts": [{ "matches": ["<all_urls>"], "js": ["content-script.js"], "run_at": "document_idle" }] }
|
- manifest_version、name、version 字段是必须的。
- action 定义扩展的图标、标题和用户界面。
- manifest_version2 的 background.scripts 要替换为 manifest_version3 的 background.service_worker。
- 与 DOM 互动要使用 content_scripts 里面的 js 字段配置。matches 字段可使用通配符设置,例如
*://*.juejin.cn/*
。
- permissions 字段定义要使用的权限。这里使用了两个:通知和弹出菜单。
manifest_version3 不支持多个后台脚本,但可以将 service_worker 声明为 ES 模块来引入多个文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| { ... "background": { "scripts": [ "backgroundContextMenus.js", "backgroundOauth.js" ], "persistent": false }, ... }
{ ... "background": { "service_worker": "background.js", "type": "module" } ... }
|
交互逻辑
manifest.json
清单文件里面定义的文件都要保证不能缺少。不然会报错无法使用。
background.js
这个是 service_worker,用来与浏览器互动,并与 content_scripts 通信。下面定义了两个事件监听,一个点击弹出菜单项的事件,一个点击扩展图标的事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const sendData = (data) => { chrome.tabs.query({ active: true, currentWindow: true }).then(tabs => { chrome.tabs.sendMessage(tabs[0].id, data) }); };
chrome.contextMenus.onClicked.addListener(function(item, tab) { if (!tab.url.startsWith('chrome://')) sendData(item); });
chrome.runtime.onMessage.addListener(function(data, sender, sendResponse) { sendData(data); });
|
content-script.js
这个文件是与 background.js 通信,根据收到的数据,可对页面 DOM 进行操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| chrome.runtime.onMessage.addListener((data, sender, sendResponse) => { if (data.menuItemId) { switch (data.menuItemId) { case 'bing': url = 'https://cn.bing.com/search?q='; break; case '360': url = 'https://www.so.com/s?q='; break; case 'sogou': url = 'https://sogou.com/web?query='; break; case 'google': url = 'https://www.google.com/search?q='; break; default: url = 'https://www.baidu.com/s?wd='; } window.open(data.selectionText ? url + data.selectionText : new URL(url).origin); } });
|
使用
- git clone https://github.com/zkrisj/chrome-search.git。
- 打开扩展程序管理页面。
- 点击右上角开启开发者模式。
- 点击 加载已解压的扩展程序。选择第 1 步的文件夹。

效果


完整代码仓库地址
https://github.com/zkrisj/chrome-search