我正在使用Firefox 48,它应该对WebExtensions很稳定。我已将我的测试应用程序与Socket.IO连接。一旦我关闭弹出窗口,socket.IO连接就会中断。这是代码:
manifest.json
{
"manifest_version": 2,
"name": "myapp",
"version": "1.0",
"browser_action": {
"default_icon": {
"96": "button/icon.png"
},
"default_title": "myapp",
"default_popup": "popup/main.html"
}
"background": {
"scripts": ["myclient.js"]
}
}
main.html
<body>
<script src="/scripts/socket.io.js"></script>
<script src="/scripts/jquery-2.2.4.min.js"></script>
<script src="/myclient.js"></script>
</body>
myclient.js
var address = "localhost";
var client = io("http://" + address + ":17001/");
client.on("message", function () {
$("#test").text("message");
});
我的nodeJS服务器代码
console.log("Server started");
var io = require("socket.io")(17001);
io.on("connection", function (socket) {
var address = socket.request.connection.remoteAddress;
console.log("Someone joined. Socket ID:", socket.id, address);
io.emit("message");
socket.on("disconnect", function () {
console.log("Someone disconnected!");
});
});
如何阻止连接断开连接? TIA
编辑还尝试使用chrome进行相同的扩展,因为我读了here firefox不支持background
,但连接中断的问题仍然存在。
编辑2:按照安德鲁的说法更新了我的代码,仍然无效:
"background": {
"scripts": ["myclient.js", "/scripts/socket.io.js", "/scripts/jquery-2.2.4.min.js"],
"page": "bgp.html"
}
我也通过评论scripts
行来尝试上述代码,但仍无效
bgp.html
<!DOCTYPE html>
<html lang="en">
<body>
<script src="/scripts/socket.io.js"></script>
<script>
var address = "localhost";
var client = io("http://" + address + ":17001/");
</script>
</body>
</html>
如果我从myclient.js
删除连接的创建,则根本不会发生连接!这意味着bgp.html无效。
答案 0 :(得分:1)
看起来您正在后台页面和弹出页面中加载myclient.js,但后台页面中的版本将无效,因为您尚未在其中加载socket.io库。弹出页面确实加载了socket.io,所以它在那里工作,但弹出页面是短暂的,当弹出窗口被解除时,它被卸载(并且所有创建的websockets等都被清除)。
你没有确切地说你正在尝试做什么,但是如果你想要一个长寿命的socket.io连接,你就在背景页面的正确轨道上。最方便的解决方法是创建一个实际的background.html页面并添加<script>
标签来加载socket.io,然后从后台页面创建你的套接字并让弹出页面与后台页面交换消息以访问套接字(使用runtime.sendMessage()或runtime.connect()执行。)
还尝试使用chrome进行相同的扩展,因为我在这里读到firefox不支持背景,但连接中断的问题仍然存在。
您链接到的文档是关于Chrome支持的“后台”权限,但Firefox不支持。 Firefox确实支持webextensions中的后台页面。
为了响应原始问题的第二次编辑,您将关闭,但背景页面的默认内容安全策略不允许使用内联脚本。如果您将代码放入单独的.js文件中并从<script>
标记引用它,那么它应该可以正常工作