chrome插件v2改版v3步骤

377 阅读3分钟

背景:

  • 2023.1月:chrome商店停止接收现有的Manifest v2版本更新,市面上的大多数v2插件基本停止运行。
  • 2024.6月:Manifest v2版本扩展全部下架。

官网:

developer.chrome.com/docs/extens…

改动点:

  • 以下列举了Manifest v2到Manifest v3的主要改动点,遵守以下改动点即可快速的完成V2到v3的插件转型。

清单改动:

1.版本号修改menifest v3

"manifest_version": 3

2.background替换成service worker

//v3后台页写法 
"background": {
    "service_worker":  "js/background.js"
  },

3.主机权限请求和API权限请求分离

  //API权限
"permissions": [
    "activeTab",
    "storage"
  ],
  //主机权限
 "host_permissions":[
   "*://*.facebook.com/*",
   "*://*.twitter.com/*",
   "*://*.pinterest.com/*",
   "*://*.reddit.com/*"
  ],

4.插件图标API统一

  • 把browser_action对象和page_action对象合并成为了一个action对象
  "action": {
    "default_popup": "popup.html",
    "default_title": "__MSG_extName__",
    "default_icon": {
      "128": "icons/logo.png"
    }
  }

5.content_security_policy(csp)参数填写格式改动和权限改动(对vue开发人员影响较大)

  • 清单格式改动,如下图:

  • 禁止了一些CSP选项的更改,主要的影响是禁止了内联JavaScript和动态代码的执行,导致vue-cli的开发环境无法进行热更新调试,插件会报以下错误。

解决方案:

  • 若使用vue,则需要在正式包中的manifest.json文件中删除content_security_policy参数,但是测试包无法在浏览器中正常使用。
  • 整体插件模板采用vite+vue3的插件开发模板,具体参考

6.清单声明web_accessible_resourses

  • 该参数声明了允许被web网站访问的插件中的资源。
  • v2版本中只需填写哪些文件允许被web访问,v3版本中所需填写参数更加细致,需要确定具体某个对象允许被某个url访问。

API改动:

1.废弃API:

若插件中使用到了以下API,在V3版本中需要进行适当的修改。

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

2.长连接和短连接通讯API废弃

废弃以下API:

  • chrome.extension.sendMessage()
  • chrome.extension.connect()
  • chrome.extension.onConnect
  • chrome.extension.onMessage

快速查找: chrome.extension.sendRequest|chrome.extension.onRequest|chrome.extension.onRequestExternal|chrome.extension.lastError|chrome.extension.getURL|chrome.extension.getExtensionTabs|chrome.tabs.Tab.selected|chrome.tabs.sendRequest|chrome.tabs.getSelected|chrome.tabs.getAllInWindow|chrome.tabs.onSelectionChanged|chrome.tabs.onActiveChanged|chrome.tabs.onHighlightChanged|chrome.extension.sendMessage|chrome.extension.connect|chrome.extension.onConnect|chrome.extension.onMessage

替代方案:

  • chrome.runtime.sendMessage //发消息
  • chrome.runtime.onMessage.addListener // 接收消息
//主动给后台发送消息      
chrome.runtime.sendMessage({
        action"videoDownload"
      },function(res){
})
      );
//后台接收消息
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (typeof msg === "object" && "action" in msg) {
    switch (msg.action) {
        // 保存vod链接
      case "":
        
      return 
    }
  }
}

3.chrome.tabs.executeScript动态注入代码

  • 原有API废弃,改成chrome.scripting.executeScript
  • 相比较v2的写法,v3的写法中需要新增一个tabId属性,因此需要通过getCurrentTab API去获取需要注入的tabId,如以下代码
  • v2写法:
// background.js
chrome.tabs.executeScript({
  file: 'content-script.js'
});
  • v3写法:
// background.js
//首先获取tabId
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();
//调用新的Api注入js文件
chrome.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['content-script.js']
});

4.修改网络请求 采用declarativeNetRequest替代webRequest

Service worker特性

  • v3版本采用service worker代替之前的background页,并有以下几点重要改动:
  1. service worker在闲余时间保持休眠状态,只有被使用的时候才运行,几秒后又会自动关闭。
  2. service worker独立于页面,无法使用window对象,无权访问dom,擅自调用会报错。

  1. service worker不再支持HMLHttpRequest API,因此由XMLHttpRequest方法封装的库都不支持使用,但是仍然支持fetch API,因此调用接口的方式统一改成fetch。
  2. 在service worker运行的时候,在popup页控制台也能看到service worker的控制台打印内容,但并非是执行service worker的代码。