首页 > 解决方案 > 谷歌浏览器/网络浏览器扩展:适配请求

问题描述

我最近为 Chrome 浏览器创建了一个扩展,它只是将调用从一个 URL 重定向到另一个。

所以,我需要在下面添加权限:

"permissions": ["webRequestBlocking", "webRequest", "*://docs.microsoft.com/*"]

为了重定向 URL,我添加了这样的事件处理程序:

chrome.webRequest.onBeforeRequest.addListener(
  (event) => { 
    if ( event.url.includes("/pl-pl/")) {
      return { redirectUrl: event.url.replace("/pl-pl/", "/en-us/") }; 
    }
  },
  {urls: ["*://docs.microsoft.com/*"]},
  ["blocking"]
);

显然,我想捕获对 的调用docs.microsoft,但我指定了两次。

我的问题是:这些规则是否等效?

我对其进行了测试,仅在清单文件中指定它就足够了,但是它们在内部的工作方式是否相同?

或者可能两次指定它会导致双重验证并降低性能?

标签: javascriptgoogle-chrome-extension

解决方案


  1. manifest.json 中的 URL 权限允许扩展通过任何 API 处理这些 URL,而不仅仅是 webRequest,但由于您不需要其他任何东西并且只使用单个 URL 模式,因此您确实可以["<all_urls>"]在 webRequest 侦听器注册中指定为简单起见.

  2. 在这种简单的情况下,在浏览器的本机 C++ 代码中检查两次 URL 对性能的影响不应该被检测到,尤其是与激活 JavaScript 上下文以运行侦听器的任务相比,这会消耗数千倍的 CPU 周期。

潜在的改进:

  • 最快的解决方案是chrome.declarativeWebRequest
    对于这种情况,我猜你需要 RedirectByRegEx 操作。

  • 如果目标是避免重复,您可以使用 chrome.runtime.getManifest:

    {urls: chrome.runtime.getManifest().permissions.filter(p => p.includes('/'))}
    

    唯一的缺陷是"permissions"不需要最后一个*主机,因为它们忽略了路径部分,因此请确保始终将其添加到 manifest.json 中。


推荐阅读