chrome 插件扩展开发从V2迁移到V3

/ 0评 / 0

chrome manifest v2 弃用

根据官方通知

2022年1月17日后chrome扩展市场不接受v2扩展。

2023年1月后chrome浏览器不支持v2扩展运行

虽然manifest v3因为保护隐私的原因相对于v2与用户隐私相关的功能大受限制,但拥抱V3似乎是开发者的唯一选择

V2 到 V3 的变化

使用 Manifest V3 的扩展有许多新特性和功能更改:

如何迁移

manifest文件

版本号


{
    ...,
    "manifest_version": 3,
    ...
}

主机权限

<code>permissions``optional_permissions的基础上
新增 <code>host_permissions``host_optional_permissions 两个选项,标识允许访问的域名和可选域名。
在背景页backgroud.js里面或者popup页面走请求时,请求域名的白名单权限,如果没添加的则请求会失败

{
    ...,
    "host_permissions": [
        "https://baidu.com/*"
    ],
    ...
}

Background Scripts更改

<code>Background Scripts` 更改为 `Service Worker

{
    ...,
    "background": {
        "service_worker": "assets/js/background.js"
    },
    ...
}

Action统一

在 Manifest V2 中,有两种不同的 API 来实现操作:"browser_action"和"page_action". 这些 API 在引入时扮演了不同的角色,但随着时间的推移它们变得多余,因此在 Manifest V3 中将它们统一为单个"action"API:

{
  ...
  "action": { ... }
  ...
}

内容安全政策(CSP)

{
  ...
  "content_security_policy": {
    "extension_pages": "...",
    "sandbox": "..."
  }
  ...
}

Web-Accessible Resources

将 web_accessible_resources 数组更改为一个详细描述所有资源的对象,每个对象都可以映射到到一组url或扩展id。下面是V3版本的一个例子:

{
  ...
  "web_accessible_resources": [{
    "resources": [RESOURCE_PATHS],
    "matches": [MATCH_PATTERNS],
    "extension_ids": [EXTENSION_IDS],
    "use_dynamic_url": boolean //optional
  }]
  ...
}

RESOURCE_PATHS: string数组,每个字符串都包含从扩展的根目录到允许访问资源的相对路径。
MATCH_PATTERNS:string数组,每个字符串都包含一个匹配模式,指定允许访问资源的页面。
EXTENSION_IDS:string数组,每个字符串都包含给定扩展的 ID。

代码执行

不支持远程代码

包括以下:

需要将代码引入到service worker或者注入静态脚本,都需要将远程文件下载到本地

注入静态脚本

不再支持 <code> tabs.executeScript() ` 使用 `scripting.executeScript() 方法(需要权限)
需要在mainfest中加入权限

{
  ...
  "permissions": ["scripting"],
  ...
}

通过以下代码即可引入文件,但不支持远程代码

chrome.scripting.executeScript({
  files: ['content-script.js']
});

注入函数

新版本中需要将函数和需要的参数提前声明
旧版本

...
let name = 'World!';
chrome.tabs.executeScript({
  code: `alert('Hello, ${name}!')`
});
...

新版本

...
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

function showAlert(givenName) {
  alert(`Hello, ${givenName}`);
}

let name = 'World';
chrome.scripting.executeScript({
  target: {tabId: tab.id},
  func: showAlert,
  args: [name],
});
...

Background Script 转到 Service Worker

主要改变(砍了一大刀):

全局变量不再持久

因为V3脚本不使用时会终止,因此代码不再持久
以下代码不再有效

var a = 1
chrome.runtime.onMessage.addListener( (message) => {
    a++;    console.log(a);
});

创建Canvas方式更改

由于无法访问DOM,不再支持<code>document.createElement`,改为使用`new OffscreenCanvas

let canvas = new OffscreenCanvas(width, height);

禁用的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

以及未记录的:

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

总结

谷歌这波搞废了 = =,但是市场地位在这,木办法。
参考链接: https://developer.chrome.com/extensions

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注