contentscript.js 和 Chrome 扩展中的另一个 js 文件之间的双向消息传递

Two-way messaging between contentscript.js and another js file in a Chrome extension

除了 contentscript.jsbackground.js 等常用文件外,我正在构建的 Chrome 扩展有一个名为 app.js 的完全任意文件,其中大部分的业务逻辑是集中的。我正在这样组织文件,以将大部分与浏览器无关的逻辑抽象到该 app.js 文件中,并重用用于为其他浏览器构建扩展。

我已经在 manifest.json 中声明了 app.js 文件:

 "background": {
    "scripts": [
      ...,
      "scripts/lib/app.js"
    ]
  },
  "content_scripts": [
    {
      "matches": [
        "http://*/*",
        "https://*/*"
      ],
      "js": [
        "scripts/lib/app.js",
        "scripts/contentscript.js"
      ],
      "run_at": "document_end",
      "all_frames": false
    }
  ]

现在,问题来了。我可以通过 运行 chrome.runtime.sendMessage 或 contentscript.js chrome.runtime.connect 在 contenscript.js 和 app.js 之间发起通信(如 docs 中所述) .但是我想不出一个好的方法来实现相反的通信方式,即如何从 app.js 向 contenscript.js 发送消息。 文档 discusses 仅从网页发送消息,但这不是我想要做的。我想在 Chrome 扩展名中将消息从一个 js 文件发送到另一个文件。从 app.js 发送的 chrome.runtime.sendMessage 似乎没有被 contentscript.js 注册。

更新: 明确地说,我要问的是如何在 "content_script" 部分中声明的两个或多个 js 文件之间建立通信 = 48=]。我可以将消息从一个文件发送到另一个文件 (contenscript.jsapp.js),但不能从第二个文件发送到第一个文件 (app.jscontentscript.jsapp.jsbackground.js)。这让我感到困惑,因为 app.js 与 contentscript.js 在 manifest.json 的同一部分中声明。

因此,您在清单中的同一内容脚本 "bundle" 中定义了 2 个脚本。

这与将两个脚本合并到一个 .js 文件中没有任何区别。他们在相同的上下文中操作并共享所有内容。

因此,您可以在app.js中直接调用函数并使用来自contentscript.js的变量,反之亦然。

如果您需要跨选项卡(或选项卡内的框架)进行通信,则需要使用背景作为代理。没有直接向另一个内容脚本发送消息的函数 context.