全网最详细的谷歌插件开发小册📚(1)

本文涉及的产品
内容审核增强版开发者实践包,10万次资源包1年有效
简介: Chrome插件Chrome插件,或称为扩展,是一种专为Google Chrome浏览器设计的软件应用程序。插件可以让开发者向浏览器中添加新的特性或功能,或者对现有的功能进行增强或改变。从改变浏览器的视觉主题,到阻止广告,从管理密码到加强网络安全,Chrome插件的使用场景几乎无所不包,给用户带来高度定制化的浏览体验。插件运行在Chrome浏览器的沙盒环境中,这意味着它们在浏览器中执行,但不会影响到计算机的其他部分。这种设计保证了浏览器的稳定性和用户的安全。插件的开发主要依赖于Web技术,包括HTML、CSS和JavaScript,因此,任何有Web开发经验的人都能够相对容易地开始Chr

Chrome插件

Chrome插件,或称为扩展,是一种专为Google Chrome浏览器设计的软件应用程序。插件可以让开发者向浏览器中添加新的特性或功能,或者对现有的功能进行增强或改变。从改变浏览器的视觉主题,到阻止广告,从管理密码到加强网络安全,Chrome插件的使用场景几乎无所不包,给用户带来高度定制化的浏览体验。

插件运行在Chrome浏览器的沙盒环境中,这意味着它们在浏览器中执行,但不会影响到计算机的其他部分。这种设计保证了浏览器的稳定性和用户的安全。

插件的开发主要依赖于Web技术,包括HTML、CSS和JavaScript,因此,任何有Web开发经验的人都能够相对容易地开始Chrome插件的开发。然而,由于Chrome插件需要与浏览器紧密交互,因此还需要学习一些特定的知识,比如Chrome的API、插件的生命周期、消息传递机制等。

插件的基本构成

Manifest文件

Manifest文件是一个插件的元数据,它告诉Chrome插件的名称、描述、版本、权限以及其他插件需要的属性。下面是一个基本的manifest.json文件:

{
  "manifest_version": 2,
  "name": "My First Extension",
  "description": "This is a sample Chrome Extension",
  "version": "1.0",
  "icons": {
    "48": "icon.png",
    "128": "icon_large.png"
  },
  "permissions": [
    "activeTab",
    "storage",
    "https://*.mywebsite.com/*"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "content_scripts": [
    {
      "matches": ["https://*.google.com/*"],
      "js": ["content.js"],
      "run_at": "document_end"
    }
  ],
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html",
    "default_title": "Open the popup"
  },
  "options_page": "options.html",
  "web_accessible_resources": [
    "script.js",
    "style.css"
  ]
}

上面的manifest文件声明了一个插件的基本信息,并指定了插件的背景脚本、弹出窗口以及权限。

背景脚本(Background Scripts)

背景脚本是插件的主要工作区域,它可以监听浏览器事件,执行长时间运行的任务,或者管理插件的其他部分。下面是一个基本的背景脚本:

// background.js
chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.executeScript({
    code: 'document.body.style.backgroundColor="green"'
  });
});

内容脚本(Content Scripts)

内容脚本是插入到网页中的脚本,它们可以直接访问和修改网页的DOM。下面是一个内容脚本的例子,它在页面加载完成后,将所有的链接变为红色:

javascript

复制代码

// content.js
window.onload = function() {
  var links = document.getElementsByTagName('a');
  for(var i = 0; i < links.length; i++) {
    links[i].style.color = 'red';
  }
};

弹出页面(Popup Pages)

弹出页面是插件的用户界面,它们在用户点击插件图标时显示。下面是一个弹出页面的HTML代码,它显示一个简单的欢迎消息:

html

复制代码

<!-- popup.html -->
<!DOCTYPE html>
<html>
<body>
<h1>Welcome to My Extension!</h1>
</body>
</html>

选项页面(Options Pages)

选项页面是插件的设置页面,用户可以通过它来自定义插件的行为。下面是一个选项页面的例子:

<!-- options.html -->
<!DOCTYPE html>
<html>
<body>
<h1>Extension Options</h1>
<label>Background color: <input type="text" id="bgColor"></label>
<button id="save">Save</button>
<script src="options.js"></script>
</body>
</html>

在上面的选项页面中,用户可以输入一个颜色,然后点击保存按钮来改变插件的背景颜色。这需要配合一个options.js脚本来实现:

document.getElementById('save').onclick = function() {
  var color = document.getElementById('bgColor').value;
  chrome.storage.sync
.set({backgroundColor: color});
};

插件生命周期与事件系统

插件的生命周期是指从用户安装或更新插件,到用户卸载插件的过程。在这个过程中,插件可以响应各种浏览器或用户事件,执行相应的操作。

插件生命周期

插件的生命周期主要包含以下阶段:

  • 安装或更新:用户第一次安装插件,或者插件有新的版本可供更新时,浏览器会加载并初始化插件。此时,插件可以在background脚本中监听chrome.runtime.onInstalled事件,执行初始化操作

chrome.runtime.onInstalled.addListener(function(details) {
  if (details.reason == "install") {
    console.log("This is a first install!");
  } else if (details.reason == "update") {
    console.log("Updated from " + details.previousVersion + " to " + chrome.runtime.getManifest().version + "!");
  }
});
  • 启动:用户打开浏览器时,插件会被启动。插件可以在这个阶段初始化数据,设置默认状态等。

javascript

复制代码

chrome.runtime.onStartup.addListener(function() {
  console.log("Browser started, initialize plugin data.");
});
  • 运行:插件被启动后,就进入了运行阶段。在这个阶段,插件可以响应用户操作,监听和处理浏览器事件,提供各种功能。
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
  if (changeInfo.status == 'complete' && tab.active) {
    console.log("Active tab updated, let's do something!");
  }
});
  • 停止:用户关闭浏览器时,插件会被停止。插件可以监听chrome.runtime.onSuspend事件,保存数据,清理资源等。
chrome.runtime.onSuspend.addListener(function() {
  console.log("Browser is about to close, save plugin data.");
});
  • 卸载:用户从浏览器中卸载插件时,插件的生命周期就结束了。插件可以监听chrome.runtime.onInstalled事件的uninstall原因,执行卸载操作。
chrome.runtime.setUninstallURL("https://your_website.com/uninstall", function() {
  console.log("Uninstall URL has been set");
});

事件系统

Chrome插件的事件系统允许插件响应各种浏览器和用户事件。以下是一些常见的事件:

浏览器事件

  • 浏览器启动事件: 你可以通过监听 chrome.runtime.onStartup 事件来知道浏览器启动。
chrome.runtime.onStartup.addListener(function() {
    console.log("Browser has been started.");
});
  • 浏览器关闭事件: Chrome没有提供浏览器关闭的直接事件,但是可以使用chrome.windows.onRemoved事件在最后一个浏览器窗口关闭时执行操作。
chrome.windows.onRemoved.addListener(function(windowId) {
    chrome.windows.getAll({}, function(windows) {
        if(windows.length == 0) {
            console.log("Browser is closing, the last window was closed.");
        }
    });
});
  • 打开新窗口事件: 你可以通过监听 chrome.windows.onCreated 事件来知道新窗口打开。
chrome.windows.onCreated.addListener(function() {
    console.log("New window opened.");
});

关闭窗口事件: 你可以通过监听 chrome.windows.onRemoved 事件来知道窗口关闭

chrome.windows.onRemoved.addListener(function(windowId) {
    console.log("Window with id " + windowId + " was closed.");
});
  • 切换标签页事件: 你可以通过监听 chrome.tabs.onActivated 事件来知道标签页切换。
chrome.tabs.onActivated.addListener(function(activeInfo) {
    console.log("Tab with id " + activeInfo.tabId + " is now active.");
});
请求发送事件: 你可以通过监听 chrome.webRequest.onBeforeRequest 事件来知道请求发送。
  • 请求发送事件: 你可以通过监听 chrome.webRequest.onBeforeRequest 事件来知道请求发送。
chrome.webRequest.onBeforeRequest.addListener(
    function(details) {
        console.log("Request is about to be sent: ", details);
    },
    {urls: ["<all_urls>"]}
);

  • 响应接收事件: 你可以通过监听 chrome.webRequest.onCompleted 事件来知道响应接收。
chrome.webRequest.onCompleted.addListener(
    function(details) {
        console.log("Request completed: ", details);
    },
    {urls: ["<all_urls>"]}
);
  • 连接错误事件: 你可以通过监听 chrome.webRequest.onErrorOccurred 事件来知道连接错误。
chrome.webRequest.onErrorOccurred.addListener(
    function(details) {
        console.log("Error occurred while making request: ", details);
    },
    {urls: ["<all_urls>"]}
);

用户事件

  • 点击插件图标事件: 你可以通过监听 chrome.browserAction.onClicked 事件来知道插件图标被点击。
chrome.browserAction.onClicked.addListener(function(tab) {
    console.log("Plugin icon clicked in tab with id " + tab.id + ".");
});
  • 选择插件菜单事件: 首先需要创建菜单,然后通过监听 chrome.contextMenus.onClicked 事件来知道插件菜单被选择。
chrome.contextMenus.create({
    id: "sampleContextMenu",
    title: "Sample Context Menu",
    contexts: ["page"]
});
chrome.contextMenus.onClicked.addListener(function(info, tab) {
    if (info.menuItemId == "sampleContextMenu") {
        console.log("Sample Context Menu clicked.");
    }
});
  • 使用快捷键事件: 快捷键需要在 manifest.json 文件中定义,然后通过监听 chrome.commands.onCommand 事件来知道快捷键被使用。
chrome.commands.onCommand.addListener(function(command) {
    console.log('User triggered command: ' + command);
});
});

插件权限系统与内容安全策略(CSP)

Chrome插件需要在manifest文件中声明其所需的权限,如访问浏览历史,修改网页内容等。此外,为了保护用户,Chrome还实施了内容安全策略(CSP),限制插件可以从哪些源加载资源。

插件权限系统

插件需要的权限需要在 manifest.json 文件中的 "permissions" 部分进行声明。例如,如果一个插件需要访问用户的浏览历史,那么它需要添加 "history" 权限:

{
  "name": "My extension",
  ...
  "permissions": [
    "history"
  ],
  ...
}

内容安全策略(CSP)

内容安全策略(Content Security Policy,简称CSP)是一种安全标准,用于预防跨站脚本攻击(XSS)和数据注入攻击。默认的CSP策略禁止扩展加载远程JavaScript或CSS,只允许从扩展包内部加载。也就是说,你不能直接在你的HTML文件中引用一个外部的JS或CSS文件,所有的JS和CSS都应该以文件的形式包含在扩展包中。

如果你需要修改CSP策略,例如你需要从特定的远程服务器加载脚本或样式,你可以在 manifest.json 文件中使用 "content_security_policy" 来声明新的策略。例如:

{
  "name": "My extension",
  ...
  "content_security_policy": "script-src 'self' https://example.com; object-src 'self'",
  ...
}

以上策略表示插件允许从扩展包自身('self')和example.com加载脚本,只允许从扩展包自身加载插件。

注意,修改CSP策略应谨慎处理,因为过于宽松的CSP策略可能会带来安全风险。在某些情况下,如果可能,最好使用插件的后台脚本(background script)来加载和处理远程数据,而不是直接在前台页面(例如弹出页面或选项页面)加载远程脚本或样式。

更多关于CSP的信息,可以参考 Chrome 插件开发官方文档

深入了解Chrome API

在开发Chrome插件时,我们会频繁地使用Chrome API。这些API提供了许多功能,例如操作标签页,访问和修改用户书签,发送桌面通知,拦截和修改网络请求等。接下来,我们将详细介绍其中的一部分。

插件中的消息传递

在插件中,我们通常需要在不同的脚本之间进行通信,例如在background脚本和content脚本之间,或者在popup脚本和background脚本之间。Chrome提供了chrome.runtime.sendMessagechrome.runtime.onMessageAPI,用于在插件的不同组件之间发送和接收消息。

以下是一个在content脚本中发送消息,并在background脚本中接收消息的示例:

// content script
chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});
// background script
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.greeting == "hello")
      sendResponse({farewell: "goodbye"});
  });

目录
相关文章
|
2月前
|
存储 JavaScript 前端开发
🚀超级加速:轻松发现开源项目的终极秘籍🎁
本文介绍了8种方法,帮助开发者轻松找到适合自己的开源项目。通过利用如 GitHub Trending、Good First Issues 和 OpenSauced 等平台,读者可以有效地筛选和参与开源项目,提升自己的技术能力与社交网络。开源不仅是技术贡献,更是个人成长与机会的宝贵途径。无论是新手还是有经验的开发者,这些资源都能助你一臂之力,让你在开源社区中茁壮成长。
22 1
|
6月前
|
JSON 程序员 Swift
技术好文:Swit项目
技术好文:Swit项目
30 0
|
存储 Kubernetes JavaScript
🚀 2023 年你必须贡献的 9 个国外开源库 🔥
🚀 2023 年你必须贡献的 9 个国外开源库 🔥
🚀 2023 年你必须贡献的 9 个国外开源库 🔥
|
Web App开发 存储 监控
全网最详细的谷歌插件开发小册📚(2)
使用tabs API chrome.tabs API 允许插件操作浏览器的标签页,例如创建新的标签页,关闭标签页,切换标签页,修改标签页的URL等。以下是一个创建新标签页的示例:
458 1
|
Web App开发 移动开发 JSON
谈一谈|谷歌插件入门
谈一谈|谷歌插件入门
318 0
|
SQL 关系型数据库 MySQL
吹爆!阿里专家手码“数据库优化速成小册”Github现已疯传
现在在很多设计、开发、测试人员的眼中会认为SQL优化只是DBA 的事情。他们不需要去关心。反映到具体工作中,他们缺乏相应的优化意识,只注重功能的实现而忽略了相应的执行成本。最终的结果往往就是代码质量不高,软件上线后问题多。
|
Java 程序员 容器
拿捏了!阿里2023最新JDK源码深度解析小册,Github全站热榜第二
前几日闲来无事逛微信公众号时有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做过多的赘述了,我这篇主要跟大家说说怎么去看源码。
|
设计模式 SQL 缓存
真香!Github一夜爆火,阿里性能优化不传之秘终于开源
性能调优,是从开发岗跃迁至架构岗的拦路虎。如果你是一个小白,那么恭喜你性能优化这个东西你暂时还不需要扛着。但如果你是公司的中坚力量,想把技术水平往架构层面靠近,那么性能优化这个东西你必须要扛下来,并且解决它。
|
Linux Windows
事半功倍!强烈推荐这款学术利器!
在校学生或者从事科研相关工作的同学,经常会和学术论文打交道。 例如,毕业生在完成毕业论文的过程中,会阅读大量相关领域的学术论文。
事半功倍!强烈推荐这款学术利器!
|
XML 前端开发 JavaScript
❤️❤️HarmonyOS(鸿蒙)全网最全资源汇总,吐血整理,赶紧收藏!❤️❤️
❤️❤️HarmonyOS(鸿蒙)全网最全资源汇总,吐血整理,赶紧收藏!❤️❤️
327 0
❤️❤️HarmonyOS(鸿蒙)全网最全资源汇总,吐血整理,赶紧收藏!❤️❤️
下一篇
DataWorks