关于Chrome Extension option的一些小事

本文实践验证环境:版本 138.0.7204.101(正式版本) (arm64)

什么是option页面?

option页面 是Chrome Extension的核心构成部分,它会跟随插件安装在用户的浏览器上。大部分插件中会将option页面作为用户设置页,也有部分插件会直接将其作为用户本地的独立功能页,比如作为批量采集数据的入口;

与插件中其他构成部分不同的是:

  1. 一个插件最多可以设置一个option页面;
    • popup页面可以设置多个;
  2. 不仅可以直接访问插件的chrome相关API,也是一个独立完整的页面,即拥有完整的window、dom操作能力;
    • service worker没有dom操作能力;
    • content只有部分chrome API的操作能力(比如storage);

option有哪几种呈现方式?

因为option不同的呈现方式不仅会影响到交互体感,而且在编码场景下,插件配置方式、打开方式都不同,且在通信方式上也会略有差异,所以在讲打开option页面方式之前,我们先来看看option的呈现方式。

option有两种呈现方式:选项卡页面弹框方式,这两种方式的相同点是:一个浏览器窗口最多只能打开一个option页面(请结合交互视频理解,此时,为了多个被打开的option页面数据的一致性,开发时请做好数据更新的监听与同步);

选项卡页面方式 就是直接打开一个浏览器选项卡,选项卡的地址为 chrome-extension:///option.html(其中,option.html 这个文件地址是由配置决定的);

弹框式 的交互方式为:打开时,会先跳转到插件详情页,然后再弹出弹框(请看交互视频)。相对于页面式,需要注意的是:弹框式option的弹框大小是由内容大小决定的,所以开发者最好在编码时为内容设置固定尺寸以确保不会发生"尺寸不对而引起的内容错乱"问题;

如何打开option页面?

说完呈现方式,接下来切入正题说说如何打开option页面,打开option页面有两种方式:

1. 用户通过浏览器右上角插件logo-选项打开。

主要决定这种呈现方式的是manifest.json的配置信息:

页面方式配置(说明:第二种方式官方文档中并未标明,由笔者自行实践得出):

js 复制代码
// manifest.json

// 这种方式是官方文档中推荐的

{  

  ...

  "options_page": "option.html", // option.html这个文件地址会影响TAB页中的地址

  ...

}
    

// 这种方式官方文档中并未标出,由笔者自行实践得出

{

  ...

  "options_ui": {

    "page": "option.html",

    "open_in_tab": true

  },

  ...

}
    

弹框方式配置:

js 复制代码
    
// manifest.json

{

  ...

  "options_ui": {

    "page": "option.html",

    "open_in_tab": false

  },

  ...

}

2. 开发者自行编码得到一个点击入口并自行实现点击事件去触发option页面的呈现。

这种方式官方提供了一个兼容性的编写函数:

js 复制代码
if (chrome.runtime.openOptionsPage) {

    // 如果配置的是弹框方式的,则用这种方式打开

    chrome.runtime.openOptionsPage(); 

} else {

    // 否则直接打开tab页

    window.open(chrome.runtime.getURL('option.html'));

}

与option消息通信需要注意什么?

针对插件的各个部分之间的通信关键,其实,只要记住以下这点,你就可以运用自如了:

  1. Tab页插件后台类(service worker / option等)发送消息时,可以使用chrome.runtime.connect建立长链接通信通道,也可以使用chrome.runtime.sendMessage直接进行短连接通信;
  2. 插件后台类 (service worker / option等)向 Tab页 发送消息时,因为插件后台类往往全局只有一个执行上下文,并且插件本身限制" 插件后台类只能与一个Tab建立通信通道 ",所以就需要用到chrome.tabs相关函数:chrome.tabs.connect建立长链接通信通道、chrome.tabs.sendMessage建立短连接通信通道;
  3. 插件后台类相互之间发送消息时,也可以使用chrome.runtime函数进行长短连接的通信通道;
  4. 结合第2点和第3点,option页面是一个特殊场景。当它的展现方式是页面形式时,它对Service Worker来说就是一个Tab页,所以也可以使用chrome.tabs相关函数,但是弹框形式情况下,它的执行上下文不再与Tab一致,所以会导致Service Worker无法使用chrome.tabs与其相连;
  5. 另外,应对option页面发出的信息,接收方接收的信息中不包含sender.tab信息
  6. 同时,经过实践,option向Service Worker发送消息时,会携带sender.url信息 ,url一般就是这个格式:chrome-extension:///option.html,但option向Tab发送信息时,不会携带sender.url信息

以上文字内容,整理成表图如下:

相关推荐
北'辰24 分钟前
DeepSeek智能考试系统智能体
前端·后端·架构·开源·github·deepseek
前端历劫之路42 分钟前
🔥 1.30 分!我的 JS 库 Mettle.js 杀入全球性能榜,紧追 Vue
前端·javascript·vue.js
爱敲代码的小旗2 小时前
Webpack 5 高性能配置方案
前端·webpack·node.js
Murray的菜鸟笔记2 小时前
【Vue Router】路由模式、懒加载、守卫、权限、缓存
前端·vue router
苏格拉没有底了2 小时前
由频繁创建3D火焰造成的内存泄漏问题
前端
阿彬爱学习2 小时前
大模型在垂直场景的创新应用:搜索、推荐、营销与客服新玩法
前端·javascript·easyui
橙序员小站3 小时前
通过trae开发你的第一个Chrome扩展插件
前端·javascript·后端
Lazy_zheng3 小时前
一文掌握:JavaScript 数组常用方法的手写实现
前端·javascript·面试
MrSkye3 小时前
🔥从菜鸟到高手:彻底搞懂 JavaScript 事件循环只需这一篇(下)
前端·javascript·面试