Google Chrome商店目前已经停止Manifest V2版本的扩展程序的上架,已上架的V2扩展仍可提交。虽然谷歌说2023年1月才将彻底关停V2,但目前已有部分开发者收到邮件要求一个月内升级v3并提交,否则会被下架处理。

所以需要尽快升级,一起来看下manifest V3做了哪些改动吧。

1.Service worker替换backgroud page/js

  1. 在 manifest.json 中替换 background.page background.scripts 替换为 service_worker ​​​​​​​
    "background": {
        "service_worker": "js/background.js"
     },
  2. background.persistent 从 manifest.json 中删除。

  3. 使用Service worker编写代码。只能注册事件侦听器,不能持续运行。 举个例子:

// 错误用法
const count = 1
chrome.runtime.onMessage.addListener(({ type, name }) => {
  if (type === "add-count") {
    count++;
// 迁移方案
chrome.runtime.onMessage.addListener(({ type, name }) => {
  const count = await chrome.storage.local.get(['count']);
  if (type === "add-count") {
    count++;
    chrome.storage.local.set({'count': count})

   注意:执行环境中是不可以使用localStorage、window变量的

2.使用新的declarativeNetRequest来修改请求  

      在manifestv2扩展中,如果想要修改请求的headers我们会这样做:

chrome.webRequest.onBeforeSendHeaders.addListener(
  function(info) {
    const headers = info.requestHeaders; 
    for (var i = headers.length - 1; i >= 0; --i) {
      var header = headers[i];
      var isRemoveKey = header.name.toLowerCase() === 'foo';
      headers.splice(i, 1); // Remove header 
    return { requestHeaders: headers };
    urls: ['https://a.b.net/api/*'],
  ['blocking', 'requestHeaders', chrome.webRequest.OnBeforeSendHeadersOptions.EXTRA_HEADERS].filter(Boolean)

      在manifest V3中,要实现以上功能迁移方案为 declarativeNetRequest API。通过指定声明性规则来阻止或修改网络请求。这使扩展程序可以修改网络请求,而无需拦截它们并查看其内容,从而提供更多隐私。 

      首先需要在manifest中添加对应权限和指定静态规则集,

"name": "My extension", "declarative_net_request" : { "rule_resources" : [ "id": "ruleset_1", "enabled": true, "path": "rules_1.json" "permissions": [ "declarativeNetRequest", "declarativeNetRequestFeedback",

    然后在目录下新建rules_1.json, 我们还是以修改Headers为例

"id": 1, "priority": 1, "condition": { "regexFilter": "https://XXX.XXX.XXX/api/*", "resourceTypes": [ "xmlhttprequest" "action": { "type": "modifyHeaders", "requestHeaders": [ "header": "h1", "operation": "set", "value": "v4" "header": "foo", "operation": "remove"

 与webRequest API的比较:

  1. ​使用 declarativeNetRequest API 阻止或修改请求一般不需要主机declarativeNetRequest权限
  2. 因为请求不会被扩展进程拦截,所以 declarativeNetRequest 不需要扩展有后台页面,从而减少内存消耗。
  3. ​​​​​​ 在决定请求是被阻止还是重定向时,declarativeNetRequest API 的优先级高于 webRequest API,因为它允许同步拦截。
  4. webRequest API 更灵活,因为允许以编程方式进行修改。

  API更多细节请见:declarativeNetRequest API

3.不再允许执行远程代码,只可以执行插件包内的脚本/CSS

    Manifest V3 的一个关键安全改进是扩展不能加载远程代码,如 JavaScript 或 Wasm 文件。比如:cdn上的脚本、从服务器获取的 JavaScript 文件、 从后端获取的js字符串。 具体来说,所有脚本都必须包含在扩展包中。

  在 Manifest V2 中,可以使用tabs.executeScript()的属性和属性来执行任意代码字符串。Manifest V3 不允许任意代码执行。为了适应这种需求,扩展开发者可以使用该scripting.executeScript()方法注入静态文件或函数 (注意: 没有code参数了)

   使用方式:

"manifest_version": 3, "permissions": ["scripting"],
// Manifest V2
// background.js
chrome.tabs.executeScript({
  file: 'content-script.js'
// content-script.js
alert('File test alert');
// Manifest V3
// background.js
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();
chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['content-script.js']
// content-script.js
alert('File test alert');

   这个修改说实话影响太大了,直接影响了像是油猴这种扩展的核心功能。暂不清楚谷歌到时候会不会放宽一些限制,目前来看不太现实

4.其他修改点​​​​​​​​​​​​​​

  1. 如果有主机权限,需要将主机权限移动到host_permissions manifest.json 中的字段中。
     "host_permissions": [ 
        "<all_urls>"
      ],
  2. browser_action和page_action 统一为了action字段,同样的chrome.browserAction还是chrome.pageAction统一为了chrome.action API

     "action": {
        "default_popup": "pages/popup.html",
        "default_icon": "icons/icon-logo.png",
        "default_title": "Popup"
    

    5.彻底移除的API

    • chrome.extension.getExtensionTabs()
    • chrome.extension.getURL()
    • chrome.extension.lastError
    • chrome.extension.onRequest
    • chrome.extension.onRequestExternal
    • chrome.extension.sendRequest()
    • chrome.tabs.getAllInWindow()
    • chrome.tabs.getSelected()
    • chrome.tabs.onActiveChanged
    • chrome.tabs.onHighlightChanged
    • chrome.tabs.onSelectionChanged
    • chrome.tabs.sendRequest()
    • chrome.tabs.Tab.selected

    参考地址:Google Chrome Extension官方文档

    到目前为止的节目 :check_mark_button: 如果您像我,那么您a)不喜欢煤尘的味道,因此b)甚至从未尝试过Chrome Canary。 :warning: 好吧...废话UI栏中有一个错误按钮。 :check_mark_button: 现在,网站权限和API权限是两个截然不同的东西。 :pile_of_poo: 'action' requires trunk channel or newer, but this is the canary channel :warning: 这一集开始时是关于执行内容脚本的,但是我们必须首先与服务人员打交道。 :check_mark_button: 老式的内联onclick处理程序将无法执行,因为我们的服务人员不是持久性后台脚本。 :warning: 这是多毛的。 Manifest V3在后台没有DOM,因此在img.onload之后不再需要绘制到canvas 。 更新:这可能是一个错误。 这是,以帮助找出答案。) "@babel/core": "^7.12.16", "@babel/eslint-parser": "^7.12.16", "@vue/cli-plugin-babel": "~5.0.0", "@vue/cli-plugin-eslint": "~5.0.0", "@vue/cli-plugin-router": "~5.0.0", "@vue/cli-plugin-vuex": "~5.0.0", "@vue/cli-service": "~5.0.0", "eslint": "^7.32.0", "eslint-plugin-vue": "^8. 所有的扩展程序必须在根目录中包含且只包含一个 manifest.json 文件。这个文件我们通常称为清单文件,里面记录了关于这个扩展程序的所有元数据:使用的文件,需要的权限,谁来处理事件,谁来处理网页等。本章中笔者对 manifest.json 中所有属性进行了总结,并按照重要性划分成了四部分。 自我的谷歌插件从升级V3起,一直遇到一些偶现的一些小bug,定位了好久,是因为background(V3叫做service worker)加载不出导致的。 我在baidu搜了一圈,发现V2有个persistent属性,如果设置为true会始终后台运行,相当于一个独立的服务器页面。 false则会让background 变成了一种短暂加载进内存的脚本,脚本可以多次被线程加载执行,执行完毕后就释放,可以降低谷歌浏览器的内存耗费。 事实上,这么点内存耗费并不是那么重要,所以大多数情况下无脑设置persis 注意:这样做是出于教育目的,并且便于学习如何进行镀Chrome扩展。 其中大部分来自因此欢迎您阅读本文档。 扩展由不同的但相互联系的组件组成。 组件可以包括,,, 和各种逻辑文件。 扩展组件是使用Web开发技术创建的:HTML,CSS和JavaScript。 扩展的组件将取决于其功能,并且可能不需要所有选项。 本教程将构建一个扩展,允许用户更改上任何页面的背景颜色。 它将使用许多核心组件来介绍它们之间的关系。 首先,创建一个新目录来保存扩展名的文件。 完整的扩展程序可以在下载。 扩展从开始。 创建一个名为manifest.json的文件,并包含以下代码,或在下载该文件。 " name " : " Getting Started Example " , " version " : " 1.0 " , " description " Chrome Extension Manifest V3的declarativeNetRequest示例。 在Manifest V3中,修改http请求和响应的方式已更改。 我尝试了新的declarativeNetRequest API,我觉得它们有点困难。 我想要一个简单的用法示例。 这就是为什么我制作这些样品。 公共区域。 谷歌浏览器插件是一种小型的定制浏览器体验的程序,通过插件可以自定义浏览器的一些行为来适合个人的需求,例如上面的查看服务器状态插件。在应用商店中下载下来的插件基本上都是以.crx 为文件后缀,该文件其实就是一个压缩包,包括插件所需要的 HTML,Javascript,CSS 、图片资源等等文件。开发 Chrome 插件只需要会 HTML,Javascript,CSS 就可以动手开发了。 Chrome Web Store于2021年1月已经开始接受Manifest V3扩展的提交。如果你还在使用MV2版本,那么一定要在官方弃用之前,尽快更新到MV3版本。Chrome浏览器从88版本开始支持MV3啦(即Manifest Version 3),目前查看官方文档时默认已经是MV3版本。我们这篇文章主要了解3个问题1、MV2的弃用时间表2、了解MV3的新特性3、如... 大家好,经过一段时间的整理,我的《浏览器扩展插件开发》视频课程做了全新的升级。之前的课程也收到了很多反馈。因为Chrome浏览器扩展发布了最新的Manifest V3标准,简写MV3,也发布了新的路线图。2022年1月份开始不接受新的MV2版本(除了”私人”可见类型),开发者可以更新已经存在的MV2扩展插件2022年6月份不接受新的MV2版本,开发者可以更新已经存在的MV2扩展插件2023年1月份... 本文介绍了Plasmo这个工具,可以用来适应各种的技术框架,让你快速上手插件开发。同时也说了一下chrome插件升级V3需要注意的内容和分享了一些快速入门的优秀文章和文档