CHROME扩展开发之·迁移到 Manifest V3
迁移到 Manifest V3
让你朝着正确的方向前进。
发表于 2020 年 11 月 9 日,星期一 •更新于2021 年 8 月 13 日,星期五
- 功能概要
- 更新 manifest.json 文件
- 清单版本
- 主机权限
- 内容安全政策
- 动作API统一
- 可通过网络访问的资源
- 代码执行
- 远程托管代码
- 执行任意字符串
- 后台服务人员
- 修改网络请求
- 什么时候可以使用阻塞 webRequest?
- 你如何使用 declarativeNetRequest ?
- 条件权限和 declarativeNetRequest
- 已弃用 API 的日落
本指南为开发人员提供了开始将扩展从 Manifest V2 迁移到 Manifest V3 (MV3) 所需的信息。一些扩展只需要很少的改动就可以使它们符合 MV3,而另一些扩展则需要在一定程度上重新设计。具有 MV2 经验以及正在创建新的 MV3 扩展的开发人员也可能会发现这很有帮助。有关快速参考指南,请参阅迁移清单。
Manifest V3 提供了许多反映我们平台愿景目标的改进。
# 功能概要
使用 MV3 的扩展有许多新特性和功能更改:
- 服务工作者替换背景页面。
- 现在使用新的declarativeNetRequest API处理网络请求修改。
- 不再允许远程托管代码;扩展只能执行包含在其包中的 JavaScript。
- Promise支持已添加到许多方法中,但仍支持回调作为替代方案。(我们最终将支持对所有适当方法的承诺。)
- MV3 中还引入了许多其他相对较小的功能更改。
有关这些更改的更完整说明,请参阅MV3 概述。
# 更新 manifest.json 文件
要使用 MV3 的功能,您需要先更新您的清单文件。自然地,您将清单版本更改为“3”,但您需要在清单文件中更改许多其他内容:主机权限、内容安全策略、操作声明和 Web 可访问资源。
# 清单版本
更改 manifest_version 元素的值是升级扩展的关键。这决定了您使用的是 MV2 还是 MV3 功能集:
// Manifest V2
"manifest_version": 2
// Manifest V3
"manifest_version": 3
# 主机权限
在 MV3 中,您需要将主机权限与其他权限分开指定:
// Manifest V2"permissions": [ "tabs", "bookmarks", "http://www.blogger.com/",],"optional_permissions": [ "*://*/*", "unlimitedStorage"]
// Manifest V3"permissions": [ "tabs", "bookmarks"],"optional_permissions": [ "unlimitedStorage"],"host_permissions": [ "http://www.blogger.com/", "*://*/*"],
您不必host_permissions
为了注入内容脚本而声明内容脚本匹配模式。然而,他们被视为通过Chrome Web Store的审查过程中主机的权限请求。
# 内容安全政策
MV2 中将扩展的内容安全策略(CSP) 指定为字符串;在 MV3 中,它是一个对象,其成员代表替代 CSP 上下文:
// Manifest V2
"content_security_policy": "..."
// Manifest V3
"content_security_policy": { "extension_pages": "...", "sandbox": "..."}
extension_pages
:此政策涵盖您的扩展程序中的页面,包括 html 文件和 Service Worker。
这些页面类型由chrome-extension://
协议提供。例如,扩展程序中的一个页面是chrome-extension://<extension-id>/foo.html
.
sandbox
:此政策涵盖您的扩展程序使用的任何沙盒扩展程序页面。
此外,MV3 不允许对extension_pages
MV2 中允许的某些 CSP 修改进行修改。的script-src,
object-src
,并且worker-src
指示只能有以下值:
self
none
- 任何本地主机源、(
http://localhost
、http://127.0.0.1
或这些域上的任何端口)
CSP 修改sandbox
没有这样的新限制。
# 动作API统一
在 MV2 中,有两种不同的 API 来实现操作:browser_action
和page_action
. 这些 API 在引入时扮演了不同的角色,但随着时间的推移,它们变得多余,因此在 MV3 中我们将它们统一为单个action
API:
// Manifest V2
// manifest.json{ "browser_action": { … }, "page_action": { … }}
// background.jschrome.browserAction.onClicked.addListener(tab => { … });chrome.pageAction.onClicked.addListener(tab => { … });
// Manifest V3
// manifest.json{ "action": { … }}
// background.jschrome.action.onClicked.addListener(tab => { … });
# 可通过网络访问的资源
此更改将扩展资源的访问权限限制为特定站点/扩展。您现在提供了一个对象列表,而不是提供文件列表,每个对象都可以将一组资源映射到一组 URL 或扩展 ID:
// Manifest V2
"web_accessible_resources": [ <files>]
// Manifest V3
"web_accessible_resources": [{ "resources": [<resources>], "matches": [<urls>], "extension_ids": [<keys>], optional "use_dynamic_url": boolean}]
以前,Web 可访问资源列表适用于所有网站和扩展程序,这为指纹识别或无意的资源访问创造了机会。更新后的 API 允许扩展更严格地控制哪些其他站点或扩展可以访问扩展资源。有关使用信息,请参阅Web 可访问资源文档。
# 代码执行
MV3 施加了新的限制,通过平台更改和策略限制的组合来限制扩展执行未经审查的 JavaScript 的能力。
许多扩展不受此更改的影响。但是,如果您的 MV2 扩展执行远程托管脚本、将代码字符串注入页面或在运行时评估字符串,则您需要在迁移到 MV3 时更新代码执行策略。
使用 Manifest V3,该executeScript()
方法也移动到不同的 API。
- MV2: chrome.tabs.executeScript()
- MV3: chrome.scripting.executeScript()。
如果您在代码中的任何位置使用 executeScript(),则需要更新该调用以使用新 API。该insertCSS()
和removeCSS()
方法类似地从chrome.tabs移到chrome.scripting。
# 远程托管代码
远程托管代码是指任何未作为可加载资源包含在扩展包中的代码。例如,以下两种代码都被视为远程托管代码:
- 从远程服务器拉取的 JavaScript 文件
- 在运行时传递给 eval 的代码字符串
在 MV3 中,所有扩展的逻辑都必须与扩展捆绑在一起。您不能再加载和执行远程托管的文件。有多种替代方法可用,具体取决于您的用例和远程托管的原因。两种这样的方法是:
配置驱动的特性和逻辑——在这种方法中,你的扩展在运行时加载远程配置(例如 JSON 文件)并在本地缓存配置。然后,扩展程序使用此缓存配置来决定要启用哪些功能。
使用远程服务外部化逻辑——考虑将应用程序逻辑从扩展程序迁移到您的扩展程序可以调用的远程 Web 服务。(本质上是一种消息传递形式。)这使您能够将代码保密并按需更改代码,同时避免重新提交到 Chrome 网上应用店的额外开销。
# 执行任意字符串
在 Manifest V2 中,可以使用选项对象上的tabs.executeScript
和code
属性执行任意代码字符串。Manifest V3 不允许执行任意代码。为了适应这种需求,扩展开发者可以使用scripting.executeScript
API 来注入静态文件或函数。
静态文件注入scripting.executeScript
几乎与 Tabs API 中使用的相同。旧方法只需要一个文件,而新方法现在需要一个文件数组。
// Manifest V2
// background.jschrome.tabs.executeScript({ file: 'content-script.js'});
// content-script.jsalert('File test alert');
// Manifest V3
// background.jsasync function getCurrentTab() {/* ... */}let tab = await getCurrentTab();
chrome.scripting.executeScript({ target: {tabId: tab.id}, files: ['content-script.js']});
// content-script.jsalert('File test alert');
如果您需要更多动态,新func
属性允许您将函数作为内容脚本注入并使用该args
属性传递变量。请注意,该函数不会像位于内容脚本中那样运行;相反,它的源被发送到目标选项卡并在那里运行。
// Manifest V2
// background.jslet name = 'World!';chrome.tabs.executeScript({ code: `alert('Hello, ${name}!')`});
// Manifest V3
// background.jsasync 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],});
可以在chrome-extensions-samples存储库中找到本节中 Manifest V3 片段的功能版本。请参阅Tabs API 示例以了解getCurrentTab
.
# 后台服务人员
MV2 中的后台页面被 MV3 中的 Service Worker 替换:这是影响大多数扩展的基础性更改。
Service Worker是基于事件的,并且与事件页面一样,它们不会在调用之间持续存在。此更改通常需要进行一些重新设计,需要考虑许多因素:有关其他详细信息,请参阅从后台页面迁移到 Service Workers。
为了帮助迁移过程,从 Chrome 87 开始,MV2 扩展可以使用后台服务工作者。
# 修改网络请求
有一个新的declarativeNetRequest用于网络请求修改,它为webRequest AP 的大部分功能提供了替代方案。
# 什么时候可以使用阻塞 webRequest?
webRequest API的阻塞版本仍然存在于 MV3 中,但它的使用仅限于强制安装的扩展。请参阅 Chrome 企业政策:ExtensionSettings、ExtensionInstallForcelist。
所有其他扩展现在必须使用declarativeNetRequest进行网络请求修改。这将网络请求的实际修改移到 Chrome 浏览器中:扩展程序不再能够读取实际的网络请求,并且在大多数情况下不需要主机权限。
请求重定向和标头修改确实需要用户授予主机权限。
# 你如何使用 declarativeNetRequest ?
您的扩展不是读取请求并以编程方式更改它,而是指定了许多规则,这些规则将一组条件映射到相应的操作。有关规则的更详细说明,请参阅declarativeNetRequest参考文档。
此功能允许内容拦截器和其他请求修改扩展程序在不需要主机权限的情况下实现它们的用例,也不需要读取实际请求。
为了帮助迁移过程,从 Chrome 84 开始,declarativeNetRequest API 可用于 MV2 扩展。
# 条件权限和 declarativeNetRequest
declarativeNetRequest 的大多数用例根本不需要任何主机权限。然而,有些人这样做。
请求重定向和标头修改确实需要用户授予主机权限。
当扩展需要这些用例的主机权限时,我们建议使用“分层”权限策略。这意味着在不使用这些权限的情况下实现扩展的核心功能;将更高级的用例置于可选权限之后。
这种方法允许注重隐私的用户保留这些权限,并仍然使用扩展程序的大部分功能。这意味着开发人员可以实现许多常见用例,例如内容阻止功能,而无需任何主机权限。
# 已弃用 API 的日落
有许多 API 早已被弃用。Manifest V3 最终取消了对这些已弃用 API 的支持。这些包括:
- 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
如果您的扩展使用这些已弃用的 API 中的任何一个,则在迁移到 MV3 时需要进行适当的更改。
最近更新时间: 2021 年 8 月 13 日,星期五 改进文章
http://www.taodudu.cc/news/show-3109757.html
相关文章:
- HTML中属性manifest格式,manifest是啥 MANIFEST文件是什么文件?
- Android 合并清单文件 Merge multiple manifest files
- manifest文件linux,MANIFEST 文件扩展名: 它是什么以及如何打开它?
- Manifest和Repo使用详解
- java jar manifest文件,java打包jar,以及manifest文件使用说明
- repo中manifest解析
- Android Manifest详解
- manifest引用build中的变量
- repo manifest文件
- html5 manifest 安卓,移动APP配置文件 manifest.json 讲解 (附视频)
- 【Docker系列】docker manifest
- java项目生成manifest_使用Maven生成manifest
- docker manifest 使用实战
- manifest使用
- manifest配置
- manifest java_JAR包中的MANIFEST.MF文件详解以及编写规范
- linux中的manifest的作用,Manifest用途
- java 解析 manifest_详解Manifest
- .manifest是什么文件
- Manifest文件详解
- [转]Assembly Manifest 通俗简易手册
- Manifest 使用示例 - Msbuild 工程
- MANIFEST.MF文件详解
- 关于报错信息为A complete log of this run can be found in:
- 求三位数的水仙花数
- 实验三数组
- C语言输出100-1000之内所有的水仙花数字
- C语言基础题-水仙花数
- mysql类似于水仙花_福建水仙花,美名扬天下
- 软件测试周刊(第18期):一个精确的测量胜过一千个专家的意见
CHROME扩展开发之·迁移到 Manifest V3相关推荐
- chrome扩展开发(2)- manifest.json文件简述
一.本文目标 结合具体应用场景,让读者对manifest.json文件的写法和主要属性拥有初步认识. 二.目标读者 chrome扩展开发的初学者,想要先从宏观上了解一下chrome扩展能干哪些事情,而 ...
- Chrome浏览器扩展插件指南:从MV2迁移到Manifest V3
Chrome Web Store于2021年1月已经开始接受Manifest V3扩展的提交.如果你还在使用MV2版本,那么一定要在官方弃用之前,尽快更新到MV3版本. Chrome浏览器从88版本开 ...
- Chrome扩展开发基础教程(附HelloWorld)
1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...
- Chrome扩展开发指南
前言 Chrome 扩展(通常也叫插件)也是软件程序,使用 Web(HTML, CSS, and JavaScript)技术栈开发.允许用户自定义 Chrome 浏览体验.开发者可以通过增加特效或功能 ...
- chrome扩展开发介绍和右键开发
chrome扩展开发 chrome扩展中文文档官网 Chrome浏览器在全球都拥有可观的忠实用户,抛去其占据了浏览器市场的霸主地位不说,其具备了众多的优点,如良好的用户体验,简单的开发规范等等. 归纳 ...
- chrome 扩展开发 - 如何获得iframe中的元素 和 相关问题解答
记一次需求完成的经过,要获取iframe中的元素,然后在页面进行分段跳转和相关操作,途中遇到了几个问题,方便后续自我回忆. 问题一 chrome扩展开发中 Popup页面无法持续保持的问题 [未解决 ...
- chrome 扩展开发手册(一)——准备
chrome Extensions翻译过来就是谷歌扩展,但我们更喜欢叫它谷歌浏览器扩展或chrome扩展. chrome扩展是定制浏览体验的小型软件程序. 它们使用户能够根据个人需求或偏好定制Chro ...
- google扩展开发popup.html,chrome扩展开发问题总结
console.log Chrome扩展分为三部background.html/js,popup.html和content_script.js.background和content_script可以通 ...
- android浏览器插件开发,【转】Chrome扩展开发自己的浏览器插件
本帖最后由 火菩萨 于 2017-6-25 03:24 编辑 不知道分类对不对 不对请管理大大移动一下 wKioL1fiEXCQ9nkKAAEZAaNTxUk841.jpg-wh_651x-s_429 ...
最新文章
- 深度学习核心技术精讲100篇(十二)-DCGAN(对抗生成网络)算法应用及代码实现
- python操作redis集群_python 连接管理作redis集群
- 《scikit-learn》随机森林之回归
- pytorch的torch.cuda.is_available()输出false
- Java程序员必经的实践之路:微服务与SOA架构
- JEPLUS表格高级展示——JEPLUS软件快速开发平台
- 筛选数据库_网络药理学(2)| 使用TCMSP数据库检索中药成分并基于ADME参数进行成分筛选...
- 语音数字信号处理与分析及Matlab实现
- 运营到底是做什么的?
- python输入个人所得税计算_Python实现的个人所得税计算器示例
- HDOJ1233 还是畅通工程(kru)
- JAVA RPC 生产级高可用RPC框架使用分享
- 手机/微信/浏览器的字体设置太大,rem 计算不准确
- 伦敦银走势分析最新,十大国际黄金白银交易平台排名
- python二级证书含金量排名_计算机二级证书含金量有多高?你真的知道吗???...
- 在64位总线下,安装了8G内存条,却显示可用内存不到8G的原因
- 卸载鲁大师后 计算机无法启动项,win7电脑鲁大师开机启动项关闭的图文教程
- 生物信息学入门 GEO芯片数据差异表达分析时需要log2处理的原因
- filebeat7.7.0相关详细配置预览- processors - timestamp
- 2022-2028年中国陕西水果行业市场现状分析及未来前景规划报告
热门文章
- 51单片机——共阳数码管的动态显示(有一个小问题)
- 真机调试鸿蒙HarmonyOS应用步骤(超详细!!!)
- 整理Android SD内存卡中的文件夹
- http://www.cnblogs.com/alcc/p/Allc.html
- Xcode Cloud 是什么
- 开源软件的各大开源协议是什么含义,你知道嘛?
- 看了一半《牛奶可乐经济学》
- 老程序员的10条中肯建议
- 致远a8 java,致远A8协同办公系统poc/seeyon 0day
- 出来做SEO“早晚要还的”