chrome.runtime.sendMessage 在点击事件中无法运行(manifest V3 Chrome 扩展程序)

3
注意:我发布了这个问题,有人将它标记为重复问题。在那个问题中,解决方案是检查弹出窗口而不是正常的开发者工具。我的问题不是我不知道要看哪里,而是弹出窗口/背景脚本控制台的行为与我的预期不符。在我的测试中,chrome.runtime.sendMessage没有将消息传递给后台脚本。
第一次构建清单v3扩展(或任何扩展)。
我正在尝试按照谷歌的消息传递文档进行操作。当在扩展程序加载时从我的内容脚本发送消息到我的后台服务工作者时,它能够正常工作。现在我正在尝试找出如何从我的popup.html发送消息到后台服务工作者。我在这个扩展中使用React。
content-script.js
console.log("Content script was loaded");
chrome.runtime.sendMessage({ greeting: "hello" }, function (response) {
  console.log(response.farewell);
});

background.js

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  console.log(
    sender.tab
      ? "from a content script:" + sender.tab.url
      : "from the extension"
  );
  if (request.greeting == "hello") sendResponse({ farewell: "goodbye" });
});

app.js

/*global chrome*/
import React from "react";
import "./App.css";

const onClick = () => {
  console.log("The button was clicked");
  chrome.runtime.sendMessage({ greeting: "hello" }, function (response) {
    console.log(response.farewell);
  });
};

function App() {
  return (
    <div>
      <p>Hello</p>
      <button
        onClick={() => {
          onClick();
        }}
      >
        Click to send message
      </button>
    </div>
  );
}

export default App;

manifest.json

{
  "name": "Chrome Extension Starter Kit",
  "version": "1.0",
  "manifest_version": 3,
  "action": {
    "default_popup": "index.html"
  },

  "background": {
    "service_worker": "background.js"
  },
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content-script.js"]
    }
  ]
}


当我右键点击扩展并选择“检查弹出窗口”,然后从App.js单击按钮时,我会加载和检查扩展后台控制台,并看到以下控制台日志。 enter image description here 每次我在App.js中单击按钮时,我期望看到“goodbye”与“This button was clicked”一起记录在日志中。
这个行为是由于服务工作者变得不活跃吗?我认为服务工作者上的监听器应该会触发它重新变为活跃状态?
我也认为可能是因为我没有将App.js添加为内容脚本,所以我也尝试了这样做,但没有成功。
有人知道如何让来自App.js的按钮与背景脚本通信吗?

根据你的回答,为了让问题有一个合适的MCVE,你需要提到那个外部库,这将使其他使用该库的人更容易找到这个问题。 - wOxxOm
我肯定还在学习如何编写一个好的MCVE,并且现在完全明白了。将记住这一点,以备将来提问之用。感谢您的反馈@wOxxOm! - user12457151
1个回答

3
我搞定了!
我使用了一个谷歌浏览器扩展程序模板库,在 index.js 文件中我发现了一行代码 serviceWorker.unregister();。我将其注释掉后,一切都按预期工作了。

2
请Ping该扩展样板库的作者,并告知他们ManifestV3扩展不应注册或注销服务工作器,因为它会自动发生。 - wOxxOm
好的,只需在 Github 上通知他们即可。 - user12457151
嗨,我只是想知道你在使用哪个样板文件。我正在尝试在弹出窗口中点击以调用后台 onMessage,但它从未触发,即使在 v3 中也是如此,使用 https://github.com/lxieyang/chrome-extension-boilerplate-react。 - TheLearningDev
@TheLearningDev,那正是我正在使用的!我已经成功让它工作了。 - user12457151
你尝试过在v3中使用chrome.tabs.create吗?(如果在后台使用它,我无法让回调函数触发) - TheLearningDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接