chrome manifest v2 弃用
根据官方通知
2022年1月17日后chrome扩展市场不接受v2扩展。
2023年1月后chrome浏览器不支持v2扩展运行
虽然manifest v3因为保护隐私的原因相对于v2与用户隐私相关的功能大受限制,但拥抱V3似乎是开发者的唯一选择
V2 到 V3 的变化
使用 Manifest V3 的扩展有许多新特性和功能更改:
<code>Service worker
`替换
`Background Page
- 网络请求修改使用新的
<code>declarativentrequest API
来处理。 - 不再允许远程托管代码;扩展只能执行包含在其包中的 JavaScript。
- 许多方法都添加了Promise支持,但仍支持回调作为替代方案。(最终将支持所有Promises)
- Action API整合:Browser Action API 和Page Action APIs被统一为一个单独的Action API。
- Web可访问的资源:资源只对指定的站点和扩展可用。
- 内容安全策略(CSP):现在可以为单个对象中的不同执行上下文指定单独的CSP,并且某些特定的策略是不被允许的。
- executeScript的变化:扩展不能再执行任意字符串,只能执行脚本文件和函数。这种方法也从Tabs API迁移到新的Scripting API。
如何迁移
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。
代码执行
不支持远程代码
包括以下:
- CDN托管的库
- 服务器请求的文件
- eval()在运行时传入的代码字符串
需要将代码引入到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
主要改变(砍了一大刀):
- V2 脚本会始终运行 V3 脚本在不使用时终止
- V2 可访问DOM V3 无法访问DOM
- V2 可以使用 XMLHttpRequest V3 只能使用fetch
全局变量不再持久
因为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