Я пытаюсь создать пример счетчика, подобный описанному в этом видео: - https://www.youtube.com/watch?v=jyFjFcUD4ps
Однако я обнаружил, что socket.io обновляется только windows после настройка соединения. Итак, я загружу страницу, и счетчик не будет обновляться на этой странице, но если у меня будет открыто другое окно с таким же значением ha sh, то эта страница обновится.
Вот мой клиентский пакет. json:
"name": "socketio-client",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack-dev-server --mode development --config ./webpack.config.js --inline --hot",
"build": "webpack"
},
"babel": {
"presets": [
"env"
]
},
"author": "",
"license": "ISC",
"dependencies": {
"babel-core": "^6.26.3",
"babel-loader": "^8.1.0",
"babel-preset-env": "^1.7.0",
"socket.io-client": "^2.3.0",
"webpack": "^4.43.0",
"webpack-cli": "^3.3.11"
},
"devDependencies": {
"html-webpack-plugin": "^4.3.0",
"webpack-dev-server": "^3.10.3"
}
}
Вот мой индекс. js файл для клиентской стороны: -
import io from 'socket.io-client';
const socket = io('http://localhost:9090');
socket.on('connect', function onConnect() {
console.log('connected');
if (window.location.hash) {
const id = window.location.hash.substring(1);
console.log('hash', id);
socket.on('stats', function onStats(count) {
console.log(count);
document.getElementById('counter').innerHTML = count;
});
socket.emit('hello', { 'hashId': id });
}
});
Вот мой индекс. html страница: -
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body>
<h1>Hit Counter is <span id="counter"></span></h1>
</body>
</html>
Вот мой webpack.config. json: -
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: __dirname + '/src/index.html'
})
]
};
Вот мой серверный пакет. json: -
"name": "socketio-server",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"redis": "^3.0.2",
"socket.io": "^2.3.0"
}
}
И вот мой сервер. js файл (ie мой исполняемый файл на стороне сервера)
const io = require('socket.io')(9090);
const redis = require('redis');
const client = redis.createClient();
io.on('connection', function onConnection(socket) {
console.log('connected');
socket.on('hello', function hello(hashId) {
socket.join(hashId.hashId);
client.incr(hashId.hashId, onUpdate);
function onUpdate(err, count) {
console.log(err);
console.log(count);
socket.to(hashId.hashId).emit('stats', count);
}
});
});
Я использую сервер узла. js on на стороне сервера и на стороне клиента я запускаю npm run start.
Затем я нажимаю следующий URL в другом браузере windows http://localhost: 8080 / # asdf