Chrome 扩展开发入门

Chrome 扩展开发入门

最近学习 Chrome 扩展开发,自己弄脚本实现一些简单的机械化小功能

文件结构

首先看一下文件结构,Chrome扩展的文件结构也是manifest.json核心配置的体现,以下这个简单的 demo 最要分为三部分:

  • backgournd.js :扩展加载时启动(打开浏览器或安装扩展),并持续运行,直到被禁用或关闭浏览器。
  • content.js : 网页加载完成后执行,比如开启一个新 tab 页面。
  • popup.js :当点开扩展图标时弹出窗口打开时执行。

大概就是分三分部,我的理解是:backgournd 负责 Chrome 底层一些数据的持久化和 Chrome 事件的交互,content 负责单个打开的网页的交互,popup 负责扩展窗口的交互。

├── background.js  // 后台运行的js
├── content.js     // 页面执行的js
├── data.txt
├── images
│   ├── 128.png
│   ├── 16.png
│   ├── 48.png
│   ├── didi.jpg
│   └── facai.jpg
├── manifest.json
├── popup.html     // 扩展窗口页面
└── popup.js       // 扩展窗口页面展开时执行的js

再来看看 manifest.json 的配置内容:

action:负责 popup,扩展窗口的配置,包含弹窗的图标和对应的dom页面文件
content_scripts:对应网页的 js 执行文件,可以直接注入控制网页,可能在网页被挂起时释放
background:是后台持久化执行或者监听事件

icons:配置插件窗口的图标
permissions:用于设置该扩展可以拥有哪些功能权限
web_accessible_resources:用于配置该插件可以读取的资源文件
每一个配置分类里还有子配置,如 content_scripts 可以配置 matches 适用的网址有哪些什么

{
  "manifest_version": 3,
  "name": "AutoBulletComments",
  "version": "1.0",
  "description": "这是一个示例",
  "permissions": ["activeTab", "storage"],
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "images/16.png",
      "48": "images/48.png",
      "128": "images/128.png"
    }
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"]
    }
  ],
  "background": {
    "service_worker": "background.js"
  },
  "icons": {
    "16": "images/16.png",
    "48": "images/48.png",
    "128": "images/128.png"
  },
  "web_accessible_resources": [
    {
      "resources": ["data.txt"],
      "matches": ["<all_urls>"]
    }
  ]
}

通信

既然分了三个处理模块各种控制弹窗、页面、后台三块,这三之间数据有交互怎么办?可以通过消息传递机制实现,一般使用: chrome.runtime.sendMessagechrome.runtime.onMessage.addListener
例如:

  1. 发送消息
// popup.js 、content.js 、background.js
chrome.runtime.sendMessage({ action: "sendMessage" });
  1. 接收消息
// popup.js 、content.js 、background.js
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  if (request.action === "sendMessage") {
    // 接收消息
    console.log("message");
  }
});

通常情况下:

  1. popup.js 发送消息到 background.js,
  2. background.js 接收消息,并可以选择将其转发给 content.js,
  3. content.js 接收来自 background.js 的消息。

popup.js 与 content.js 的消息通信一般由 background.js 转发,如果 content.js 与 popup.js 存在共同的上下文,即:扩展窗口在当前活动页签打开,也可以直接通过 chrome.runtime.onMessagechrome.runtime.sendMessage 建立通信。

共同上下文时,content.js 与 popup.js 互相通信

  1. content.js 发送消息
// content.js
// 发送消息
chrome.runtime.sendMessage({ action: "sendContentData" });
// 接收消息
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.action === "sendPopupData") {
    console.log("the popup data");
  }
});
  1. popup.js 接收消息并向指定的 content.js 通过chrome.tabs.sendMessage发送消息
// popup.js
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  if (request.action === "sendContentData") {
    // 查询当前活动标签页
    chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
      // 向 当前页面 content.js 发送消息
      chrome.tabs.sendMessage(tabs[0].id, { action: "sendPopupData" });
    });
  }
});

文件读取

本示例中包含了读取文件 data.txt
在 content.js 中读取文件首先需要在 manifest.json 中配置对该文件的读取权限,增加如下配置

"web_accessible_resources": [
  {
    "resources": ["data.txt"],
    "matches": ["<all_urls>"]
  }
]

然后content.js中读取文件

// content.js
async function fetchTextFile() {
  const url = chrome.runtime.getURL("data.txt");
  console.log("Fetching from:", url); // 打印要获取的 URL
  try {
    const response = await fetch(url);
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    const text = await response.text();
    return text;
  } catch (error) {
    console.error("Failed to fetch the file:", error);
  }
}

async function getTextData() {
  const textData = await fetchTextFile();
  // 将文本按行分隔,去除空白行
  const lines = textData
    .split("\n")
    .map((line) => line.trim())
    .filter((line) => line);

  return lines;
}

getTextData()

自定义扩展窗口的样式

在扩展对应控制的popup.html中,我们可以按照平时做页面开发一样写css、js、html做一个页面,可供UI交互,如图:
在这里插入图片描述

完成简单的所需文件的配置和拼装后,打开chrome://extensions/将扩展目录加载到扩展里面就成功了。

其他一些 Chrome 的专业描述

在 Chrome 扩展的开发中,常用的专业定义:

1. Background Script

  • 定义:扩展的后台脚本,负责处理全局事件和状态管理。
  • 例子:background.js

2. Content Script

  • 定义:运行在网页上下文中的脚本,直接操作网页的 DOM。
  • 例子:content.js

3. Popup Script

  • 定义:与扩展弹出窗口相关联的脚本,处理用户交互。
  • 例子:popup.js

4. Manifest File

  • 定义:扩展的配置文件,描述扩展的基本信息和权限。
  • 例子:manifest.json

5. Message Passing

  • 定义:模块之间的通信机制,允许不同脚本发送和接收消息。

6. Event Page

  • 定义:一种特殊类型的后台脚本,只有在需要时才会激活,以节省资源。

7. User Interface (UI)

  • 定义:扩展与用户交互的部分,通常包括弹出窗口、选项页面等。

8. API (Application Programming Interface)

  • 定义:Chrome 提供的接口,用于访问浏览器功能,例如网络请求、存储、标签管理等。

9. Permissions

  • 定义:在 manifest.json 中声明的权限,决定扩展可以访问的资源和信息。

10. Cross-Origin Request

  • 定义:从一个源(域名、协议和端口)向另一个源发起的请求,通常需要 CORS(跨域资源共享)支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值