# 对浏览器扩展,什么是MV3?升级MV3有哪些影响? 以下是AI总结的有关MV3的说明。 对Quicker的浏览器扩展来说,最重要的变化是: - 无法再支持“运行后台脚本”功能。 - 对标签页运行自定义脚本,需要开启浏览器的开发者模式。 谷歌官网说明:https://developer.chrome.com/docs/extensions/develop/migrate/what-is-mv3 最新的MV2支持期限说明:https://developer.chrome.com/docs/extensions/develop/migrate/mv2-deprecation-timeline ------- **什么是 MV3 (Manifest V3)?** MV3,全称为 Manifest Version 3,是 Google Chrome 浏览器扩展平台的最新规范版本,Google 将其描述为"浏览器扩展安全、性能和隐私的下一次演进"。你可以把它理解为一套新的规则和 API(应用程序编程接口),用于定义扩展程序如何构建、它们拥有哪些权限以及它们如何与浏览器交互。 推出 MV3 的主要目标(根据 Google 的说法)是为了提升扩展程序的**安全性、隐私性和性能**。它旨在让扩展程序更易于审查,减少滥用潜力,并提高浏览器的整体效率。 基于谷歌的计划,将于2025年6月彻底淘汰基于MV2的浏览器扩展,并在此之前默认禁用这些扩展。 **升级到 MV3 的主要影响:** MV3 引入了多项重大变更,对扩展程序的开发和功能产生了深远影响: 1. **后台脚本 (Background Scripts) 替换为 Service Workers:** - **MV2:** 使用持久的后台页面或事件页面,这些页面可以在扩展程序的生命周期内或在需要时长时间运行。 - **MV3:** 使用 Service Workers。Service Workers 是事件驱动的,意味着它们只在需要响应特定事件(如用户点击按钮、收到消息等)时运行,并在空闲时自动终止。 - **影响:** 这要求开发者改变处理后台任务、管理状态和监听事件的方式。需要长时间运行的任务或依赖持久状态的逻辑需要重新设计。这有助于降低扩展程序的内存占用,但也增加了开发的复杂性。 2. **网络请求拦截方式改变 (webRequest API vs declarativeNetRequest API):** - **MV2:** `webRequest` API 允许扩展程序在运行时动态地、完全地拦截、检查和修改网络请求。这为广告拦截器和隐私工具提供了强大的能力。 - **MV3:** 限制了阻塞版本的 `webRequest` API,并主推 `declarativeNetRequest` API。后者要求开发者预先声明一组规则(规则集),浏览器根据这些规则来处理网络请求(阻止、重定向等),而不是让扩展程序在请求发生时执行任意代码来决定如何处理。 - **影响:** 这是最具争议的变化之一。虽然 `declarativeNetRequest` 在某些情况下性能更好且更隐私(因为它不读取请求内容),但它限制了广告拦截器和其他网络修改工具的灵活性和能力,因为它们无法像以前那样基于复杂的动态逻辑来过滤请求。 3. **禁止执行远程托管代码 (No Remote Hosted Code):**(这一条变更导致无法运行自定义的后台脚本) - **MV2:** 允许扩展程序引用并执行来自远程服务器的 JavaScript 文件。 - **MV3:** **严格禁止**。所有扩展程序执行的代码都必须包含在扩展程序的包内。扩展程序不能再从其自己的服务器或其他地方下载并执行代码。 - **影响:** 这是为了提高安全性,防止扩展程序开发者在用户不知情的情况下偷偷更新恶意代码。但这也限制了一些需要动态加载逻辑或功能的扩展。 4. **内容安全策略 (Content Security Policy - CSP) 的变化:** - MV3 对扩展程序可以使用的 CSP 进行了更严格的限制,特别是关于可以执行的脚本来源。 5. **API 现代化:** - 许多旧的回调式 (Callback-based) API 被现代的基于 Promise 的 API 所取代,这使得异步代码更易于编写和管理。 **对需要执行自定义代码的扩展的特别影响:** 这一点直接关系到你问题中的核心关切。MV3 对“执行自定义代码”施加了严格的限制,具体取决于“自定义代码”的含义: 1. **执行远程服务器上的代码:** - **绝对禁止:** 如上所述,MV3 不允许扩展程序加载并执行来自其服务器或其他远程来源的 JavaScript 文件。如果你的扩展依赖于从服务器动态获取并执行脚本来实现核心功能或更新逻辑,那么这种模式在 MV3 下将不再可行。 - **原因:** 安全性。这是为了防止恶意扩展在通过审核后,通过远程加载的代码引入恶意行为。 - **解决方案:** - 将所有必要的代码逻辑打包到扩展程序内部。 - 可以通过从服务器获取**配置数据**(例如 JSON 文件),然后根据这些数据在**本地已有的代码**中调整行为,但这不能是执行新的代码。 - 对于确实需要动态逻辑的情况,可能需要寻找完全不同的实现方式,或者接受功能上的限制。 2. **执行用户提供的代码 (例如 User Scripts):** - **严格限制:** MV3 对 `eval()` 等能够执行字符串形式代码的函数以及动态创建 `