chrome插件开发流程

chrome插件开发官方文档:https://developer.chrome.com/docs/extensions/mv3/
chrome扩展程序调试地址:chrome://extensions/ (注意:需要打开开发者模式)
chrome应用商店:https://chrome.google.com/webstore/category/extensions

chrome插件其实就是使用前端语法+调用chrome浏览器的API开发的,所以我们必须得了解chrome浏览器的API以及文件结构。

步骤1: 启用开发者模式

在chrome浏览器中,打开扩展程序页面chrome://extensions/,启用开发者模式,如图所示:

image.png

步骤2: 创建插件清单文件manifest.json

manifest.json清单文件此JSON文件描述插件的功能和配置,是必须配置的,位于项目根目录

2.1 基本配置
image.png
{
  "manifest_version": 3, 插件版本,现在都用3了,后面就会不再支持版本2
  "name": "Hello Extensions", 插件名称
  "description": "Base Level Extension", 插件描述
  "version": "1.0",  插件开发版本
}
2.2 action : 声明插件图标和点击后展示的页面
{
...
 "action": { 
    "default_popup": "hello.html",  点击扩展图标时,弹出的HTML页面
    "default_icon": { 用于指定插件在不同位置的默认图标
         "16": "images/icon16.png",
         "32": "images/icon32.png",
         "48": "images/icon48.png",
         "128": "images/icon128.png"
     }  
  },
  "icons": { 当用户在 Chrome Web Store 中浏览插件或在安装插件时看到插件的图标时,会使用 icons 指定的图标
    "128": "icons/icon128.png",
    "48": "icons/icon48.png",
    "16": "icons/icon16.png"
  },
}
image.png
2.3 声明内容脚本content_scripts,这个也是manifest.json很重要的一点
{
  ...
  "content_scripts": [
    {
      "js": ["scripts/content.js"], 内容脚本路径
      "matches": [
        "https://developer.chrome.com/docs/extensions/*", 需要插入内容脚本的网址
      ]
    }
  ]
}

注意:matches里面匹配的网址后面要带*,除非你只在这个网站某个固定网址使用,否则都加*,不然会出现content.js加载失败,无法插入到该网站中,如果要支持所有网站,则设置"matches": ["<all_urls>"]

2.4 service_worker : 在后台监听浏览器事件(service_worker是特殊的javascript环境,加载它处理事件并在不需要时终止)
{
  ...
  service_worker: "scripts/background.js"
}
2.5 host_permissions: 插件可以与特定主机进行通信、访问和修改网页内容
{
    ...
    "host_permissions": [
      "https://example.com/*",
      "http://www.example.org/",
      "https://api.example.net/"
    ]
}

例如我们需要在service_worker.js文件中获取某个网站缓存的数据,则首先需要在清单文件中“host_permissions”声明该网站,然后才能获取,如下所示

chrome.runtime.onInstalled.addListener(() => {
    chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { 
        chrome.tabs.get(tabId, async(updatedTab) => {
            const url = new URL(updatedTab.url);
            if (url.hostname === 'example.com') {                    
                // 在控制台打印存储的数据       
                const data = await chrome.scripting.executeScript({
                    target: { tabId: tab.id },
                    function: () => {
                        return {                         
                            userInfo: sessionStorage.getItem('userInfo'),
                        };
                    }
                });
                            
                if(data && data.length){                     
                    userInfo = JSON.parse(data[0].result.userInfo);                 
                }
            }  
        });
    });
});

步骤3: 开发插件功能

根据插件的需求,创建相应的 HTML、CSS 和 JavaScript 文件,
使用 JavaScript 编写插件的逻辑和功能。您可以通过 DOM 操作、事件处理和与chrome API 的交互来实现所需的功能。


image.png

步骤4: 加载和调试

加载插件:首先在chrome浏览器地址栏输入chrome://extensions/开发扩展程序页面,点击左上角的“加载已解压的扩展程序”,把自己本地的文件夹直接导入进去,如下图所示。

image.png

调试service_worker.js文件
image.png
调试popup.js文件

鼠标点击插件,点击右键菜单会出现“审查弹出内容”,即可进行调试


image.png
调试content_script.js文件

打开manifest.json中配置content_script对应的网站地址,F12打开调试,如果下方出现了你开发的插件名称以及文件,则代表你的页面成功插入该网站,在console中即可进行调试


image.png

步骤5: 打包和发布插件

chrome中也支持自己打包文件,打包之后生成后缀为.crx的文件,然后把.crx结尾的插件导入到浏览器,但是未发布的插件,开关无法打开,一直处于置灰状态,导致无法使用,查看详情才知道Chrome 只允许使用 Chrome 应用商店中发布的扩展程序
相关说明文档如下:https://support.google.com/chrome_webstore/answer/2811969?visit_id=638279384706503272-341708265&p=ui_remove_non_cws_extensions&hl=zh-Hans&rd=2

注册以及发布流程如下:
chrome应用商店点击注册,就会看到如下图所示。首先同意左侧的开发者协议和政策,然后去支付注册费5美元进行注册。


image.png

这个注册支付,不能用国内的银行卡以及信用卡,要用Visa卡,没有的话也没关系,可以直接去淘宝买一个。

chrome应用商店注册成功之后,先把本地文件压缩为.zip格式,点击上传即可(最多支持发布20个插件)。


image.png

上传成功后,需要你填写一些关于插件相关信息,填写完整之后右上角的“提交审核”按钮才会高亮,然后就能提交审核了。

注意chrome插件的公开范围越广,审核时间越长。

image.png

常用的chrome API

chrome.runtime:
提供与插件运行时环境交互的功能,包括管理插件的生命周期、发送消息、注册事件监听器等。
chrome.extension:
这个 API 已被废弃,不推荐使用。它提供了一些与插件相关的功能,例如获取插件的 URL、向页面注入脚本等。相应的功能可以使用 chrome.runtime 替代。
chrome.tabs:
允许与浏览器标签页进行交互,包括获取当前标签页信息、打开新标签页、切换标签页、执行脚本等。
chrome.windows:
允许与浏览器窗口进行交互,包括获取当前窗口信息、打开新窗口、切换窗口、调整窗口大小等。
chrome.storage
提供持久化存储功能,用于在插件中保存和检索数据,包括使用 chrome.storage.local
进行本地存储和 chrome.storage.sync 进行跨设备同步。
chrome.runtime.sendMessage
用于在插件组件之间发送消息,可以实现不同组件之间的通信和数据传递。
chrome.runtime.onMessage
注册消息监听器,用于接收其他组件发送的消息,并进行相应的处理。
chrome.browserAction
允许在浏览器工具栏中创建图标按钮,并定义与按钮相关的交互行为,例如点击按钮时打开弹出窗口或执行特定操作。
chrome.contextMenus
允许在浏览器右键菜单中添加自定义菜单项,并定义菜单项的点击行为。
chrome.webRequest
允许拦截和修改网络请求,包括请求的头部、URL、响应内容等,以实现网络请求的修改和过滤。
chrome.notifications
允许在操作系统通知区域显示通知,以向用户发送系统级别的提示和提醒。
chrome.identity:
提供身份验证和用户信息相关的功能,例如使用 OAuth2 进行用户身份验证。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,387评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,845评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,091评论 0 246
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,308评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,662评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,795评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,008评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,466评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,687评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,181评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,531评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,177评论 3 239
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,126评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,862评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,734评论 2 274

推荐阅读更多精彩内容